static void Main(string[] args) { Console.BufferHeight = consoleHeight; Console.BufferWidth = consoleWidth; Console.WindowHeight = consoleHeight; Console.WindowWidth = consoleWidth; Console.CursorVisible = false; Console.Title = "Fireship"; menu = Menu.Create(); readHighscores(highscoresNames, highscoresScores); int sleepTime = 0; int maxEnemiesCount = 0; int frameCounter = 0; initializeGame(); Task.Run(keyboardListener); while (gameRunning) { stopWatch.Start(); frameCounter++; drawAllObjects(); Console.ForegroundColor = ConsoleColor.Gray; if (frameCounter == 10) { sceneryObjectList.Add(new SceneryObject()); } if (!gameStart) { if (!showHighScores) { menu.drawTitle(); menu.drawMenu(); } else { menu.drawTitle(); menu.drawHighscores(highscoresNames, highscoresScores); } Thread.Sleep(10); } else { if (!playerDead) { // in-game logic - random enemy movement etc. -------------------- if (frameCounter == 10) { if (maxEnemiesCount < 6) { maxEnemiesCount = 1 + (int)(gameTime.ElapsedMilliseconds / (difficultyTimeIncrement * 3000)); } for (int i = 0; i < maxEnemiesCount; i++) { enemyShipList.Add(new EnemyShip(difficultyTimeIncrement, 3, enemySkins[1])); } } if (frameCounter == 20 && enemyShipList.Count != 0) { double maxMoveSpeed = 0; if (enemyShipList[0] != null) { maxMoveSpeed = enemyShipList[0].getMaxVelocity(); } for (int i = 0; i < enemyShipList.Count; i++) { if (enemyShipList[i].GetType() == typeof(PlayerShip) || enemyShipList[i].GetType() == typeof(Bullet)) { continue; } if (enemyShipList[i].getVelocity().X > 0) { enemyShipList[i].moveLeft(rnd.NextDouble() % (maxMoveSpeed / 4)); } else { enemyShipList[i].moveRight(rnd.NextDouble() % (maxMoveSpeed / 4)); } if (rnd.NextDouble() < (double)gameTime.ElapsedMilliseconds / (difficultyTimeIncrement * 1000) / 100) { ((EnemyShip)enemyShipList[i]).fire(); } } } if (frameCounter == 25) { if (powerUp == null) { if ((double)gameTime.ElapsedMilliseconds % (difficultyTimeIncrement * 1000) > difficultyTimeIncrement * 800) { powerUpAvailable = true; } if (powerUpAvailable) { powerUp = new PowerUp(otherSkins[0], (PlayerShip)playerShipList[0]); powerUpAvailable = false; } } } if (togglePlayerFire == true) { ((PlayerShip)playerShipList[0]).fire(); } checkCollisions(); calculateEnemyMovement(); timeScore = (int)gameTime.ElapsedMilliseconds / 1000; lock (drawingLock) { Console.SetCursorPosition(1, consoleHeight - 2); Console.Write("Score: " + (score + timeScore)); } // ------------------------------------------ } else { menu.drawGameOver(score + timeScore); if (checkHighscores(score + timeScore)) { menu.drawNewHighscore(); if (!newScoreSaved) { string newName = getPlayerName(); lock (drawingLock) { Console.SetCursorPosition(screenWidth / 2 - 12 / 2, 10 + (int)(screenHeight / 2.5)); Console.Write(" "); } addHighscore(score + timeScore, newName); saveHighscores(highscoresNames, highscoresScores); newScoreSaved = true; } } else { Console.ReadKey(true); } initializeGame(); menu.eraseGameOver(); lock (drawingLock) { Console.SetCursorPosition(1, consoleHeight - 2); Console.Write(" "); } } } if (!playerDead) { calculatePlayerMovement(); } calculateSceneryMovement(); sleepTime = frameTime - (int)stopWatch.ElapsedMilliseconds; if (sleepTime > 0) { Thread.Sleep(sleepTime); } if (frameCounter == framesPerSecondTop) { frameCounter = 0; lock (drawingLock) { Console.SetCursorPosition(1, 1); Console.Write("FPS: " + (1000 / stopWatch.ElapsedMilliseconds + 1) + " "); } } stopWatch.Reset(); } }
static void checkCollisions() { int iCount = playerShipList.Count; int jCount = enemyShipList.Count; if (powerUp != null) { if (powerUp.getPosition().Y > 1) { powerUp = null; } } for (int i = 0; i < iCount; i++) { if (powerUp != null && i == 0) { double size1 = playerShipList[i].getSize(); double size2 = powerUp.getSize(); double pos1X = playerShipList[i].getPosition().X; double pos1Y = playerShipList[i].getPosition().Y; double pos2X = powerUp.getPosition().X; double pos2Y = powerUp.getPosition().Y; if ((Math.Abs(pos1X - pos2X) < size1 - 0.0125 || Math.Abs(pos1X - pos2X) < size2 - 0.0125) && (Math.Abs(pos1Y - pos2Y) < size1 - 0.025 || Math.Abs(pos1Y - pos2Y) < size2 - 0.025)) { ((PlayerShip)playerShipList[i]).upgrade(powerUp.getShape()); eraseObject(powerUp); powerUp = null; } } for (int j = 0; j < jCount; j++) { double size1 = playerShipList[i].getSize(); double size2 = enemyShipList[j].getSize(); double pos1X = playerShipList[i].getPosition().X; double pos1Y = playerShipList[i].getPosition().Y; double pos2X = enemyShipList[j].getPosition().X; double pos2Y = enemyShipList[j].getPosition().Y; if ((Math.Abs(pos1X - pos2X) < size1 - 0.0125 || Math.Abs(pos1X - pos2X) < size2 - 0.0125) && (Math.Abs(pos1Y - pos2Y) < size1 - 0.025 || Math.Abs(pos1Y - pos2Y) < size2 - 0.025)) { if (i == 0) { playerDead = true; } else { if (enemyShipList[j].GetType() == typeof(EnemyShip) && playerShipList[i].GetType() == typeof(Bullet)) { if (((EnemyShip)enemyShipList[j]).takeDamage(((Bullet)playerShipList[i]).getDamage()) <= 0) { score += 5; eraseObject(enemyShipList[j]); enemyShipList.RemoveAt(j); j--; jCount--; } } eraseObject(playerShipList[i]); playerShipList.RemoveAt(i); i--; iCount--; } } } } }