cocos2d-xにScoreCenterを入れた時のメモ。
使い方的にはc++のクラスからjniで呼び出す形で実装した。
javaのメソッドに関しては面倒だったんで全部staticにした。
手順など
基本的にはSDKにDocumentが添付されているので、それに従っていけばOKでした。
1. proj.android/AndroidManifest.xmlを設定
2. proj.android/libs/にSDKのjarファイルを置く
3. c++側のコードを書く。(以下サンプル)
#include "cocos2d.h"
USING_NS_CC;
class ScoreCenter : public CCObject {
public:
static bool isAvailable();
static void login();
static void postScore(const char* key, const char* score);
static void showRanking(const char* key);
};
#include "cocos2d.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
USING_NS_CC;
#include "ScoreCenter.h"
#include <jni.h>
#include "jni/JniHelper.h"
#define CLASS_NAME "hoge/huga/SC"
bool ScoreCenter::isAvailable() {
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME,
"isAvailable", "()Z")) {
jboolean result = t.env->CallStaticBooleanMethod(t.classID, t.methodID);
if (result == JNI_TRUE) {
return true;
} else {
return false;
}
}
return false;
}
void ScoreCenter::login() {
if (!isAvailable()) {
return;
}
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME,
"login", "()V")) {
t.env->CallStaticVoidMethod(t.classID, t.methodID);
t.env->DeleteLocalRef(t.classID);
}
}
void ScoreCenter::postScore(const char* key, const char* score) {
if (!isAvailable()) {
return;
}
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME,
"postScore", "(Ljava/lang/String;Ljava/lang/String;)V")) {
jstring jkey = t.env->NewStringUTF(key);
jstring jscore = t.env->NewStringUTF(score);
t.env->CallStaticVoidMethod(t.classID, t.methodID, jkey, jscore);
t.env->DeleteLocalRef(jkey);
t.env->DeleteLocalRef(jscore);
t.env->DeleteLocalRef(t.classID);
}
}
void ScoreCenter::showRanking(const char* key) {
if (!isAvailable()) {
return;
}
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME,
"showRanking", "(Ljava/lang/String;)V")) {
jstring jkey = t.env->NewStringUTF(key);
t.env->CallStaticVoidMethod(t.classID, t.methodID, jkey);
t.env->DeleteLocalRef(jkey);
t.env->DeleteLocalRef(t.classID);
}
}
#endif
4. java側のコードを書く。(以下サンプル)
package hoge.huga;
import android.app.Activity;
import java.lang.String;
import android.content.Context;
import org.cocos2dx.lib.Cocos2dxActivity;
import **********ScoreCenter; (※ここはDocument読んで対応してください)
public class SC {
private static ScoreCenter instance = null;
public static boolean isAvailable() {
return (android.os.Build.VERSION.SDK_INT >= 7);
}
private static void init() {
if (SC.instance == null) {
final Context context = Cocos2dxActivity.getContext();
Activity activity = (Activity)context;
activity.runOnUiThread(new Runnable() {
public void run() {
SC.instance = ScoreCenter.getInstance();
SC.instance.initialize(context.getApplicationContext());
SC.instance.hello();
}
});
}
}
public static void login() {
SC.init();
}
public static void postScore(String key, String score) {
SC.instance.postScore(key, score);
}
public static void showRanking(final String key) {
Activity activity = (Activity)Cocos2dxActivity.getContext();
activity.runOnUiThread(new Runnable() {
public void run() {
SC.instance.show(key);
}
});
}
}
こんなかんじ。
ちょっとハマった点として、ScoreCenterのinitialize()呼んだ時か、hello()を呼び出した時にログイン可否チェックが入ってログイン画面が表示されるのかなと思ってたんですが、
show()を呼び出した後にログインして貰わないといけないらしい。
まぁ、ログインする前にpostScoreしても送信NGとなって、ローカルに保存されていて、後からログインした時に送られるようなので問題ないと言えば問題ないですが、出来ればログインチェックのメソッドがあるといいな。
- 投稿タグ
- cocos2d-x, ScoreCenter
