2014/06/22

Developing a Turn-based Multiplayer Game in Androidの翻訳(途中)

Google Play Game Services — Google Developers
の翻訳です。未完ですが、眠らせておくのももったいないので公開します。

 重要:Play Games services APIは、Google Play servicesのための簡略化したGoogle APIクライアントプログラミングモデルをサポートするように改訂されました。以前のGames clientは2014/02/07から非推奨になりました。既存または新規の開発者は 非推奨の GamesClient(リンクはない模様) に代わりに GoogleApiClientを使用することを強く推奨します。

このガイドは、Androidアプリにおける、Play Games services を使用したターンベースマルチプレイヤーゲームを実装する方法を示します。

はじめる前に

まだ(開発を)行っていない場合、turn-based multiplayer game concepts を見ると参考になるかもしれません。

ターンベースマルチプレイヤーゲームのコードを書く前に:
  • Google Play Developer Console内で、ゲームがターンベースのマルチプレイヤーサポートを有効になっていることを確認してください。
  • ダウンロードページより、ターンベースのマルチプレイヤーゲームのサンプルコードをダウンロードしレビューしてください。
  • ゲーム開発を簡単にするために、Accessing the Game APIsに説明しているように、メインゲームのActivityをBaseGameActivityクラスのサブクラスにすることができる。BaseGameActivityクラスはGoogleApiClient 接続とユーザーログインを操作するラッパーを提供しています。
  • Implementing Sign-In in Androidに説明しているガイドラインを参照するとよいでしょう。
一度、プレイヤーがログインし GoogleApiClientに接続したら、ゲームはターンベースのマルチプレイヤーAPIを使用することができます。

マッチを始める

ターンベースのマッチを始めるには、ゲームは、他の参加者と試合したい相手を指定する方法や、いくつかの規定した基準を使用した試合を構築した方法を選択することをプレイヤーに促すことができます。Play Games servicesは、ゲームにターンベースマッチのオブジェクトを返すためにゲームからマッチコンフィギュレーションデータを使用しています。このオブジェクトは、ターンベースマッチのライフサイクル上の全ての参加者と非同期に更新・共有されます。

試合を始めるには、これらのステップに従います:
  1. アプリ内で、プレイヤーがプレイしたいターンベースマッチの種類の詳細を収集し、試合に参加することができます。
    • ゲームは、SDKが提供する内蔵のプレイヤー選択ユーザーインターフェース(UI)を表示したり、このデータを収集するために独自のカスタムUIを使用することができます。プレイヤー選択UIの使用方法を学ぶには、デフォルトユーザーインターフェースによるプレイヤー選択を参照してください。
    • 別の方法として、ユーザーがプレイヤー選択UIを避けられるようにクイックスタートボタンを実装することができ、いくつかの規定した基準を使用して試合を構築する代わりになります。
  2. TurnBasedConfigObject内のマッチコンフィギュレーションデータを設定するTurnBasedMatchConfig.Builderを使用します。
  3. createMatch() を呼び、生成したTurnBasedConfigObjectを通します。自動マッチングが指定されている場合は、Play Games servicesは既存のゲームにマッチしようとします。詳細は、自動マッチングを実装を参照してください。
ターンベースマッチを生成するにあたり、ゲームはこれらのメソッドを呼ぶことができます:

-->
メソッド詳細
getSelectOpponentsIntent()オプション。デフォルトのプレーヤー選択UIを起動するためのインテントを返します。このUIから、ユーザーはランダムなGoogle+のユーザーと自動マッチする要求したり、他のGoogle+ユーザーをマッチするユーザーとして招待することを選択することができます。
createMatch()新しいターンベースマッチオブジェクトを作成する、または、自動マッチングが要求された場合のユーザーの基準を満たしている既存の試合をロードします。オートマッチングが要求された場合、返される試合は新しい試合または他のプレイヤーがすでにターンを取っている既存の試合のいずれかになります。新しい試合が返された場合、ユーザーは最初のターンを取る必要があります。ゲームは、新規または既存の試合がロードされているかどうかにかかわらず、交替を処理する責任があります。

デフォルトユーザーインターフェースによるプレイヤー選択

Play Games servicesは
public void onStartMatchClicked(View view) {
    Intent intent = 
        Games.TurnBasedMultiplayer.getSelectOpponentsIntent(getApiClient(), 1, 7, true);
    startActivityForResult(intent, RC_SELECT_PLAYERS);
}
以降、未翻訳です。
続きはGoogle Play Game Services — Google Developersを参照してください。


このページのコンテンツはクリエイティブ・コモンズの表示 3.0 ライセンスにより使用許諾されます。サンプル コードは Apache 2.0 ライセンス(リンク先は英語)により使用許諾されます。

2014/05/12

Google Play Services4.3からAPIの一部が変更になっているので、それの対応[リアルタイムマルチプレイヤー編]

Google Play Servicesが3月に4.3(2014/05/12現在は4.4)になり、API周りに変更があります。
 しかしながら、サンプルの方は以前のままでした。今月に入りようやく変更があったので、ButtonClickerを例に記述します。 (※ただし、現時点ではgradle版しか変更されておらず、eclipse版はそのままでした。)

ターンベースマルチプレイヤーについては、ターンベースマルチプレイヤー編の記事を参考にしてください。


final ArrayList invitees = data.getStringArrayListExtra(GamesClient.EXTRA_PLAYERS);
↓
final ArrayList invitees = data.getStringArrayListExtra(Games.EXTRA_PLAYER_IDS);

int minAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);
↓
int minAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);

int maxAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);
↓
int maxAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);

Invitation inv = data.getExtras().getParcelable(GamesClient.EXTRA_INVITATION);
↓
Invitation inv = data.getExtras().getParcelable(Multiplayer.EXTRA_INVITATION);
GamesClient.STATUS_OK
↓
GamesStatusCodes.STATUS_OK
ステータスコードは他にもありますが、GamesClientに定義していたものをGamesStatusCodesにまとめたようです。


参考
playgameservices/android-samples

2014/05/09

Google Play Services4.3からAPIの一部が変更になっているので、それの対応[ターンベースマルチプレイヤー編]

Google Play Servicesが3月に4.3(2014/05/09現在は4.4)になり、API周りに変更があります。
 しかしながら、サンプルの方は以前のままでした。今月に入りようやく変更があったので、SkeletonTbmpを例に記述します。 (※ただし、現時点ではgradle版しか変更されておらず、eclipse版はそのままでした。)

TurnBasedMatch match = data.getParcelableExtra(Games.EXTRA_TURN_BASED_MATCH);
↓
TurnBasedMatch match = data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH);

final ArrayList invitees = data.getStringArrayListExtra(GamesClient.EXTRA_PLAYERS);
↓
final ArrayList invitees = data.getStringArrayListExtra(Games.EXTRA_PLAYER_IDS);

int minAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);
↓
int minAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);

int maxAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);
↓
int maxAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);

GamesClient.STATUS_OK
↓
GamesStatusCodes.STATUS_OK
ステータスコードは他にもありますが、GamesClientに定義していたものをGamesStatusCodesにまとめたようです。


参考
playgameservices/android-samples

2014/04/15

AndroidからAzure Libraries For Java を利用して、AzureのBlob Storageに写真をそのまま追加することはできそうにない

AndroidからAzure Libraries For Java を利用して、AzureのBlob Storageに写真を追加しようと試みましたが、java.lang.VerifyErrorが発生してうまくいきませんでした。


同様の問題を抱えた人が
エラー内容は、 
java.lang.VerifyError: com/microsoft/windowsazure/services/core/storage/utils/Utility

原因は、下記をインポートしているからだと思います。Androidでは使えませんでした。
 import javax.xml.stream.*;

参考

Asp.Netを利用するとうまくいくようです。

(Solved)Using asp.net WebService & Android to upload Image to Azure Blob Storage? - Stack Overflow

2014/04/14

BasaGameUtilsが新しくなり、それに伴い既存プログラムを修正する

BasaGameUtilsが新しくなっていました。 それに伴い、メソッドなどの呼び出しに変更がありましたので、TypeANumberを例に記述します。

startActivityForResult(getGamesClient().getAchievementsIntent(), RC_UNUSED);
↓
startActivityForResult(Games.Achievements.getAchievementsIntent(getApiClient()), RC_UNUSED);

startActivityForResult(getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
↓
startActivityForResult(Games.Leaderboards.getAllLeaderboardsIntent(getApiClient()), RC_UNUSED);

getGamesClient().unlockAchievement(getString(R.string.achievement_prime));
↓
Games.Achievements.unlock(getApiClient(), getString(R.string.achievement_prime));

getGamesClient().incrementAchievement(getString(R.string.achievement_really_bored), mOutbox.mBoredSteps);
↓
Games.Achievements.increment(getApiClient(), getString(R.string.achievement_really_bored), mOutbox.mBoredSteps);

getGamesClient().submitScore(getString(R.string.leaderboard_easy), mOutbox.mEasyModeScore);
↓
Games.Leaderboards.submitScore(getApiClient(), getString(R.string.leaderboard_easy), mOutbox.mEasyModeScore);

Player p = getGamesClient().getCurrentPlayer();
↓
Player p = Games.Players.getCurrentPlayer(getApiClient());

2014/01/15

Sound Forge Audio Studio 10.0 に音楽ファイル(mp3)を読み込むと強制終了する

Sound Forge Audio Studio 10.0 にファイル名にスペースを含む音楽ファイル(mp3)を読み込む(ドラッグ&ドロップする)と強制終了しました。

バージョンは、10.0.178および10.0.252(2014/01/15最新)でも強制終了します。

mp3plug2.dllによるものだったので、おそらくコーデックの問題だろうと思い、ソフトを使って変換を行いました(このときは再度mp3に)。

すると強制終了しなくなったので、ひとまず解決しました。