//Item collision testing public void TestGroundItem(Item_Base spr, Tile[,] tileData) { int y1 = (int)((spr.Position.Y + spr.Height) / 16); int x1 = (int)(spr.Position.X) / 16; int x2 = (int)(spr.Position.X + 16) / 16; if (tileData[x1, y1].isSolid == true) { spr.airState = Phys_Const.AirState.GROUND; } else if (tileData[x2, y1].isSolid == true) { spr.airState = Phys_Const.AirState.GROUND; } else spr.airState = Phys_Const.AirState.AIR; if (spr.airState == Phys_Const.AirState.GROUND) { spr.Position.Y = (y1 * 16) - spr.Source.Height; spr.vVelocity.Y = 0; } else spr.airState = Phys_Const.AirState.AIR; }
public Level() { for (int i = 0; i < 200; i++) { for (int n = 0; n < 50; n++) { tileData[i, n] = new Tile(); tileData[i, n].isSolid = false; if (n > 25) { tileData[i, n].isSolid = true; tileData[i, n].isVisible = true; } if (n == 26) { tileData[i, n].isTop = true; tileData[i, n].isVisible = true; } } } tileData[20, 25].isSolid = true; tileData[20, 25].isStone = true; tileData[20, 25].isVisible = true; tileData[20, 25].isVisible = true; tileData[51, 25].isSolid = true; tileData[51, 25].isVisible = true; tileData[40, 25].isSolid = true; tileData[51, 20].isSolid = true; tileData[52, 20].isSolid = true; tileData[53, 20].isSolid = true; tileData[40, 25].isStone = true; tileData[51, 25].isStone = true; tileData[51, 20].isStone = true; tileData[52, 20].isStone = true; tileData[53, 20].isStone = true; tileData[40, 25].isVisible = true; tileData[51, 20].isVisible = true; tileData[52, 20].isVisible = true; tileData[53, 20].isVisible = true; blockSprite = new Sprite(); blockSprite.Source = new Rectangle(0, 0, 16, 16); npcMan.currentLevel = this; }
public void TestCeilingItem(Item_Base spr, Tile[,] tileData) { if (spr.vVelocity.Y < 0) { int y1 = (int)((spr.Position.Y) / 16); int x1 = (int)(spr.Position.X) / 16; int x2 = (int)(spr.Position.X + 14) / 16; if (tileData[x1, y1].isSolid == true) { spr.vVelocity.Y = 0; spr.Position.Y = (y1 * 16) + 16; } else if (tileData[x2, y1].isSolid == true) { spr.vVelocity.Y = 0; spr.Position.Y = (y1 * 16) + 16; } } }
public void WallTestNPC(NPC_Base spr, Tile[,] tileData) { int y1 = (int)((spr.Position.Y + (spr.Source.Height - 16)) / 16); //int y2 = (int)(((spr.Position.Y + 16)) / 16); int x1 = (int)(spr.Position.X - 2) / 16; int x2 = (int)(spr.Position.X + 16) / 16; if (spr.isMovingLeft == false) { if (tileData[x2, y1].isSolid == true) { spr.Position.X = (x2 * 16) - 16; spr.HandleCollision(ConstHelper.CollisionDir.RIGHT, "wall"); } } else { if (tileData[x1, y1].isSolid == true) { spr.Position.X = (x1 * 16) + 16; spr.HandleCollision(ConstHelper.CollisionDir.LEFT, "wall"); } } }
public void Update(GameTime time, Tile[,] tileData, List<Block> blocks) { for (int i = 0; i < listNPC.Count; i++) { NPC_Base npc = listNPC[i]; npc.Update(time); if (npc.Collide == true) { TestGroundNPC(npc, tileData); WallTestNPC(npc, tileData); TestCeilingNPC(npc, tileData, blocks); } } }
public void TestGroundNPC(NPC_Base spr, Tile[,] tileData) { int y1 = (int)((spr.Position.Y + spr.Height) / 16); int x1 = (int)(spr.Position.X + 4) / 16; int x2 = (int)(spr.Position.X + 14) / 16; if (tileData[x1, y1].isSolid == true) { spr.airState = ConstHelper.AirState.GROUND; } else if (tileData[x2, y1].isSolid == true) { spr.airState = ConstHelper.AirState.GROUND; } else { if (spr is NPC_Turtle) { NPC_Turtle turtle = (NPC_Turtle)spr; if (turtle.isRed == true && turtle.isShell == false) { if (turtle.airState == ConstHelper.AirState.GROUND) { turtle.isMovingLeft = !turtle.isMovingLeft; turtle.FlipHorz = !turtle.FlipHorz; } } else spr.airState = ConstHelper.AirState.AIR; } else spr.airState = ConstHelper.AirState.AIR; } if (spr.airState == ConstHelper.AirState.GROUND) { spr.Position.Y = (y1 * 16) - spr.Source.Height; spr.vVelocity.Y = 0; } else spr.airState = ConstHelper.AirState.AIR; }
public void TestCeilingNPC(NPC_Base spr, Tile[,] tileData, List<Block> blocks) { if (spr.vVelocity.Y < 0) { int y1 = (int)((spr.Position.Y) / 16); int x1 = (int)(spr.Position.X + 4) / 16; int x2 = (int)(spr.Position.X + 14) / 16; if (tileData[x1, y1].isSolid == true) { spr.vVelocity.Y = 0; spr.Position.Y = (y1 * 16) + 16; } else if (tileData[x2, y1].isSolid == true) { spr.vVelocity.Y = 0; spr.Position.Y = (y1 * 16) + 16; } } foreach (NPC_Base npc in listNPC.ToArray()) { if (npc is NPC_Turtle) { NPC_Turtle turtle = (NPC_Turtle)npc; foreach (Block blockTest in blocks) { if (turtle.GetRect().Intersects(blockTest.GetRect()) && turtle.isShell && turtle.isHeld == false) { blockTest.HandleCollision(ConstHelper.CollisionDir.DOWN, "shell"); } } } } }
public void Update(Tile[,] tileData) { for (int i = 0; i < listItem.Count; i++) { Item_Base item = listItem[i]; item.Update(); if (item.isWithinBlock == false) { TestGroundItem(item, tileData); WallTestItem(item, tileData); TestCeilingItem(item, tileData); } } }