/// <summary> /// Advance the game in time /// </summary> public void Advance() { // How much time change has there been? long time = stopwatch.ElapsedMilliseconds; float delta = (time - lastTime) * 0.001f; // Delta time in milliseconds lastTime = time; while (delta > 0) { float step = delta; if (step > 0.05f) { step = 0.05f; } float maxspeed = Math.Max(Math.Abs(player.V.X), Math.Abs(player.V.Y)); if (maxspeed > 0) { step = (float)Math.Min(step, 0.05 / maxspeed); } player.PostStood(stood); // post stood condition variable to GameSprite object player.Advance(step); foreach (Polygon p in world) { p.Advance(step); } foreach (Polygon p in world) { if (collision.Test(player, p)) { float depth = collision.P1inP2 ? collision.Depth : -collision.Depth; player.P = player.P + collision.N * depth; Vector2 v = player.V; if (collision.N.X != 0) { v.X = 0; } if (collision.N.Y != 0) { v.Y = 0; stood = true; } // if (p.ismapped) { score.AddFlyingScore(-1, PlayerFeet().X, PlayerFeet().Y, lastTime); } // IF PLAYER is not on GROUND and touches a MONSTER!!! if (p.isMonster && player.V.Y != 0) { v.Y = 5.5f; stood = false; v.X = -10.5f; player.A = new Vector2(0, -6.8f); if (p.points_to_give > 0) { if (p.is2) { v.X = -125.5f; score.AddFlyingScore(2, PlayerFeet().X, PlayerFeet().Y, lastTime); p.points_to_give += 1; // this will always give points lives.lives_number -= 1; if (lives.lives_number < 1) { lives.lives_number = 0; game_over.gameOver = true; } } if (p.is748) { score.AddFlyingScore(748, PlayerFeet().X, PlayerFeet().Y, lastTime); v.X = -25.5f; lives.lives_number -= 1; if (lives.lives_number < 1) { lives.lives_number = 0; game_over.gameOver = true; } } else if (!p.isBig) { score.AddFlyingScore(100, PlayerFeet().X, PlayerFeet().Y, lastTime); } else { score.AddFlyingScore(500, PlayerFeet().X, PlayerFeet().Y, lastTime); } p.points_to_give -= 1; audio.PNT(); } } else if (p.isMonster && player.V.Y != 0) { v.X = -25.5f; lives.lives_number -= 1; if (lives.lives_number < 1) { lives.lives_number = 0; game_over.gameOver = true; } audio.JMP(); } //if hit monster's right side... you lose/ game over else if (p.isMonster && player.V.X <= 0) { lives.lives_number -= 3; if (lives.lives_number < 1) { lives.lives_number = 0; game_over.gameOver = true; } } player.V = v; player.Advance(0); } } delta -= step; } score.Advance(time); if (!game_over.gameOver) { audio.BGD(); } else { audio.BGD(true); audio.OVR(); } }