JavaRush 中的“游戏”是一个新部分,其中包含有趣的大型任务,用于创建您自己的流行游戏版本。很简单:每个游戏项目都分为子任务。一一完成它们,游戏就准备好了。您可以在社交网络上分享并邀请朋友一起玩。在这篇文章中我们将详细讨论编写游戏时的事件处理方法。
1. 使用鼠标
游戏引擎有两种使用鼠标的方法:void onMouseLeftClick(int x, int y);
void onMouseRightClick(int x, int y);
Game
,并在其中编写任何代码即可。当用户按下鼠标按钮时,游戏引擎本身会调用它们。
onMouseLeftClick(int x, int y)
— 单击鼠标左键时由引擎调用。作为参数,它接收发生点击的运动场单元格的坐标。左上角单元格的坐标为 (0,0)。要使用此方法,必须重写它。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);
onKeyPress (Key key)
— 当按下任何键盘按键时调用。按下的键的值(或 Key.UNKNOWN)作为键参数传递给该方法。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()
. 无限次,直到计时器关闭。如何使用定时器?
-
打开计时器。
为此有一个特殊的方法
void setTurnTimer(int timeMs)
。该方法采用以毫秒(1/1000 秒)为单位的调用之间的间隔持续时间作为参数。调用一次就够了,游戏引擎onTurn()
每隔Ms毫秒就会开始调用该方法。 -
重写 onTurn(int) 方法。
为此,您需要
void onTurn(int step)
在从该类继承的类中声明一个方法Game
。该方法将由游戏引擎调用。在这种情况下,引擎每次都会将此类调用的序列号(1,2,3,...)传递给该方法。 -
关闭计时器。
如果不再需要计时器,例如当用户完成游戏时,可以将其关闭。为此,您只需调用
stopTurnTimer()
. -
加快速度或更改计时器。
在某些游戏中,事件不断加速,因此加快计时器(减少调用之间的时间)会很方便。没有什么比这更简单的了:使用
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 秒后颜色将停止变化。就这样!如果您想了解有关游戏部分的更多信息,这里有一些有用的文档可以提供帮助:
GO TO FULL VERSION