1. はじめに

ゲーム エンジンは、画面上に何かを描画するためだけに使用できるのであれば、ほとんど役に立ちません。本格的なゲームを作成するには、ユーザーと対話する必要があります。より正確に言うと、プログラムはユーザーのアクションを追跡し、それに応答する必要があります。

これを行うために、CodeGym ゲーム エンジンには、ユーザーがマウス ボタンまたはキーボード キーをクリックしたときに呼び出される特別なメソッドがあります。

このクラスのポイントは、これらのメソッドを自分で記述し、CodeGym ゲーム エンジンがそれらのメソッドを呼び出すことです。必要なのは、コード内でこれらのメソッドを宣言することだけです。これは思ったより簡単です。


2. マウスの操作

ゲーム エンジンには、マウスを操作するための 2 つの方法があります。

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

これらのメソッドを、クラスを継承する独自のクラスで宣言するだけですGame。そして、これらのメソッドに必要なコードを記述します。ユーザーがマウス ボタンをクリックすると、ゲーム エンジンはこれらのメソッドを呼び出します。

onMouseLeftClick(int x, int y)マウスの左ボタンがクリックされると、エンジンによって呼び出されます。そのパラメータは、クリックが発生した競技フィールドのセルの座標です。左上のセルの座標は です(0,0)@Overrideこのメソッドを使用するには、メソッド名の前に注釈を配置してオーバーライドする必要があります。

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) {
      // Put a "X" in the cell that was clicked with the left mouse button
      setCellValue(x, y, "X");
   }

   @Override
   public void onMouseRightClick(int x, int y) {
      // Clear the cell that was clicked with the right mouse button
      setCellValue(x, y, "");
   }
}

上の例では、onMouseLeftClick()との両方のメソッドを宣言しましたonMouseRightClick()。最初のメソッドは、ユーザーが競技フィールドのセル上でマウスの左ボタンをクリックしたときに呼び出されます。2 番目のメソッドは、マウスの右ボタンがクリックされたときに呼び出されます。

(x, y)CodeGym ゲーム エンジンは引数として、マウスがクリックされた競技フィールドのセルの座標を渡します。



3. キーボードの操作

ゲーム エンジンには、キーボードを操作するための 2 つの方法があります。

void onKeyPress(Key key);
void onKeyReleased(Key key);

ユーザーがキーを押したときに何かをしたい場合は、クラスを継承するクラスでこれらのメソッドを宣言するだけですGame

これらのメソッドにコードを記述すると、ユーザーがキーを押した (または放した) ときにゲーム エンジンがそれらのメソッドを呼び出します。

onKeyPress(Key key)任意のキーが押されると呼び出されます。押されたキー (または) の値がパラメータとしてメソッドに渡されます。このメソッドを使用するには、メソッド名の前に注釈を配置してオーバーライドする必要があります。Key.UNKNOWNkey@Override

onKeyReleased(Key key)任意のキーが放されたときに呼び出されます。対応するキー (または) の値がパラメータに割り当てられます。このメソッドを使用するには、メソッド名の前に注釈を配置してオーバーライドする必要があります。Key.UNKNOWNkey@Override

これらのメソッドの使用例:

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 spacebar is pressed, the center cell turns yellow
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.YELLOW);
      }
   }

   @Override
   public void onKeyReleased(Key key) {
      // When the spacebar is released, the center cell returns to white
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.WHITE);
      }
   }
}


4. サポートされているすべてのキーのリスト

CodeGym エンジンがonKeyPress()およびonKeyReleased()メソッドを呼び出すと、押された (放された) キーに関する情報がメソッドに渡されます。これを行うために、CodeGym エンジンには と呼ばれる特別なタイプがありますKey

エンジンの現在のバージョンでは、このKey型は次の 9 つの値の限られたセットのみをサポートします。

価値 ユーザーが押したもの
Key.ENTER
ユーザーがEnterキーを押した
Key.ESCAPE
ユーザーがEscキーを押した
Key.PAUSE
ユーザーが一時停止キーを押しました
Key.SPACE
ユーザーがスペースキーを押した
Key.LEFT
ユーザーが左矢印キーを押しました
Key.RIGHT
ユーザーが右矢印キーを押しました
Key.UP
ユーザーが上矢印キーを押しました
Key.DOWN
ユーザーが下矢印キーを押しました
Key.UNKNOWN
上記以外のキー

プレーヤーがスペースバーを押すと、メソッドがパラメータとしてonKeyPress()呼び出されます。Key.SPACEユーザーが左矢印を押すと、パラメータは になりますKey.LEFT。ユーザーが上記のリストにないキーを押すと、メソッドがパラメータとしてonKeyPress()呼び出されます。Key.UNKNOWN

ここでの問題は、既存の CodeGym ゲームが携帯電話で実行されるように設計されていることです。標準のキーボードの代わりに、8 つの仮想ボタンがあります。


5. タイマーの操作

多くのゲームはリアルタイムで行われます。つまり、ユーザーは何もしなくても、特定のイベントがゲーム内で発生します。このようなゲームを実装できるようにするために、ゲーム エンジンにタイマーを追加しました。

仕組みは次のとおりです。タイマーをオンにして、タイマーが作動するまでの時間を設定します。たとえば、500 ミリ秒です。その後、0.5 秒ごとに、CodeGym ゲーム エンジンがonTurn()メソッドを呼び出します。タイマーがオフになるまで、回数は無制限です。

タイマーってどうやって使うんですか?

1.タイマーをオンにする

タイマーをオンにするvoid setTurnTimer(int timeMs)メソッドがあります。このメソッドは、コールバック間の間隔の期間 (ミリ秒または 1/1000 秒単位) を引数として受け取ります。このメソッドを 1 回呼び出すだけで、ゲーム エンジンがミリ秒onTurn()ごとにメソッドの呼び出しを開始しますtimeMs

2.onTurn(int)メソッドをオーバーライドする

これを行うには、クラスvoid onTurn(int step)を継承するクラスでメソッドを宣言する必要がありますGame。ゲーム エンジンはこのメソッドを呼び出します。呼び出しごとに、エンジンはメソッド呼び出しを識別する連続番号 ( 123、 ...) を渡します。

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 3x3 playing field
      setScreenSize(3, 3);
      showGrid(false);
      setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

      setTurnTimer(500); // Turn on the timer. The interval between callbacks is 500ms.
   }

   @Override
   public void onTurn(int step) {
      if (step == 100) {
         stopTurnTimer(); // If this is the 100th callback, then turn off the timer
      }

      if (step % 2 == 1) {
         // If this is an odd calllback, then set the cell background to red
         setCellColor(1, 1, Color.RED);
      } else {
         // If this is an even callback, then set the cell background to blue
         setCellColor(1, 1, Color.BLUE);
      }
   }
   ...
}

この簡単な例では、3 セル×3 セルのフィールドを作成しました。onTurn()次に、 0.5 秒ごとにメソッドを呼び出すタイマーをオンにしました。

ここでは、中央のセルの色が 0.5 秒ごとに変わります。セルのテキストは変更されません。50 秒 (100 コールバック) 後、色の変化が止まり、タイマーがオフになります。