CodeGym /Blog Java /Random-PL /Sekcja gier na CodeGym: Obsługa wydarzeń
John Squirrels
Poziom 41
San Francisco

Sekcja gier na CodeGym: Obsługa wydarzeń

Opublikowano w grupie Random-PL
„Gry” od CodeGym to nowy dział z dużymi ciekawymi zadaniami, w których tworzysz własne wersje popularnych gier. To proste: każdy projekt gry jest podzielony na podzadania. Uzupełnij je jeden po drugim i gra jest skończona. Możesz udostępnić go w sieciach społecznościowych i zaprosić znajomych do gry. Sekcja „Gry” w CodeGym: obsługa zdarzeń — 1W tym artykule opiszemy szczegółowo metody obsługi zdarzeń używane do pisania gier.

1. Praca z myszką

Silnik gry ma dwie metody pracy z myszką:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

Po prostu deklarujesz te metody w swojej klasie Game, która dziedziczy i dodajesz do nich dowolny kod. Silnik gry wywoła je, gdy użytkownik kliknie przyciski myszy.
  1. onMouseLeftClick(int x, int y)— wywoływana przez silnik po kliknięciu lewym przyciskiem myszy. Jego parametrami są współrzędne komórki pola gry, w której nastąpiło kliknięcie. Górna lewa komórka ma współrzędne (0, 0). Aby użyć tej metody, musisz ją zastąpić.

  2. onMouseRightClick(int x, int y)— wywoływana po kliknięciu prawym przyciskiem myszy. Ta metoda działa jak onMouseLeftClick(int x, int y)metoda.

Oto przykład użycia tych metod:

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. Praca z klawiaturą

Silnik gry ma dwie metody pracy z klawiaturą:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

Jeśli chcesz, aby coś się stało, gdy użytkownik naciśnie klawisz, zadeklaruj te metody w swojej klasie, która dziedziczy Game, i dodaj do nich swój kod. Silnik gry wywoła je, gdy użytkownik naciśnie lub zwolni klawisz.
  1. onKeyPress(Key key)— wywoływana po naciśnięciu dowolnego klawisza. Kluczowym parametrem jest wciśnięty klawisz (lub Klucz.NIEZNANY).

  2. onKeyReleased(Key key)— wywoływana po zwolnieniu dowolnego klawisza. Kluczowym parametrem jest odpowiedni klucz (lub Klucz.NIEZNANY).

Oto przykład użycia tych metod:

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);
        }
    }
}
Ważny! W obecnej wersji silnika gry typ klucza ma ograniczony zestaw dziewięciu wartości:
Wartość Klawisz wciśnięty przez użytkownika
Klawisz.ENTER Użytkownik nacisnął Enter
Klucz.ESCAPE Użytkownik nacisnął klawisz Esc
Klucz.PAUZA Użytkownik nacisnął Pauzę
Klucz.SPACJA Użytkownik nacisnął spację
Klucz.LEWO Użytkownik nacisnął klawisz strzałki w lewo
Klucz.PRAWY Użytkownik nacisnął klawisz strzałki w prawo
Klucz.GÓRA Użytkownik nacisnął klawisz strzałki w górę
Klawisz.W DÓŁ Użytkownik nacisnął klawisz w dół
Klucz.NIEZNANY Użytkownik nacisnął klawisz inny niż powyższe

3. Praca z timerem

Wiele gier dzieje się w czasie rzeczywistym, tzn. nawet jeśli użytkownik nic nie robi, w grze nadal zachodzą zdarzenia. Aby umożliwić Ci wdrożenie takich gier, dodaliśmy licznik czasu do silnika gry. Działa to mniej więcej tak: włączasz timer i ustawiasz interwał timera. Na przykład 500 milisekund. Następnie co pół sekundy silnik gry wywołuje onTurnTimer()metodę. Raz za razem na zawsze — aż do wyłączenia timera. Jak więc korzystać z timera?
  1. Włącz minutnik.

    Aby to zrobić, istnieje specjalna metoda. Metoda przyjmuje jako argument odstęp między wywołaniami w milisekundach (1 milisekunda = 1/1000 sekundy). Wystarczy wywołać ją raz, a silnik gry zacznie wywoływać metodę co milisekundy.void setTurnTimer(int timeMs)onTurn()

  2. Zastąp metodę onTurn(int).

    Aby to zrobić, musisz zadeklarować metodę w klasie, która dziedziczy . Ta metoda zostanie wywołana przez silnik gry. Co więcej, przy każdym wywołaniu silnik gry przekaże metodzie sekwencyjny identyfikator wywołania (1, 2, 3, …).void onTurn(int step)Game

  3. Wyłącz minutnik.

    Jeśli timer nie jest już potrzebny, na przykład, gdy użytkownik kończy grę, możesz go wyłączyć. Aby to zrobić, wystarczy wywołać metodę.stopTurnTimer()

  4. Przyspiesz lub zmień stoper.

    W niektórych grach tempo, w jakim zachodzą zdarzenia, stale przyspiesza, więc wygodnie byłoby przyspieszyć nasz stoper (skrócić czas między połączeniami). Nic prostszego: zadzwoń jeszcze raz z nową wartością, a zmieni się setTurnTimer(int timeMs)czas między połączeniami.onTurn()

Na przykład:

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);

        }
    }
    …
}
W tym prostym przykładzie utworzyliśmy pole o wymiarach 3 komórki x 3 komórki. Następnie uruchomiliśmy licznik czasu, który będzie wywoływał onTurn()metodę co pół sekundy. Co pół sekundy kolor komórki będzie się zmieniał, ale jej zawartość się nie zmieni. Po 50 sekundach kolor przestanie się zmieniać. To wszystko na teraz! Jeśli chcesz dowiedzieć się więcej o sekcji „Gry”, oto kilka przydatnych dokumentów, które mogą pomóc:
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION