eclipseでGoogle Play Game Serviceを実装する
Androidアプリの開発で、
開発環境は Windows8.1で eclipseです。
cocos2d-xとはあまり関係ありません。
Google Play Developer Console のゲームサービスでアプリを登録して、
テストができる状態にしておいてください。
まず、Google Play Game Serviceのサンプルをダウンロードします。
https://github.com/playgameservices/android-basic-samples
つぎに、ワークスペースにgoogle-play-services_libをインポートします。
File->Importをクリックして、
Android->Existing Android Code Into Workspaceをクリックした後にNextをクリックします。
なかったら、Android SDK Managerでgoogle_play_servicesをインストールしましょう。
次に、Browseでライブラリを探します。
Androidsdkを見つけて、\extras\google\google_play_services\libproject\google-play-services_lib
を選択。Finishをクリックします。
そして、プロジェクトのプロパティを開いて
Androidを選択。
Addを押します。
google-play-services_lib
と出てくるので選択してOKを押します。
その次に、さっきダウンロードしたサンプルを展開して、
android-basic-samples-master\BasicSamples\libraries\BaseGameUtils\src\main\java\com\google\example\games\basegameutils
の中にあるBaseGameActivity以外のファイルをプロジェクトのActivityがあるところにコピペします。
すると、コピペしたファイルの
android.R.stringの部分がエラーになっていると思うので、
res\valuesに
Android xmlファイルである、
ids.xml ファイルを作ります。
ids.xmlファイルの resourcesタグの中に
<string name="app_id">App_ID</string>
を追加します。 App_IDは、Google Playのゲームサービスの、追加したゲームの名前の下にある数字のことです。
strings.xmlを、
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ゲームの名前</string> <string name="gamehelper_sign_in_failed">Failed to sign in. Please check your network connection and try again.</string> <string name="gamehelper_app_misconfigured">The application is incorrectly configured. Check that the package name and signing certificate match the client ID created in Developer Console. Also, if the application is not yet published, check that the account you are trying to sign in with is listed as a tester account. See logs for more information.</string> <string name="gamehelper_license_failed">License check failed.</string> <string name="gamehelper_unknown_error">Unknown error.</string> <string name="sign_in_failed">Failed to sign in. Please check your network connection and try again.</string> <string name="app_misconfigured">The application is incorrectly configured. Check that the package name and signing certificate match the client ID created in Developer Console. Also, if the application is not yet published, check that the account you are trying to sign in with is listed as a tester account. See logs for more information.</string> <string name="license_failed">License check failed.</string> <string name="unknown_error">Unknown error.</string> <string name="signing_in">Signing in with Google</string> <string name="signing_out">Signing out</string> <string name="signed_out_greeting">Hello, anonymous user (not signed in)!</string> <string name="achievement_prime_toast_text">Prime score!</string> <string name="achievement_arrogant_toast_text">Arrogant (requested maximum score)!</string> <string name="achievement_humble_toast_text">Humble! (requested 0 score)</string> <string name="achievement_leet_toast_text">L33t! (got 1337 score)</string> <string name="achievement">Achievement</string> <string name="your_progress_will_be_uploaded">Your existing achievements and score will be uploaded shortly.</string> <string name="what_score_do_you_deserve">What score do you think you deserve?</string> <string name="initial_input">0000</string> </resources>
と書き換えます。 その次に、エラーを出しているコピペしたファイルに
import パッケージ名.R;
と、入力します。 そして、Activityを次のように書き換えます。
import org.cocos2dx.lib.Cocos2dxActivity; import android.content.Intent; import android.os.Bundle; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; public class AppActivity extends Cocos2dxActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, GameHelper.GameHelperListener { private GameHelper mGameHelper; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES); mGameHelper.setup(this); } @Override protected void onStart() { super.onStart(); if (mGameHelper != null) { mGameHelper.connect(); } } @Override protected void onStop() { super.onStop(); if (mGameHelper != null) { mGameHelper.disconnect(); } } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onDestroy() { super.onDestroy(); } @Override public void onConnected(Bundle connectionHint) { // TODO Auto-generated method stub // The player is signed in. Hide the sign-in button and allow the // player to proceed. } @Override public void onConnectionSuspended(int cause) { if (mGameHelper != null) { mGameHelper.connect(); } } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // TODO Auto-generated method stub if (mGameHelper != null) { mGameHelper.onConnectionFailed(connectionResult); } } protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (mGameHelper != null) { mGameHelper.onActivityResult(requestCode, resultCode, intent); } } @Override public void onSignInFailed() { // TODO Auto-generated method stub } @Override public void onSignInSucceeded() { // TODO Auto-generated method stub mGameHelper.onSignInSucceeded(); } }
つぎにAndroidManifest.xmlファイルの application タグの中に
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
を追加します。 これで、起動した直後にサインイン画面が現れます。 デバッグモードで起動してもサインイン画面は見れますが、サインインできません。 著名されたAPKファイルをインストールして起動してください。 リーダーボードにスコアを追加する機能を使うには、
String leaderboardID = "リーダーボードのID"; int score = 0;//登録したいスコア Games.Leaderboards.submitScore(mGoogleApiClient, leaderboardID, score);
リーダーボードを開くには、
String leaderboardID = "リーダーボードのID"; mActivity.startActivityForResult(Games.Leaderboards.getLeaderboardIntent( mGoogleApiClient, leaderboardID),REQUEST_LEADERBOARD);
を使います。
REQUEST_LEADERBOARDには、任意の整数を使ってください。 ただ、このGameHelper.javaでは、リーダーボードを開いて、ログアウトした後、 もう一度リーダーボードを開こうとするとゲームが強制終了してしまいます! こんなことするプレイヤーはあまりいないと思いますが。 なので、GameHelper.javaのonActivityResultの
if (requestCode != RC_RESOLVE) { debugLog("onActivityResult: request code not meant for us. Ignoring."); return; }
の部分を を次のようにします。
if (requestCode != RC_RESOLVE) { debugLog("onActivityResult: request code not meant for us. Ignoring."); if (responseCode == GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED) { disconnect(); } return; }
これで、ログアウトした後にdisconnect()が呼ばれるので、強制終了しなくなるはずです。
Unity3dと違って面倒くさいですね。
参考
https://developers.google.com/games/services/