C, PHP, VB, .NET

Дневникът на Филип Петров


* Прототип на FlappyBird с NetBeans

Публикувано на 26 април 2018 в раздел УКИ.

Ще направим прототип на FlappyBird с NetBeans. Това е игра, в която птичка трябва да минава в дупките между препятствия, без да излиза от екрана и без да се блъска в тях. Гравитацията постоянно кара птичето да пада надолу, а ние с бутон на клавиатурата го караме да лети и да се изкачва нагоре.

Първо направете следния дизайн с null layout:

В примера сме сложили големина на игралното поле от 800х620 пиксела. Няма да използваме панел, затова трябва отчетем и лентата на прозореца – ефективната височина на игралното поле ще е по-малка. Черните правоъгълници са картинки с размери 100х600, като ще се налага да излизат извън екрана. Ще правим така, че „дупката“ между тях ще е на произволно място. Самите правоъгълници ще се движат отдясно-наляво. Ако излезнат извън левия ръб на екрана, ще ги връщаме обратно от дясно с нова произволна позиция на дупката между тях.

Нека започнем с пилето (bird от тип JLabel). За нещо ще създадем член променлива raisePixels, с която ще контролираме дали то се издига или не. С член променлива fallPixels ще контролираме силата на гравитацията. Таймерът ще извършва придвижването на птичето:

int raisePixels = 0;
int fallPixels = 5;
 
Timer birdMove = new Timer(30, new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
      bird.setLocation(bird.getX(), bird.getY() - raisePixels + fallPixels);
      if (bird.getY() + bird.getHeight() > 580) {
        gameOver();
      }
   }
});

Методът gameOver() ще реализираме по-късно. Сега трябва да създадем две събитития за натискане на бутон от клавиатурата. Ако има натиснат и задържан бутон, променливата raisePixels трябва да приема положителна стойност – брой пиксели, с които ще се издига. При пускане на бутона, трябва да нулираме стойността на променливата, за да започне да действа отново гравитацията.

private void formKeyPressed(java.awt.event.KeyEvent evt) { 
   raisePixels = 12;
}

private void formKeyReleased(java.awt.event.KeyEvent evt) { 
   raisePixels = 0;
}

Сега ще създадем анимацията на двата правоъгълника. С член променлива holeSize ще контролираме големината на дупката, през която пилето ще може да минава. С trapHolePos ще казваме къде точно (по вертикала) ще започва тази дупка.

int holeSize = 150;
int trapHolePos = (int) (Math.random() * 450 + 20);

Timer trapMover = new Timer(30, new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
      // Преместваме двата правоъгълника наляво
      trapLower.setLocation(trapLower.getX() - 3, trapLower.getY());
      trapUpper.setLocation(trapUpper.getX() - 3, trapUpper.getY());
   
      // Ако излязат от екрана, връщаме ги в десния ъгъл
      if (trapLower.getX() + trapLower.getWidth() < 0) {
        int trapHolePos = (int) (Math.random() * 450 + 20);
        trapLower.setLocation(800, trapHolePos + holeSize);
        trapUpper.setLocation(800, trapHolePos - trapUpper.getHeight());
      }

      // Проверяваме дали пилето се е ударило в долна преграда
      if (bird.getY() + bird.getHeight() > trapLower.getY()
         && bird.getX() < trapLower.getX() + trapLower.getWidth()
         && bird.getX() + bird.getWidth() > trapLower.getX())
      {
        gameOver();
      }
      // Или се е ударило в горна преграда
      if (bird.getY() < trapUpper.getY() + trapUpper.getHeight()
         && bird.getX() < trapUpper.getX() + trapUpper.getWidth()
         && bird.getX() + bird.getWidth() > trapUpper.getX()) 
      {
        gameOver();
      }
   }
});

Инициализираме стойности по подразбиране след достигане на WindowOpened събитие на JFrameForm и стартираме нишките:

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
   birdMove.start();
   trapLower.setLocation(1000, trapHolePos + holeSize);
   trapUpper.setLocation(1000, trapHolePos - trapUpper.getHeight());
   trapMover.start();
}

И накрая реализираме метода gameOver(), който просто спира движението по екрана:

void gameOver() {
  birdMove.stop();
  trapMover.stop();
}

С това играта е готова. Може да я свалите и като готов сорс код от тук: FlappyClone

Допълнителна задача 1. Добавете възможност птичето да може да лети нагоре и при кликане с мишката.

Допълнителна задача 2. Направете система за броене на точки. При всяко преминаване през препятствие давайте по 1 точка. Удачно място за това е моментът, в който премествате препятствието обратно в дясната част на екрана.

Допълнителна задача 3. Направете така, че правоъгълниците да се забързват лека след всяка натрупана точка.

Допълнителна задача 4. Добавете второ препятствие на екрана.

Допълнителна задача 5. Направете дупката на препятствието динамична – да се движи нагоре-надолу (например по синусоида).

Допълнителна задача 6. Добавете възможност за рестартиране на играта след нейния край. Добавете функционалност за „най-добър резултат“, като съхранявайте този резултат във файл така, че при следващо стартиране на програмата да се зарежда от него. Направете си състезание с приятели :)

 



Добави коментар

Адресът на електронната поща няма да се публикува


*