CodeGym /Java блог /Случаен /Раздел за игри в CodeGym: Обработка на събития
John Squirrels
Ниво
San Francisco

Раздел за игри в CodeGym: Обработка на събития

Публикувано в групата
„Игри“ от CodeGym е нов раздел с големи интересни задачи, където създавате свои собствени версии на популярни игри. Всичко е просто: всеки проект за игра е разделен на подзадачи. Изпълнете ги един по един и играта е готова. Можете да го споделите в социалните мрежи и да поканите приятелите си да играят. Раздел „Игри“ в CodeGym: Обработка на събития – 1В тази статия ще опишем подробно методите за обработка на събития , използвани за писане на игри.

1. Работа с мишката

Двигателят на играта има два метода за работа с мишката:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

Вие просто декларирате тези методи във вашия клас, който наследява Game, и добавяте Howъвто искате code към тях. Двигателят на играта ще ги извика, когато потребителят щракне върху бутоните на мишката.
  1. onMouseLeftClick(int x, int y)— извиква се от двигателя при щракване с левия бутон на мишката. Неговите параметри са координатите на клетката на игралното поле, където е настъпило щракването. Горната лява клетка има координати (0, 0). Трябва да отмените този метод, за да го използвате.

  2. onMouseRightClick(int x, int y)— извиква се при натискане на десния бутон на мишката. Този метод работи като onMouseLeftClick(int x, int y)метода.

Ето пример за използване на тези методи:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onMouseLeftClick(int x, int y) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        setCellValue(x, y, "");
    }
}

2. Работа с клавиатурата

Двигателят на играта има два метода за работа с клавиатурата:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

Ако искате нещо да се случи, когато потребителят натисне клавиш, декларирайте тези методи във вашия клас, който наследява играта, и добавете своя code към тях. Двигателят на играта ще ги извика, когато потребителят натисне or пусне клавиш.
  1. onKeyPress(Key key)— извиква се при натискане на произволен клавиш. Ключовият параметър е натиснатият клавиш (or Key.UNKNOWN).

  2. onKeyReleased(Key key)— извиква се при отпускане на произволен клавиш. Ключовият параметър е съответният ключ (or Key.UNKNOWN).

Ето пример за използване на тези методи:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onKeyPress(Key key) {
        // When the space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
важно! В текущата version на двигателя на играта, типът ключ има ограничен набор от девет стойности:
Стойност Клавиш, натиснат от потребителя
Ключ.ENTER Потребителят натисна Enter
Ключ.БЯГСТВО Потребителят натисна Esc
Ключ.ПАУЗА Потребителят натисна пауза
Key.SPACE Потребителят натисна интервал
Ключ.НАЛЯВО Потребителят натисна клавиша със стрелка наляво
Ключ. НАДЯСНО Потребителят натисна клавиша със стрелка надясно
Key.UP Потребителят натисна клавиша със стрелка нагоре
Ключ НАДОЛУ Потребителят натисна клавиша надолу
Ключ.НЕИЗВЕСТЕН Потребителят е натиснал клавиш, различен от тези по-горе

3. Работа с таймера

Много игри се случват в реално време, т.е. дори ако потребителят не направи нищо, събитията продължават да се случват в играта. За да ви позволим да реализирате такива игри, ние добавихме таймер към двигателя на играта. Работи по следния начин: включвате таймера и задавате интервала на таймера. Например 500 мorсекунди. След това на всеки половин секунда двигателът на играта извиква onTurnTimer()метода. Отново и отново завинаги - докато таймерът не бъде изключен. И така, How използвате таймера?
  1. Включете таймера.

    За да направите това, има специален void setTurnTimer(int timeMs)метод. Методът приема като аргумент интервала между извикванията в мorсекунди (1 мorсекунда = 1/1000 секунда). Трябва да го извикате само веднъж и двигателът на играта ще започне да извиква метода onTurn()на всеки мorсекунди.

  2. Заменете метода onTurn(int).

    За да направите това, трябва да декларирате void onTurn(int step)метод в класа, който наследява Game. Този метод ще бъде извикан от двигателя на играта. Нещо повече, с всяко повикване двигателът на играта ще предаде на метода последователен идентификатор за повикването (1, 2, 3, …).

  3. Изключете таймера.

    Ако таймерът вече не е необходим, например когато потребителят завърши играта, можете да го изключите. За да направите това, просто трябва да извикате stopTurnTimer()метода.

  4. Ускорете or сменете таймера.

    В някои игри скоростта, с която се случват събития, непрекъснато се ускорява, така че би било удобно да ускорим нашия таймер (намалете времето между повикванията). Нищо не може да бъде по-лесно: обадете се setTurnTimer(int timeMs)отново с нова стойност и времето между onTurn()обажданията ще се промени.

Например:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
    …
    @Override
    public void initialize() {
    	// Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   // Turn on the timer, the interval between calls is 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

        if (step % 2 == 1) {
            // If this call is odd, set the cell background to red
            setCellColor(1, 1, Color.RED);
        } 
        else {
            // If this call is even, set the cell background to blue
            setCellColor(1, 1, Color.BLUE);

        }
    }
    …
}
В този прост пример създадохме поле, което е 3 клетки x 3 клетки. След това стартирахме таймер, който ще извиква onTurn()метода на всеки половин секунда. На всеки половин секунда цветът на клетката ще се променя, но съдържанието й няма да се променя. След 50 секунди цветът вече няма да се промени. Това е всичко за сега! Ако искате да научите повече за раздела „Игри“, ето полезна documentация, която може да ви помогне:
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION