JavaRush /Java Blog /Random-TW /JavaRush 上的「遊戲」部分:事件處理

JavaRush 上的「遊戲」部分:事件處理

在 Random-TW 群組發布
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