JavaRush /Java 博客 /Random-ZH /JavaRush 上的“游戏”部分:事件处理

JavaRush 上的“游戏”部分:事件处理

已在 Random-ZH 群组中发布
JavaRush 中的“游戏”是一个新部分,其中包含有趣的大型任务,用于创建您自己的流行游戏版本。很简单:每个游戏项目都分为子任务。一一完成它们,游戏就准备好了。您可以在社交网络上分享并邀请朋友一起玩。章节在这篇文章中我们将详细讨论编写游戏时的事件处理方法。

1. 使用鼠标

游戏引擎有两种使用鼠标的方法:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);
您只需在继承自 的游戏类中声明这些方法Game,并在其中编写任何代码即可。当用户按下鼠标按钮时,游戏引擎本身会调用它们。
  1. onMouseLeftClick(int x, int y)— 单击鼠标左键时由引擎调用。作为参数,它接收发生点击的运动场单元格的坐标。左上角单元格的坐标为 (0,0)。要使用此方法,必须重写它。

  2. onMouseRightClick(int x, int y)— 右键单击​​时调用。工作原理与方法类似onMouseLeftClick(int x, int y)
使用方法举例:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        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) {
        // Ставим символ "X" в клетку по которой кликнули левой кнопкой мыши
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Очищаем клетку по которой кликнули правой кнопкой мыши
        setCellValue(x, y, "");
    }
}

2. 使用键盘

游戏引擎有两种使用键盘的方法:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);
如果您希望在用户按下键盘上的按钮时发生操作,请在继承自 Game 的游戏类中声明这些方法,并在其中编写代码。当用户按下或释放键盘按键时,游戏引擎本身将调用它们。
  1. onKeyPress (Key key)— 当按下任何键盘按键时调用。按下的键的值(或 Key.UNKNOWN)作为键参数传递给该方法。

  2. onKeyReleased (Key key)— 释放任何键盘键时调用。key 参数采用相应键的值(或 Key.UNKNOWN)。
使用方法举例:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        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) {
        // При нажатии пробела, центральная клетка становится желтой
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // При отпускании пробела, центральной клетке возвращается белый цвет
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
重要的! 在当前版本的引擎中,Key类型只能接受一组有限的值(9个):
意义 用户点击了什么
回车键 用户按下了 Enter 按钮
按键.ESCAPE 用户按下了 Esc 按钮
暂停键 用户单击了暂停按钮
空格键 用户按下空格键
左键 用户按下左箭头
右键 用户按下右箭头
向上键 用户按下向上箭头
向下键 用户按下向下箭头
密钥.未知 除上面列出的键之外的任何键

3. 使用定时器

许多游戏都是实时发生的,这意味着即使用户什么都不做,游戏中的事件仍然会执行。为了让您能够实现此类游戏,我们在游戏引擎中添加了计时器功能。它的工作原理是这样的:您打开计时器并设置计时器应该关闭的时间段。例如,500 毫秒。此后,游戏引擎每半秒调用onTurnTimer(). 无限次,直到计时器关闭。如何使用定时器?
  1. 打开计时器。

    为此有一个特殊的方法void setTurnTimer(int timeMs)。该方法采用以毫秒(1/1000 秒)为单位的调用之间的间隔持续时间作为参数。调用一次就够了,游戏引擎onTurn()每隔Ms毫秒就会开始调用该方法。

  2. 重写 onTurn(int) 方法。

    为此,您需要void onTurn(int step)在从该类继承的类中声明一个方法Game。该方法将由游戏引擎调用。在这种情况下,引擎每次都会将此类调用的序列号(1,2,3,...)传递给该方法。

  3. 关闭计时器。

    如果不再需要计时器,例如当用户完成游戏时,可以将其关闭。为此,您只需调用stopTurnTimer().

  4. 加快速度或更改计时器。

    在某些游戏中,事件不断加速,因此加快计时器(减少调用之间的时间)会很方便。没有什么比这更简单的了:使用setTurnTimer(int timeMs)新值再次调用,调用之间的时间onTurn()就会改变。

例子:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {@Override
    public void initialize() {
    	// Создаем игровое поле 3x3 клетки
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   //Включаем таймер, интервал между вызовами – 500мс.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // если прошло 100 тактов, выключаем таймер
        }

        if (step % 2 == 1) {
            // Если данный такт нечётный, установить клетке красный фон
            setCellColor(1, 1, Color.RED);
        } else {
            //если данный такт чётный, установить клетке синий фон
            setCellColor(1, 1, Color.BLUE);

        }
    }}
在这个简单的示例中,我们创建了一个 3x3 单元格的字段。然后我们打开一个计时器,每半秒调用该方法onTurn()。每半秒单元格的颜色就会改变,但其内容不会改变。50 秒后颜色将停止变化。就这样!如果您想了解有关游戏部分的更多信息,这里有一些有用的文档可以提供帮助:
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION