コーディング開始
ファイル生成後、以下の4つのクラスからサブクラスを作成する必要があります。
![サブクラスの全体像](http://cz-cdn.shoeisha.jp/static/images/article/3853/tut_ttts.gif)
- 「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開発者ガイドを参照ください。