コーディング開始
ファイル生成後、以下の4つのクラスからサブクラスを作成する必要があります。

- 「TictactoeGame」-これはゲームコードが開始されるメインクラスです。このクラスは、どのクラスをオーバーライドするかをPulseUIに指示する場所でもあります(今回のサンプルでは、次の3つのクラスをオーバーライドします)。
- 「TictactoeSkinner」-すべての画面UIを描画するために使われるイメージ(スキン)ファイルを読み込む
Skinnerサブクラスです。 - 「TictactoeNewGameScreen」-このサブクラスはオプションですが、今回のゲームでは、Pulseサーバにゲームルームの詳細な特性(ターン制、ルームごとの最大プレイヤー数が2人であることなど)を伝えるために必要とされます。
- 「TictactoeGameScreen」-ゲーム開始後にゲームルーム内で行われるすべてのアクションに関するクラスです。
サブクラスの詳細
TictactoeGame
これはゲームコードが開始されるメインクラスです。
コンストラクタのオーバーライド
public function TictactoeGame() {
new TictactoeSkinner();
}
コンストラクタはゲーム固有のSkinnerクラスをインスタンス化するのに適した場所です。Skinnerクラスの実装については、後ほど詳しく説明します。
PulseGameのgetGameIdメソッドのオーバーライド
public override function getGameId():String {
return "Tictactoe";
}
Pulseランタイムでは、ゲームごとに一意のゲームIDを割り当てる必要があります。これにより1台のサーバ上で複数のゲームをホストできるわけです。このIDは同じゲームに参加している対戦相手を照合するためにも用いられます。つまり、ジグソーパズルをしているプレイヤーは三目並べをしているルームに入ることはできません。
startメソッドのオーバーライド
import tictactoe.gsrc.client.GNetClientObjectFactory;
...
protected override function start():void {
var factory:GNetClientObjectFactory;
factory = new GNetClientObjectFactory();
m_netClient = new GameClient(factory, this);
s_instance = this;
super.start();
}
startメソッドからすべてが開始されます。上のようにして、factoryオブジェクトを生成しなければなりません。このfactoryクラスは、コードの生成過程で生成されるクラスの1つです。
GameClientも、引数として渡されたfactoryのインスタンスで生成されます。生成されたGameClientを、PulseGameクラスで定義されているm_netClientフィールドに代入する必要があります。
必要なGameClientインスタンスは1つだけです。最後にsuper.start()を呼び出します。これでスプラッシュ画面が表示され、それが徐々に消えてプレイヤーをログイン画面に導きます。
この段階で、プレイヤーにログイン画面が表示されます。プレイヤーは登録されたユーザー名とパスワードを入力するか、ゲストとしてログインできます。
ゲームのためのカスタムクラスの作成
protected override function initGameScreen():void {
m_gameScreen = new TictactoeGameScreen(this);
m_gameScreen.init();
}
上記の2つのオーバーライドは、ゲーム固有の画面を生成するために必要です。1つは新規ルーム作成中の画面で、もう1つはゲームプレイ中の画面です。
ターン制
三目並べはターン制のゲームとして定義されます(TictactoeNewGameScreenのサブクラスの詳細を参照)。そのため、Pulseサーバは、自分のターン(番)になったことをクライアントに知らせるコールバックを送出します。ターン中は、プレイヤーに対して視覚的なサインを表示する必要があります。
public override function onPlayerTurn():void {
(m_gameScreen as TictactoeGameScreen).onPlayerTurn();
}
このロジックは単純で、サインを表示するゲーム画面を呼び出しているだけです。
サーバとの通信
public override function onGameStateAction(gameState:GameStateClient):void{
(m_gameScreen as TictactoeGameScreen).onPlayerMoved(gameState);
}
public function sendGameState(xPos:int,yPos:int,value:int):void {
var putMsg:PutClient = new PutClient();
putMsg.setStateType(GameConstants.GS_IS_UNIQUE);
putMsg.setPutRow(xPos);
putMsg.setPutColumn(yPos);
putMsg.setPutValue(value);
m_netClient.sendGameStateAction(putMsg);
m_netClient.nextTurn();
}
2つのメソッドを実装する必要があります。1つは対戦相手のアクションを受け取るメソッドで、もう1つは対戦相手にアクションを送るメソッドです。
対戦相手のアクションを受け取るために、onGameStateActionをそのままオーバーライドして、ゲーム画面に渡します。
対戦相手にアクションを送るため、ゲーム画面オブジェクトから呼び出される補助メソッドsendGameStateを作成します。ここでは、サーバに「プレイヤーのターンが完了し、次のプレイヤーのターンを通知してよい」ことも知らせます。なお、PutClientはスキーマファイル内で定義されており、コード生成段階で生成されることに注意してください。
使用可能なゲーム状態の種類の詳細については、Pulse開発者ガイドを参照ください。
2つのメソッドを実装する必要があります。1つは対戦相手のアクションを受け取るメソッドで、もう1つは対戦相手にアクションを送るメソッドです。
対戦相手のアクションを受け取るために、onGameStateActionをそのままオーバーライドして、ゲーム画面に渡します。
対戦相手にアクションを送るため、ゲーム画面オブジェクトから呼び出される補助メソッドsendGameStateを作成します。ここでは、サーバに「プレイヤーのターンが完了し、次のプレイヤーのターンを通知してよい」ことも知らせます。なお、PutClientはスキーマファイル内で定義されており、コード生成段階で生成されることに注意してください。
使用可能なゲーム状態の種類の詳細については、Pulse開発者ガイドを参照ください。
