CodeGym /Java Blog /Toto sisi /CodeGym 上的遊戲部分:事件處理
John Squirrels
等級 41
San Francisco

CodeGym 上的遊戲部分:事件處理

在 Toto sisi 群組發布
CodeGym 的“遊戲”是一個新部分,其中包含大量有趣的任務,您可以在其中創建自己的流行遊戲版本。很簡單:每個遊戲項目都分為子任務。一個一個地完成它們,遊戲就完成了。您可以在社交網絡上分享它並邀請您的朋友一起玩。CodeGym 上的“遊戲”部分:事件處理 - 1在本文中,我們將詳細描述用於編寫遊戲的 事件處理方法。

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.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. 使用鍵盤

遊戲引擎有兩種使用鍵盤的方法:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

如果您希望在用戶按下某個鍵時發生某些事情,請在您繼承 Game 的類中聲明這些方法,並將您的代碼添加到它們中。當用戶按下或釋放一個鍵時,遊戲引擎將調用它們。
  1. onKeyPress(Key key)— 按下任意鍵時調用。關鍵參數是按下的鍵(或 Key.UNKNOWN)。

  2. onKeyReleased(Key key)— 釋放任何鍵時調用。key 參數是相應的鍵(或 Key.UNKNOWN)。

以下是使用這些方法的示例:

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);
        }
    }
}
重要的! 在當前版本的遊戲引擎中,Key 類型只有九個值:
價值 用戶按下的鍵
鍵.ENTER 用戶按下 Enter
鍵.ESCAPE 用戶按下 Esc
鍵.PAUSE 用戶按下暫停
鍵空間 用戶按下空格鍵
鍵.左 用戶按下左箭頭鍵
鍵.RIGHT 用戶按下右箭頭鍵
鍵.UP 用戶按下向上箭頭鍵
按鍵.DOWN 用戶按下了向下鍵
鑰匙.未知 用戶按下了上述以外的鍵

3.使用定時器

許多遊戲是實時發生的,即即使用戶什麼都不做,遊戲中仍然會發生事件。為了讓您能夠實現此類游戲,我們在遊戲引擎中添加了一個計時器。它的工作原理是這樣的:你打開定時器並設置定時器間隔。例如,500 毫秒。然後,遊戲引擎每半秒調用一次該onTurnTimer()方法。永遠一次又一次——直到定時器被關閉。那麼如何使用定時器呢?
  1. 打開定時器。

    為此,有一種特殊的方法。該方法以毫秒為單位的調用間隔作為參數(1 毫秒 = 1/1000 秒)。您只需要調用一次,遊戲引擎將在每 timeMs 毫秒開始調用該方法。void setTurnTimer(int timeMs)onTurn()

  2. 覆蓋 onTurn(int) 方法。

    為此,您需要在繼承的類中聲明一個方法。該方法將由遊戲引擎調用。此外,對於每次調用,遊戲引擎都會將調用的順序標識符(1、2、3、...)傳遞給該方法。void onTurn(int step)Game

  3. 關閉定時器。

    如果不再需要計時器,例如,當用戶完成遊戲時,您可以將其關閉。為此,您只需調用該方法。stopTurnTimer()

  4. 加速或更改計時器。

    在某些遊戲中,事件發生的速度不斷加快,因此加快我們的計時器(減少調用之間的時間)會很方便。沒有比這更容易的了:setTurnTimer(int timeMs)使用新值再次調用,onTurn()調用之間的時間將會改變。

例如:

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

        }
    }
    …
}
在這個簡單的示例中,我們創建了一個 3 單元格 x 3 單元格的字段。onTurn()然後我們啟動了一個定時器,每半秒調用一次該方法。每半秒,單元格顏色會發生變化,但其內容不會改變。50 秒後,顏色將不再變化。目前為止就這樣了!如果您想了解有關“遊戲”部分的更多信息,這裡有一些有用的文檔可以提供幫助:
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION