In my last blog, I explained about how to use connection resiliency feature of AppWarp in multiplayer games. Connection resiliency lets you recover the same connection within the specified time period and continue the game. But in some cases, you need to know the complete information when you were not connected. One such case is the turn-based games as you need to update your state with all the turns happened during the time you were not connected. Since in turn-based games, we also have to take care of missed moves to synchronize the game after the connection is recovered. In this blog, I will be discussing how to handle the turn-based games when a connection error occurs.
先週のブログで、私はマルチプレイゲームにおけるAppWarpの接続回復の使用方法について説明しました。接続回復機能によって、限られた時間で接続を回復させ、ゲームを続けることができます。しかしいくつかのケースで、接続していないときに万全な情報を知る必要があるのです。そのようなケースの1つがターンベースゲームであり、接続していない間に発生する全てのターンで、あなたの状態をアップデートする必要があります。ターンベースゲームでは、接続を回復した後ゲームを同調させるために、とばしてしまったムーヴに注意する必要があります。このブログでは、接続エラーが起きた場合、どのようにターンベースゲームを扱うべきかについて議論していきましょう。
Scenario
When a user misses moves data because of the connection error and recovers it after sometime, he will need the data of missed moves and information about the users’s turn to synchronize the game and check if it is his turn.
Solution
To solve this problem, we can use getMoveHistory() API, which will give us last 5 moves. Once you have got the last 5 moves, now you need to know what moves have you missed. I will suggest you to keep the last successful move at the client side and once you get the move history, you can simply iterate over that list and compare with the last successful move you saved and accordingly update your game state with the moves which happened after that successful move. To resolve the issue, follow the steps put forth.
Step 1
Update the last move at the client’s side on every onMoveCompleted event.
[code java]
void onMoveCompleted(MoveEvent moveEvent)
{
//update the lastmove in local storage
}<[/code]
Step 2
On connection error, call the RecoverConnection as discussed in the last blog.
[code java] WarpClient.GetInstance().RecoverConnection();[/code]
Step 3
On receiving the success recovered in OnConnectDone, call the getMoveHistory() API.
[code java]WarpClient.GetInstance().getMoveHistory();[/code]
Step 4
On receiving onGetMoveHistoryDone event, we have to do two tasks.
1. To get the missed moves, iterate the moves array and check the index of last successfully received move. Missed moves indexes are from the last successfully received move index+1 to last one in the array.
2. Get the next turn of the last move in array and check if, the user has his turn.
[code java]public void onGetMoveHistoryDone(byte result, MoveEvent[] moves)
{
//Get the missed moves
MoveEvent lastmove=GetlastmovefromlocalStorage()
int index=0;
for(index=moves.length-1;index>=0;index--)
{
if(lastmove is equal to moves[index])
break;
}
List missedmoves=new List();
for(;index<moves.length;index++)
{
missedMoves.add(moves[index]);
}
//Check if user has the current turn
MoveEvent lastmove=moves[moves.length-1];
String nextturn=lastmove.getNextTurn();
if(username.equals(nextturn))
{
//Its user's turn so here he can do the same logic as it was in onMoveCompleted event on his turn,and can proceed for calling the SendMove api
}
}[/code]
This is how you can deal with connection errors in turn-based games.
If you have any queries, do post it at forum.
シナリオ
ユーザーが接続エラーによってムーヴデータを失い、しばらくしてそれを回復させたとき、そのユーザーはゲームを同調させターンの順番を確認するために、失ったムーヴのデータとユーザーのターンについての情報が必要となるでしょう。
ソリューション
この問題を解決するために、私達は直近の5ムーヴを知らせてくれるget Move History() APIを使用できます。いったん直近の5ムーヴが分かれば、どのムーヴであなたがいなくなったのかを知る必要が出てきます。私はあなたに、クライアント側で最後に上手くいったムーヴを保存しておくことを推奨します。いったんムーヴの履歴を手に入れたら、そのリストを調べ、保存した最後に上手くいったムーヴと比較します。それに従って、成功したムーヴ後に起きたムーヴを持つゲームの状態にアップデートしましょう。この問題を解決するために、次のステップを参考にしてみてください。
ステップ1
全てのon Move Completedイベントで、クライアント側での直近の動きをアップデートしましょう。
void onMoveCompleted(MoveEvent moveEvent)
{
//update the lastmove in local storage
}
ステップ2
接続エラーが起きたらすぐに、前回のブログ書いたようにRecover Connectionにコールしましょう。
WarpClient.GetInstance().RecoverConnection();
ステップ3
On Connect Doneで回復された成功を受け取ったらすぐに、get Move History() APIにコールしましょう。
WarpClient.GetInstance().getMoveHistory();
ステップ4
On Get Move History Doneイベントを受け取ったら、私達は2つやるべきことがあります。
1.失ったムーヴを手に入れるために、ムーヴ配列を調べ、最後に上手く受信したムーヴのインデックスを確認しましょう。失ったムーヴインデックスは、配列にある最後の1つで、直近に受信したムーヴインデックスに+1をしたものです。
2.配列で最後のムーヴの次のターンを手に入れましょう。そしてそれが正確か確認しましょう。
public void onGetMoveHistoryDone(byte result, MoveEvent[] moves)
{
//Get the missed moves
MoveEvent lastmove=GetlastmovefromlocalStorage()
int index=0;
for(index=moves.length-1;index>=0;index--)
{
if(lastmove is equal to moves[index])
break;
}
List missedmoves=new List();
for(;index<moves.length;index++)
{
missedMoves.add(moves[index]);
}
//Check if user has the current turn
MoveEvent lastmove=moves[moves.length-1];
String nextturn=lastmove.getNextTurn();
if(username.equals(nextturn))
{
//Its user's turn so here he can do the same logic as it was in onMoveCompleted event on his turn,and can proceed for calling the SendMove api
}
}
これがターンベースゲームで接続エラーが起きたときの対処法です。
もし質問等があれば、フォーラムにそれを登校してください。
Leave A Reply