CodeGym /Blogue Java /Random-PT /Seção de jogos no CodeGym: manipulação de eventos
John Squirrels
Nível 41
San Francisco

Seção de jogos no CodeGym: manipulação de eventos

Publicado no grupo Random-PT
"Jogos" do CodeGym é uma nova seção com grandes tarefas interessantes onde você cria suas próprias versões de jogos populares. É simples: cada projeto de jogo é dividido em subtarefas. Complete-os um por um e o jogo está feito. Você pode compartilhá-lo nas redes sociais e convidar seus amigos para jogar. Seção "Jogos" no CodeGym: manipulação de eventos - 1Neste artigo, descreveremos em detalhes os métodos de manipulação de eventos usados ​​para escrever jogos.

1. Trabalhando com o mouse

O motor de jogo tem dois métodos para trabalhar com o mouse:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

Você simplesmente declara esses métodos em sua classe que herda Gamee adiciona qualquer código que desejar a eles. O mecanismo do jogo os chamará quando o usuário clicar nos botões do mouse.
  1. onMouseLeftClick(int x, int y)— chamado pelo mecanismo quando o botão esquerdo do mouse é clicado. Seus parâmetros são as coordenadas da célula do campo de jogo onde ocorreu o clique. A célula superior esquerda tem coordenadas (0, 0). Você precisa substituir esse método para usá-lo.

  2. onMouseRightClick(int x, int y)— chamado quando o botão direito do mouse é clicado. Este método funciona como o onMouseLeftClick(int x, int y)método.

Aqui está um exemplo de uso desses métodos:

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. Trabalhando com o teclado

O motor do jogo tem dois métodos para trabalhar com o teclado:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

Se você deseja que algo aconteça quando o usuário pressiona uma tecla, declare esses métodos em sua classe que herda Game e adicione seu código a eles. O mecanismo do jogo os chamará quando o usuário pressionar ou soltar uma tecla.
  1. onKeyPress(Key key)— chamado quando qualquer tecla é pressionada. O parâmetro chave é a tecla pressionada (ou Key.UNKNOWN).

  2. onKeyReleased(Key key)— chamado quando qualquer tecla é liberada. O parâmetro chave é a chave correspondente (ou Key.UNKNOWN).

Aqui está um exemplo de uso desses métodos:

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);
        }
    }
}
Importante! Na versão atual do mecanismo de jogo, o tipo de chave tem um conjunto limitado de nove valores:
Valor Tecla pressionada pelo usuário
Chave.ENTER O usuário pressionou Enter
Key.ESCAPE O usuário pressionou Esc
Key.PAUSE O usuário pressionou Pausa
Chave.ESPAÇO O usuário pressionou espaço
Chave ESQUERDA O usuário pressionou a tecla de seta para a esquerda
Chave.DIREITA O usuário pressionou a tecla de seta para a direita
Key.UP O usuário pressionou a tecla de seta para cima
Tecla.PARA BAIXO O usuário pressionou a tecla para baixo
Chave.DESCONHECIDA O usuário pressionou uma tecla diferente das acima

3. Trabalhando com o cronômetro

Muitos jogos acontecem em tempo real, ou seja, mesmo que o usuário não faça nada, os eventos ainda ocorrem no jogo. Para permitir que você implemente esses jogos, adicionamos um cronômetro ao mecanismo do jogo. Funciona mais ou menos assim: você liga o cronômetro e define o intervalo do cronômetro. Por exemplo, 500 milissegundos. Então, a cada meio segundo, o mecanismo do jogo chama o onTurnTimer()método. De novo e de novo para sempre - até que o cronômetro seja desligado. Então, como você usa o timer?
  1. Ligue o temporizador.

    Para fazer isso, existe um método especial. O método toma como argumento o intervalo entre as chamadas em milissegundos (1 milissegundo = 1/1000 segundo). Você só precisa chamá-lo uma vez e o mecanismo do jogo começará a chamar o método a cada milissegundos.void setTurnTimer(int timeMs)onTurn()

  2. Substitua o método onTurn(int).

    Para fazer isso, você precisa declarar um método na classe que herda . Este método será chamado pelo mecanismo do jogo. Além do mais, a cada chamada o game engine passará para o método um identificador sequencial para a chamada (1, 2, 3, …).void onTurn(int step)Game

  3. Desligue o temporizador.

    Se o cronômetro não for mais necessário, por exemplo, quando o usuário terminar o jogo, você poderá desligá-lo. Para fazer isso, basta chamar o método.stopTurnTimer()

  4. Acelerar ou alterar o temporizador.

    Em alguns jogos, a taxa de ocorrência dos eventos é constantemente acelerada, por isso seria conveniente acelerar nosso cronômetro (reduzir o tempo entre as chamadas). Nada poderia ser mais fácil: ligue setTurnTimer(int timeMs)novamente com um novo valor e o tempo entre onTurn()as chamadas mudará.

Por exemplo:

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

        }
    }
    …
}
Neste exemplo simples, criamos um campo com 3 células x 3 células. Em seguida, iniciamos um timer que chamará o onTurn()método a cada meio segundo. A cada meio segundo, a cor da célula mudará, mas seu conteúdo não mudará. Após 50 segundos, a cor não mudará mais. É tudo por agora! Se você quiser saber mais sobre a seção "Jogos", aqui está uma documentação útil que pode ajudar:
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION