Exemple #1
0
 protected void UpdateX(ICollisionRectangle collisionRectangle,
     IAccelerator accelerator,
     Kinematics kinematicsX, Kinematics kinematicsY,
     GameTime gameTime, Map map)
 {
     Update(collisionRectangle, accelerator,
         kinematicsX, kinematicsY,
         gameTime, map,
         null,
         kinematicsX, AxisType.XAxis);
 }
Exemple #2
0
 protected void UpdateY(ICollisionRectangle collisionRectangle,
     IAccelerator accelerator,
     Kinematics kinematicsX, Kinematics kinematicsY,
     GameTime gameTime, Map map,
     BitArray maybeGroundTile)
 {
     Update(collisionRectangle, accelerator,
         kinematicsX, kinematicsY,
         gameTime, map,
         maybeGroundTile,
         kinematicsY, AxisType.YAxis);
 }
Exemple #3
0
 public void Update(GameTime gameTime, Map map)
 {
     for (int i = 0; i < pickups.Count;)
     {
         if (pickups.ElementAt(i).Update(gameTime, map))
         {
             i++;
         }
         else
         {
             pickups.Remove(pickups.ElementAt(i));
         }
     }
 }
Exemple #4
0
 CollisionInfo? TestMapBouncingCollision(Map map, Rectangle rectangle,
     TileInfo.SideType direction, BitArray maybeGroundTile)
 {
     List<CollisionTile> tiles = map.GetCollidingTiles(rectangle, direction);
     CollisionInfo? result = null;
     for (int i = 0; i < tiles.Count; i++)
     {
         TileInfo.SideType side = TileInfo.OppositeSide(direction);
         GameUnit perpendicularPosition;
         if (TileInfo.Vertical(side))
         {
             perpendicularPosition = rectangle.Center.X;
         }
         else
         {
             perpendicularPosition = rectangle.Center.Y;
         }
         GameUnit leadingPosition = rectangle.Side(direction);
         bool shouldTestSlopes = TileInfo.Vertical(side);
         TestCollisionInfo testInfo = tiles[i].TestCollision(side, perpendicularPosition,
             leadingPosition, shouldTestSlopes);
         if (testInfo.isColliding)
         {
             bool shouldReplaceResult = true;
             if (result.HasValue)
             {
                 shouldReplaceResult = TileInfo.IsMin(side) ?
                     testInfo.position < result.Value.position :
                     testInfo.position > result.Value.position;
             }
             if (shouldReplaceResult)
             {
                 CollisionInfo info = new CollisionInfo(testInfo.position, tiles[i].Position, tiles[i].TileType);
                 result = info;
             }
         }
     }
     return result;
 }
Exemple #5
0
        private void Update(ICollisionRectangle collisionRectangle,
            IAccelerator accelerator,
            Kinematics kinematicsX, Kinematics kinematicsY,
            GameTime gameTime, Map map,
            BitArray maybeGroundTile,
            Kinematics kinematics, AxisType axis)
        {
            Func<Map, Rectangle, TileInfo.SideType, BitArray, CollisionInfo?> testMapCollisionFunc;
            if (collisionType == CollisionType.BouncingCollision)
            {
                testMapCollisionFunc = TestMapBouncingCollision;
            }
            else
            {
                testMapCollisionFunc = TestMapStickyCollision;
            }

            accelerator.UpdateVelocity(kinematics, gameTime);
            GameUnit delta = kinematics.velocity * (float)gameTime.ElapsedGameTime.TotalMilliseconds;

            TileInfo.SideType direction = axis == AxisType.XAxis ?
                (delta > 0 ? TileInfo.SideType.RightSide : TileInfo.SideType.LeftSide) :
                (delta > 0 ? TileInfo.SideType.BottomSide : TileInfo.SideType.TopSide);
            CollisionInfo? maybeInfo = testMapCollisionFunc(map,
                collisionRectangle.Collision(direction, kinematicsX.position, kinematicsY.position, delta),
                direction, maybeGroundTile);

            if (maybeInfo.HasValue)
            {
                kinematics.position = maybeInfo.Value.position - collisionRectangle.BoundingBox.Side(direction);
                debugCollidingTiles.Add(maybeInfo.Value.tilePosition);
                OnCollision(direction, true, maybeInfo.Value.tileType);
            }
            else
            {
                kinematics.position += delta;
                OnDelta(direction);
            }

            maybeInfo = null;
            TileInfo.SideType oppositeDirection = TileInfo.OppositeSide(direction);
            maybeInfo = testMapCollisionFunc(map,
                collisionRectangle.Collision(oppositeDirection, kinematicsX.position, kinematicsY.position, 0),
                oppositeDirection, null);

            if (maybeInfo.HasValue)
            {
                kinematics.position = maybeInfo.Value.position - collisionRectangle.BoundingBox.Side(oppositeDirection);
                debugOppositeCollidingTiles.Add(maybeInfo.Value.tilePosition);
                OnCollision(oppositeDirection, false, maybeInfo.Value.tileType);
            }
        }
Exemple #6
0
 CollisionInfo? TestMapStickyCollision(Map map, Rectangle rectangle,
     TileInfo.SideType direction, BitArray maybeGroundTile)
 {
     List<CollisionTile> tiles = map.GetCollidingTiles(rectangle, direction);
     for (int i = 0; i < tiles.Count; i++)
     {
         TileInfo.SideType side = TileInfo.OppositeSide(direction);
         GameUnit perpendicularPosition;
         if (TileInfo.Vertical(side))
         {
             perpendicularPosition = rectangle.Center.X;
         }
         else
         {
             perpendicularPosition = rectangle.Center.Y;
         }
         GameUnit leadingPosition = rectangle.Side(direction);
         bool shouldTestSlopes = TileInfo.Vertical(side);
         TestCollisionInfo testInfo = tiles[i].TestCollision(side, perpendicularPosition,
             leadingPosition, shouldTestSlopes);
         if (testInfo.isColliding)
         {
             CollisionInfo info = new CollisionInfo(testInfo.position, tiles[i].Position, tiles[i].TileType);
             return info;
         }
         else if (maybeGroundTile != null && direction == TileInfo.SideType.BottomSide)
         {
             BitArray tallSlope = TileInfo.CreateTileType();
             tallSlope.Set((int)TileInfo.TileFlag.Slope, true);
             tallSlope.Set((int)TileInfo.TileFlag.TallSlope, true);
             if ((maybeGroundTile[(int)TileInfo.TileFlag.Slope] && tiles[i].TileType[(int)TileInfo.TileFlag.Slope]) ||
                 (maybeGroundTile[(int)TileInfo.TileFlag.Wall] &&
                 (tallSlope.And(tiles[i].TileType).Equals(tallSlope))))
             {
                 CollisionInfo info = new CollisionInfo(testInfo.position, tiles[i].Position, tiles[i].TileType);
                 return info;
             }
         }
     }
     return null;
 }
Exemple #7
0
        public void UpdateY(GameTime gameTime, Map map)
        {
            IAccelerator accelerator = jumpActive && kinematicsY.velocity < 0 ? JumpGravityAccelerator : ConstantAccelerator.Gravity;

            UpdateY(collisionRectangle, accelerator, kinematicsX, kinematicsY, gameTime, map, maybeGroundTile);
        }
Exemple #8
0
        public void UpdateX(GameTime gameTime, Map map)
        {
            IAccelerator accelerator;
            if (OnGround)
            {
                if (accelerationX == 0)
                {
                    accelerator = FrictionAccelerator;
                }
                else if (accelerationX < 0)
                {
                    accelerator = WalkingAccelerators.negative;
                }
                else
                {
                    accelerator = WalkingAccelerators.positive;
                }
            }
            else
            {
                if (accelerationX == 0)
                {
                    accelerator = ZeroAccelerator.Zero;
                }
                else if (accelerationX < 0)
                {
                    accelerator = AirAccelerators.negative;
                }
                else
                {
                    accelerator = AirAccelerators.positive;
                }
            }

            UpdateX(collisionRectangle, accelerator, kinematicsX, kinematicsY, gameTime, map);
        }
Exemple #9
0
        public void Update(GameTime gameTime, Map map)
        {
            sprites[SpriteState].Update();

            playerHealth.Update(gameTime);

            walkingAnimation.Update();

            polarStar.UpdateProjectiles(gameTime, map, particleTools);

            UpdateX(gameTime, map);
            UpdateY(gameTime, map);

            experienceText.Update(gameTime);
            experienceText.SetPosition(CenterX, CenterY);
        }
Exemple #10
0
        /// <summary>
        /// Returns true if projectile is still alive
        /// </summary>
        /// <param name="gameTime"></param>
        /// <returns>True if projectile is still alive</returns>
        public bool Update(GameTime gameTime, Map map, ParticleTools particleTools)
        {
            offset += (float)gameTime.ElapsedGameTime.TotalMilliseconds * ProjectileSpeed;

            TileInfo.SideType direction = TileInfo.FromFacing(horizontalDirection, verticalDirection);
            Rectangle rectangle = CollisionRectangle;
            List<CollisionTile> collidingTiles = map.GetCollidingTiles(rectangle, direction);
            for (int i = 0; i < collidingTiles.Count; i++)
            {
                TileInfo.SideType side = TileInfo.OppositeSide(direction);
                GameUnit perpendicularPosition = TileInfo.Vertical(side) ?
                    rectangle.Center.X : rectangle.Center.Y;
                GameUnit leadingPosition = rectangle.Side(direction);
                bool shouldTestSlopes = true;
                TestCollisionInfo testInfo = collidingTiles[i].TestCollision(side, perpendicularPosition,
                    leadingPosition, shouldTestSlopes);
                if (testInfo.isColliding)
                {
                    GameUnit collisionX;
                    if (TileInfo.Vertical(side))
                    {
                        collisionX = perpendicularPosition;
                    }
                    else
                    {
                        collisionX = testInfo.position;
                    }
                    GameUnit collisionY;
                    if (TileInfo.Vertical(side))
                    {
                        collisionY = testInfo.position;
                    }
                    else
                    {
                        collisionY = perpendicularPosition;
                    }
                    particleTools.FrontSystem.AddNewParticle(ProjectileWallParticle.Create(particleTools.Content,
                        collisionX - Units.HalfTile, collisionY - Units.HalfTile));
                    return false;
                }
            }
            if (!alive)
            {
                return false;
            }
            else if (offset >= ProjectileMaxOffsets[gunLevel - 1])
            {
                particleTools.FrontSystem.AddNewParticle(ProjectileStarParticle.Create(particleTools.Content, X, Y));
                return false;
            }
            else
            {
                return true;
            }
        }
Exemple #11
0
 public void UpdateProjectiles(GameTime gameTime, Map map, ParticleTools particleTools)
 {
     if (projectileA != null)
     {
         if (!projectileA.Update(gameTime, map, particleTools))
         {
             projectileA = null;
         }
     }
     if (projectileB != null)
     {
         if (!projectileB.Update(gameTime, map, particleTools))
         {
             projectileB = null;
         }
     }
 }
Exemple #12
0
        public static Map CreateSlopeTestMap(ContentManager Content)
        {
            Map map = new Map();
            map.backdrop = new FixedBackdrop("bkBlue", Content);

            TileUnit numRows = 15;
            TileUnit numCols = 20;

            map.tiles = new List<List<Tile>>();
            for (int i = 0; i < numRows; i++)
            {
                map.backgroundTiles.Add(new List<Sprite>());
                map.tiles.Add(new List<Tile>());
                for (int j = 0; j < numCols; j++)
                {
                    map.backgroundTiles[i].Add(null);
                    map.tiles[i].Add(new Tile());
                }
            }

            BitArray tmp = TileInfo.CreateTileType();
            tmp.Set((int)TileInfo.TileFlag.Wall, true);
            Tile wallTile = new Tile(tmp, new Sprite(Content, "Stage/PrtCave", Units.TileToPixel(1), 0, Units.TileToPixel(1), Units.TileToPixel(1)));
            Tile[] slopeTiles = new Tile[(int)SlopeTiles.NumSlopes];
            for (int i = 0; i < (int)SlopeTiles.NumSlopes; i++)
            {
                BitArray a = TileInfo.CreateTileType();
                a.Set((int)TileInfo.TileFlag.Slope, true);
                a.Set(i / 2 % 2 == 0 ? (int)TileInfo.TileFlag.LeftSlope : (int)TileInfo.TileFlag.RightSlope, true);
                a.Set(i / 4 == 0 ? (int)TileInfo.TileFlag.TopSlope : (int)TileInfo.TileFlag.BottomSlope, true);
                a.Set((i + 1) / 2 % 2 == 0 ? (int)TileInfo.TileFlag.TallSlope : (int)TileInfo.TileFlag.ShortSlope, true);
                slopeTiles[i] = new Tile(a, new Sprite(Content, "Stage/PrtCave",
                    Units.TileToPixel((uint)(2 + i % 4)), Units.TileToPixel((uint)(i / 4)),
                    Units.TileToPixel(1), Units.TileToPixel(1)));
            }
            TileUnit row = 11;
            TileUnit col;
            for (col = 0; col < numCols; col++)
            {
                map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col)] = wallTile;
            }
            row--;
            col = 0;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.LBT];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBT];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.LBS];
            col++;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBS];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBT];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.LBT];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.LBS];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBS];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBT];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBS];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBT];
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col++)] = wallTile;
            col++;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RBS];
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = wallTile;
            col = 0;
            row -= 3;
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = wallTile;
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.LTT];
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.LTS];
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RTS];
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = slopeTiles[(int)SlopeTiles.RTT];
            map.tiles[Convert.ToInt32(row - 1)][Convert.ToInt32(col)] = wallTile;
            map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col++)] = wallTile;
            return map;
        }
Exemple #13
0
        public static Map CreateTestMap(ContentManager Content)
        {
            Map map = new Map();
            map.backdrop = new FixedBackdrop("bkBlue", Content);

            TileUnit numRows = 15;
            TileUnit numCols = 20;

            map.tiles = new List<List<Tile>>();
            for (int i = 0; i < numRows; i++)
            {
                map.backgroundTiles.Add(new List<Sprite>());
                map.tiles.Add(new List<Tile>());
                for (int j = 0; j < numCols; j++)
                {
                    map.backgroundTiles[i].Add(null);
                    map.tiles[i].Add(new Tile());
                }
            }

            Sprite sprite = new Sprite(Content, "Stage/PrtCave", Units.TileToPixel(1), 0, Units.TileToPixel(1), Units.TileToPixel(1));
            BitArray tmp = TileInfo.CreateTileType();
            tmp.Set((int)TileInfo.TileFlag.Wall, true);
            Tile tile = new Tile(tmp, sprite);
            TileUnit row = 11;
            for (TileUnit col = 0; col < numCols; col++)
            {
                map.tiles[Convert.ToInt32(row)][Convert.ToInt32(col)] = tile;
            }
            map.tiles[10][5] = tile;
            map.tiles[9][4] = tile;
            map.tiles[8][3] = tile;
            map.tiles[7][2] = tile;
            map.tiles[10][3] = tile;

            Sprite chainTop = new Sprite(Content, "Stage/PrtCave", Units.TileToPixel(11), Units.TileToPixel(2),
                Units.TileToPixel(1), Units.TileToPixel(1));
            Sprite chainMiddle = new Sprite(Content, "Stage/PrtCave", Units.TileToPixel(12), Units.TileToPixel(2),
                Units.TileToPixel(1), Units.TileToPixel(1));
            Sprite chainBottom = new Sprite(Content, "Stage/PrtCave", Units.TileToPixel(13), Units.TileToPixel(2),
                Units.TileToPixel(1), Units.TileToPixel(1));

            map.backgroundTiles[8][2] = chainTop;
            map.backgroundTiles[9][2] = chainMiddle;
            map.backgroundTiles[10][2] = chainBottom;
            return map;
        }
        public bool Update(GameTime gameTime, Map map)
        {
            sprite.Update();

            UpdateX(CollisionRectangles[(int)size], Friction,
                kinematicsX, kinematicsY, gameTime, map);
            UpdateY(CollisionRectangles[(int)size], ConstantAccelerator.Gravity,
                kinematicsX, kinematicsY, gameTime, map, null);
            return timer.Active;
        }
Exemple #15
0
 public bool Update(GameTime gameTime, Map map)
 {
     flashPeriod = timer.CurrentTime < FlickerTime ?
         TimeSpan.FromMilliseconds(FlashInterpolation * timer.CurrentTime.TotalMilliseconds + StartPeriod.TotalMilliseconds) :
         FlickerPeriod;
     return timer.Active;
 }
Exemple #16
0
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(graphics.GraphicsDevice);

            frontParticleSystem = new ParticleSystem();
            entityParticleSystem = new ParticleSystem();
            particleTools = new ParticleTools(frontParticleSystem, entityParticleSystem, Content);
            player = new Player(Content, particleTools, Units.TileToGame(ScreenWidth / 2), Units.TileToGame(ScreenHeight / 2));
            damageTexts.AddDamageable(player);
            bat = new FirstCaveBat(Content, Units.TileToGame(7), Units.TileToGame(ScreenHeight / 2 + 1));
            damageTexts.AddDamageable(bat);
            map = Map.CreateSlopeTestMap(Content);

            pickups.Add(new PowerDoritoPickup(Content, bat.CenterX, bat.CenterY, PowerDoritoPickup.SizeType.Medium));
            pickups.Add(new PowerDoritoPickup(Content, bat.CenterX, bat.CenterY, PowerDoritoPickup.SizeType.Medium));
            pickups.Add(new PowerDoritoPickup(Content, bat.CenterX, bat.CenterY, PowerDoritoPickup.SizeType.Medium));
            base.LoadContent();
        }