public void HandlePlayer(Player p1, Wall w1) { if (p1 != null && w1 != null) { Rectangle p1Rect = p1.CollisionRectangle; Rectangle w1Rect = w1.CollisionRectangle; Vector2 p1Pos = p1.Position; Vector2 p2Pos = w1.Position; Vector2 penetrationDepth = RectangleExtensions.GetIntersectionDepth(p1Rect, w1Rect); penetrationDepth.X = Math.Abs(penetrationDepth.X); penetrationDepth.Y = Math.Abs(penetrationDepth.Y); Vector2 p1MovementDirection, p1Vel; p1MovementDirection = p1Vel = p1.Velocity; p1MovementDirection.X /= (p1MovementDirection.X != 0 ? Math.Abs(p1MovementDirection.X) : 1); p1MovementDirection.Y /= (p1MovementDirection.Y != 0 ? Math.Abs(p1MovementDirection.Y) : 1); Vector2 p2MovementDirection, p2Vel; p2MovementDirection = p2Vel = new Vector2(0,0); p2MovementDirection.X /= (p2MovementDirection.X != 0 ? Math.Abs(p2MovementDirection.X) : 1); p2MovementDirection.Y /= (p2MovementDirection.Y != 0 ? Math.Abs(p2MovementDirection.Y) : 1); if (penetrationDepth.X < penetrationDepth.Y || (p1MovementDirection.Y == 0 && p2MovementDirection.Y == 0)) { float valToMove = penetrationDepth.X; if (p1MovementDirection.X != 0 && p2MovementDirection.X != 0) valToMove = (float)Math.Ceiling(valToMove / 2); p1Pos.X += valToMove * p1MovementDirection.X * -1; p2Pos.X += valToMove * p2MovementDirection.X * -1; p1Vel.X = 0; p2Vel.X = 0; } else if (penetrationDepth.X >= penetrationDepth.Y || (p1MovementDirection.X == 0 && p2MovementDirection.X == 0)) { float valToMove = penetrationDepth.Y; if (p1MovementDirection.Y != 0 && p2MovementDirection.Y != 0) valToMove = (float)Math.Ceiling(valToMove / 2); p1Pos.Y += valToMove * p1MovementDirection.Y * -1; p2Pos.Y += valToMove * p2MovementDirection.Y * -1; p1Vel.Y = 0; p2Vel.Y = 0; } p1.KillPlayer(); p1.Velocity=new Vector2(0,0); } }
/// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); audioPlayer = new AudioPlayer(); background = new Background(Content.Load<Texture2D>("BGTile.png"), new Vector2(worldBounds.Width, worldBounds.Height),new Vector2(0,0)); Texture2D playerNormalSprite = Content.Load<Texture2D>("PLAYER.png"); Texture2D playerUpSprite = Content.Load<Texture2D>("PLAYER_UP.png"); Texture2D playerDownSprite = Content.Load<Texture2D>("PLAYER_DOWN.png"); spBoostSprite = Content.Load<Texture2D>("SPEEDBOOSTS.png"); wallSprite = Content.Load<Texture2D>("WALL2.png"); columnSprite = Content.Load<Texture2D>("LASER.png"); fontTexture = Content.Load<Texture2D>("Font.png"); font = Content.Load<SpriteFont>("HellaFont"); worldLowerBound = 650; worldUpperBound = 50; columnSeperation = 500; firstColumnStartPosition = 1000; player = new Player(playerNormalSprite,playerUpSprite,playerDownSprite, new Vector2(0, 360), new Vector2(1, 0.4f), new Vector2(10, 10), columnSeperation, 3); level = new Level(wallSprite,columnSprite); level.GenerateWorldBounds(worldLowerBound, worldUpperBound, 80);//generate the worlds lower and upper walls which the pipes are attached to level.GenerateColumns(columnSeperation, player.Dimensions, 3, firstColumnStartPosition); playerScore = new UI(font, new Vector2(30, 60), 0, "Score: ", true); playerHiScore = new UI(font, new Vector2(600, 60), 0, "Hi Score: ", true); collisionResolver = new CollisionResolver(); collisionResolver.Add(player); foreach (Wall wall in level.UpperWalls) { collisionResolver.Add(wall); } foreach (Wall wall in level.LowerWalls) { collisionResolver.Add(wall); } foreach (Column column in level.Columns) { List<Wall> columnComponents = column.ColumnComponents; foreach (Wall wall in columnComponents) { collisionResolver.Add(wall); } } }