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); }
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); }
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)); } } }
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; }
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); } }
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; }
public void UpdateY(GameTime gameTime, Map map) { IAccelerator accelerator = jumpActive && kinematicsY.velocity < 0 ? JumpGravityAccelerator : ConstantAccelerator.Gravity; UpdateY(collisionRectangle, accelerator, kinematicsX, kinematicsY, gameTime, map, maybeGroundTile); }
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); }
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); }
/// <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; } }
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; } } }
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; }
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; }
public bool Update(GameTime gameTime, Map map) { flashPeriod = timer.CurrentTime < FlickerTime ? TimeSpan.FromMilliseconds(FlashInterpolation * timer.CurrentTime.TotalMilliseconds + StartPeriod.TotalMilliseconds) : FlickerPeriod; return timer.Active; }
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(); }