がおまる開発ブログ

cocos2d-xやlevelhelperを使って iPhone/Androidアプリの作り方を解説します

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

cocos2d-xでjniを使ってみる

jniって面倒くさいですよね(^_^;)
でもやっとけばcocos2d-x ⇔ java間のやり取りはかなり楽になると思います。

先ずはファイルを作ってみましょう。
下記例はClassesフォルダにInterfaceJNI.cppとInterfaceJNI.hファイルを新規で作成しています。

2013061401.png


#include <string.h>
#include "cocos2d.h"

using namespace std;
using namespace cocos2d;

class InterfaceJNI
{
public:
static void func1();
};




#include "InterfaceJNI.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <android/log.h>

// 呼び出すメソッドが書かれているパッケージ名とjavaクラス名
#define CLASS_NAME "com/marnishi/jniTest/jniTest"

void InterfaceJNI::func1()
{
JniMethodInfo t;
// クラス名とメソッド名を指定します。
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func1", "()V")) {
// voidなので、CallStaticVoidMethodで呼ぶ
t.env->CallStaticVoidMethod(t.classID, t.methodID);
// 解放
t.env->DeleteLocalRef(t.classID);
}
}



cocos2d-x側のHelloWorldScene.cppとかで呼び出してみましょう。

#include "HelloWorldScene.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "JNICalls/InterfaceJNI.h"
#endif

USING_NS_CC;

bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}

this->jniLoad();

}

void HelloWorld::jniLoad()
{
// jniはandroid用専用なので、#ifで読み分ける
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
InterfaceJNI::func1();
#endif
}


次にEclipseを起動して、java側の記述を行います。
2013061402.png


package com.marnishi.jniTest;

import org.cocos2dx.lib.Cocos2dxActivity;

import android.os.Bundle;

public class jniTest extends Cocos2dxActivity{

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}

public static void func1() {
System.out.println("func1 call");
}

static {
System.loadLibrary("game");
}

}


【様々な型の呼び出しや戻り値】
voidだけではなく、他の型などで呼び出す場合のサンプルです。

cocos2d-x側

#include <string.h>
#include "cocos2d.h"

using namespace std;
using namespace cocos2d;

class InterfaceJNI
{
public:
static void func1();
static void func2(int value);
static void func3(bool value);
static void func4(const char *value);
static void func5(const char *value1, int value2, bool value3);
static int func6();
static std::string func7();
};




#include "InterfaceJNI.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <android/log.h>

// 呼び出すメソッドが書かれているパッケージ名とjavaクラス名
#define CLASS_NAME "com/marnishi/jniTest/jniTest"

void InterfaceJNI::func1()
{
JniMethodInfo t;
// クラス名とメソッド名を指定します。
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func1", "()V")) {
// voidなので、CallStaticVoidMethodで呼ぶ
t.env->CallStaticVoidMethod(t.classID, t.methodID);
// 解放
t.env->DeleteLocalRef(t.classID);
}
}

/*
// javaでの呼び出し
public static void func1() {
System.out.println("func1 call");
}
*/

// 引数にint型を与える場合(void)
void InterfaceJNI::func2(int value)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func2", "(I)V")) {
t.env->CallStaticVoidMethod(t.classID, t.methodID, value);
t.env->DeleteLocalRef(t.classID);
}
}

/*
public static void func2(int value) {
System.out.println("func2 val=" + value);
}
*/

// 引数にbool型を与えた場合
void InterfaceJNI::func3(bool value)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func3", "(Z)V")) {
t.env->CallStaticVoidMethod(t.classID, t.methodID, value);
t.env->DeleteLocalRef(t.classID);
}
}
/*
public static void func3(boolean value) {
System.out.println("func3 val=" + value);
}
*/

// 引数にcharを渡す場合
void InterfaceJNI::func4(const char *value)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func4", "(Ljava/lang/String;)V")) {
// ★パラメータがStringの場合はjstringに変換する
// java側は「String」にする。UTF8変換
jstring stringArg1 = t.env->NewStringUTF(value);
t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1);

t.env->DeleteLocalRef(stringArg1);// ★jstringは解放が必要です。
t.env->DeleteLocalRef(t.classID);
}
}
/*
public static void func4(String value) {
System.out.println("func4 val=" + value);
}
*/

// 引数に、char、int、boolの複数を指定する場合
void InterfaceJNI::func5(const char *value1, int value2, bool value3)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func5", "(Ljava/lang/String;IZ)V")) {
jstring stringArg1 = t.env->NewStringUTF(value1);
t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1, value2, value3);

t.env->DeleteLocalRef(stringArg1);
t.env->DeleteLocalRef(t.classID);
}
}

/*
public static void func5(String value1, int value2, boolean value3) {
System.out.println("func5 val=" + value1 + " int=" + value2 + " bool=" + value3);
}
*/

// 戻り値がint
int InterfaceJNI::func6()
{
int ret = 0;

JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func6", "()I")) {
ret = t.env->CallStaticIntMethod(t.classID, t.methodID);
t.env->DeleteLocalRef(t.classID);
}

return ret;
}

/*
public static int func6() {
return 12345;
}
*/

// 戻り値が文字列
std::string InterfaceJNI::func7()
{
std::string ret;
JniMethodInfo t;

if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func7", "()Ljava/lang/String;")) {
jstring jStr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);
const char* str = t.env->GetStringUTFChars(jStr, NULL);
ret = str;

t.env->ReleaseStringUTFChars(jStr,str);
t.env->DeleteLocalRef(t.classID);
}

return ret;

}

/*
public static String func7() {
return "本日は晴天なり";
}
*/



これで基礎的部分は抑えられたと思います。
次回はjava→cocos2d-xのメソッドを呼び出す方法です。



スポンサーサイト

cocos2d-xにAdmobメディエーションのカスタムイベントを導入する(Android編)

cocos2d-xにAdmobメディエーションのカスタムイベントを導入していきます。
Googleの解説が糞すぎてワケワカウッヒャーなので、

図解入りでわかりやすく導入していきます。

※このやり方でおかしくなっても責任は取れませんので悪しからずm(_ _)m

メディエーションの設定を行う

Admobの管理サイトにログインしてください。

広告ネットワーク メディエーションを選択
2013052501.png

名前は好きなもので結構です。
プラットフォームは今回はAndroidの導入手順なので、「Android」を選択
広告サイズはバナーを出したいので、「バナー 320x50」を選択
自動更新したい場合は、更新間隔を設定しましょう。

2013052502.png

メディエーションIDは後で使いますので、メモっておきます。
カスタムイベントを追加していきましょう。
2013052503.png

Labelはわかりやすい名前を付けましょう
Class Nameにパッケージ名とクラス名を入力しましょう。今回は「jp.gaomar.mediation.AdCustomNend」としました。
Parameterを渡したい場合は入力してください。
2013052504.png

2013052505.png


Eclipseでの手順

ここからは、Eclipseにて設定していきます。
先ずは各社の広告SDKをプロジェクトのlibsフォルダにコピーしていきましょう。

2013052506.png

続いて、メディエーションのSDKをコピーします。
2013052507.png


Eclipseを起動して、プログラムを書いて行きましょう。
AndroidManifest.xmlを開いてください。

2013052509.png


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.gaomar.mediation"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk android:minSdkVersion="8"/>
<uses-feature android:glEsVersion="0x00020000" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application android:label="@string/app_name"
android:icon="@drawable/icon">

<activity android:name=".GaomarTest"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

<meta-data android:name="Adlantis_Publisher_ID" android:value="xxxxxxxxxxxx" />

</application>
<supports-screens android:largeScreens="true"
android:smallScreens="true"
android:anyDensity="true"
android:normalScreens="true"/>
</manifest>



新規クラスを追加してください。
CustomAd.javaを作成します。
2013052511.png


package jp.gaomar.mediation;

import android.app.Activity;

import com.google.ads.AdSize;
import com.google.ads.mediation.MediationAdRequest;
import com.google.ads.mediation.customevent.CustomEventBanner;
import com.google.ads.mediation.customevent.CustomEventBannerListener;

public abstract class CustomAd implements CustomEventBanner {


@Override
public void requestBannerAd(
final CustomEventBannerListener listener,
final Activity activity,
String label,
String serverParameter,
AdSize adSize,
MediationAdRequest request,
Object customEventExtra) {

}


@Override
public void destroy() {
}

}



続いて、先程メディエーションの管理画面で指定した
クラス名で新規作成します。「AdCustomNend.java」を作成しましょう。

2013052512.png

ad_area.xmlを新規で作成しましょう。
2013052515.png

中身はこんな感じで〜

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ad_area"
android:layout_width="320dip"
android:layout_height="50dip"
android:gravity="center_horizontal">
</LinearLayout>





package jp.gaomar.mediation;

import net.nend.android.NendAdView;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import com.google.ads.AdSize;
import com.google.ads.mediation.MediationAdRequest;
import com.google.ads.mediation.customevent.CustomEventBannerListener;

public class AdCustomNend extends CustomAd{
private static ViewGroup adParentView;
private static NendAdView adView = null;

private final int nendSpot_id = xxxxx;
private final String nendApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

@Override
public void requestBannerAd(CustomEventBannerListener listener,
Activity activity, String label, String serverParameter,
AdSize adSize, MediationAdRequest request,
Object customEventExtra) {

super.requestBannerAd(listener, activity, label, serverParameter, adSize,request,customEventExtra);
if(adView!=null){
onRecivedAd(listener);
return;
}

try {
LayoutInflater inflater = activity.getLayoutInflater();
adParentView = (ViewGroup)inflater.inflate(R.layout.ad_area, null);
adView = null;
adView = new NendAdView(activity, nendSpot_id, nendApiKey);
adView.loadAd();

adParentView.addView(adView);
} catch (Exception e) {
listener.onFailedToReceiveAd();
return;
}
onRecivedAd(listener);
}

private void onRecivedAd(CustomEventBannerListener listener) {
try {
listener.onReceivedAd(adParentView);
} catch (Exception e) {
listener.onFailedToReceiveAd();
}
}

}



メディエーション全体を管理するMyAds.javaを作りましょう。
これは別に好きなクラス名で結構です。
2013052510.png


package jp.gaomar.mediation;


import android.app.Activity;
import android.widget.LinearLayout;

import com.google.ads.AdRequest;
import com.google.ads.AdSize;
import com.google.ads.AdView;

public class MyAds {
private Activity mActivity;
private LinearLayout mLayout;

private final String myAdID = "メディエーションIDを入力";

public MyAds(Activity act, LinearLayout layout) {
mActivity = act;
mLayout = layout;
adInit();
}

/**
* 広告初期化
*/
private void adInit() {
// Create the adView
final AdView adView = new AdView(mActivity, AdSize.BANNER, myAdID);

// Add the adView to it
mLayout.addView(adView);

AdRequest adRequest = new AdRequest();

// Initiate a generic request to load it with an ad
adView.loadAd(adRequest);

}
}



最後にCocos2dxActivity.javaを編集します。

2013052514.png


/****************************************************************************
Copyright (c) 2010-2013 cocos2d-x.org

http://www.cocos2d-x.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package org.cocos2dx.lib;

import jp.gaomar.mediation.MyAds;

import org.cocos2dx.lib.Cocos2dxHelper.Cocos2dxHelperListener;

import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {
// ===========================================================
// Constants
// ===========================================================

private static final String TAG = Cocos2dxActivity.class.getSimpleName();

// ===========================================================
// Fields
// ===========================================================

private Cocos2dxGLSurfaceView mGLSurfaceView;
private Cocos2dxHandler mHandler;
private static Context sContext = null;

// 広告レイアウト
private LinearLayout myAdView;

public static Context getContext() {
return sContext;
}

// ===========================================================
// Constructors
// ===========================================================

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sContext = this;
this.mHandler = new Cocos2dxHandler(this);

this.init();

Cocos2dxHelper.init(this, this);
}

// ===========================================================
// Getter & Setter
// ===========================================================

// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================

@Override
protected void onResume() {
super.onResume();

Cocos2dxHelper.onResume();
this.mGLSurfaceView.onResume();
}

@Override
protected void onPause() {
super.onPause();

Cocos2dxHelper.onPause();
this.mGLSurfaceView.onPause();
}

@Override
public void showDialog(final String pTitle, final String pMessage) {
Message msg = new Message();
msg.what = Cocos2dxHandler.HANDLER_SHOW_DIALOG;
msg.obj = new Cocos2dxHandler.DialogMessage(pTitle, pMessage);
this.mHandler.sendMessage(msg);
}

@Override
public void showEditTextDialog(final String pTitle, final String pContent, final int pInputMode, final int pInputFlag, final int pReturnType, final int pMaxLength) {
Message msg = new Message();
msg.what = Cocos2dxHandler.HANDLER_SHOW_EDITBOX_DIALOG;
msg.obj = new Cocos2dxHandler.EditBoxMessage(pTitle, pContent, pInputMode, pInputFlag, pReturnType, pMaxLength);
this.mHandler.sendMessage(msg);
}

@Override
public void runOnGLThread(final Runnable pRunnable) {
this.mGLSurfaceView.queueEvent(pRunnable);
}

// ===========================================================
// Methods
// ===========================================================
public void init() {

// FrameLayout
ViewGroup.LayoutParams framelayout_params =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
FrameLayout framelayout = new FrameLayout(this);
framelayout.setLayoutParams(framelayout_params);

// Cocos2dxEditText layout
ViewGroup.LayoutParams edittext_layout_params =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
Cocos2dxEditText edittext = new Cocos2dxEditText(this);
edittext.setLayoutParams(edittext_layout_params);

// ...add to FrameLayout
framelayout.addView(edittext);

// Cocos2dxGLSurfaceView
this.mGLSurfaceView = this.onCreateView();

// ...add to FrameLayout
framelayout.addView(this.mGLSurfaceView);

// Switch to supported OpenGL (ARGB888) mode on emulator
if (isAndroidEmulator())
this.mGLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);

this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
this.mGLSurfaceView.setCocos2dxEditText(edittext);

// 広告ビュー設定
RelativeLayout adMain = new RelativeLayout(this);

// メディエーション設定
myAdView = new LinearLayout(this);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
(int)(50 * getResources().getDisplayMetrics().density));
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
myAdView.setGravity(Gravity.CENTER_HORIZONTAL);
myAdView.setLayoutParams(layoutParams);

this.runOnUiThread(new Runnable() {
@Override
public void run() {
new MyAds(Cocos2dxActivity.this, myAdView);

}
});

adMain.addView(myAdView);

framelayout.addView(adMain);

// Set framelayout as the content view
setContentView(framelayout);
}


public Cocos2dxGLSurfaceView onCreateView() {
return new Cocos2dxGLSurfaceView(this);
}

private final static boolean isAndroidEmulator() {
String model = Build.MODEL;
Log.d(TAG, "model=" + model);
String product = Build.PRODUCT;
Log.d(TAG, "product=" + product);
boolean isEmulator = false;
if (product != null) {
isEmulator = product.equals("sdk") || product.contains("_sdk") || product.contains("sdk_");
}
Log.d(TAG, "isEmulator=" + isEmulator);
return isEmulator;
}

// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}



うまいこといけば、下に出るはず!
上に出したい場合は、167行目をコメントアウトすればオッケー!
2013052516.png

cocos2d-xにAdWhirlを導入する (Android編)

途中のadwhirl管理サイトにアプリを登録して、カスタムイベント登録する部分までは、
前回のiOS編を参考にしてください。

こちらからAndroid用のSDKをダウンロードしてください。

AdWhirlを組み込む

ダウンロードしてきたjarファイルをproj.android→libsフォルダへコピーしましょう。
2013050101.png

他社SDKをダウンロード

今回はnendSDK-2.0.0とi-mobileSDK_1.4.0での説明です。
同じようにダウンロードしてきたjarファイルをlibsフォルダへコピーしましょう

2013050102.png

2013050103.png

ビルドパスを通してください。
2013050104.png

これで準備はOKです。

マニフェストファイルの編集

2013050106.png


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.marnishi.Principal"
android:installLocation="preferExternal"
android:versionCode="3"
android:versionName="1.1.0">

<uses-sdk android:minSdkVersion="8"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application android:label="@string/app_name"
android:debuggable="false"
android:icon="@drawable/icon">

<activity android:name=".Principal"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

<meta-data android:name="i-mobile_Publisher_ID" android:value="i-mobileのID" />
</application>
<supports-screens android:largeScreens="true"
android:smallScreens="true"
android:anyDensity="true"
android:normalScreens="true"/>
</manifest>

ネットワークのパーミッションとi-mobile用のIDの設定とadwhirl用の設定を記述します

ソースを編集する

新規classを作成してください。
僕の場合はAds.javaというのを作成しました。
2013050105.png


package com.marnishi.Principal;


import jp.co.imobile.android.AdRequestResult;
import jp.co.imobile.android.AdView;
import jp.co.imobile.android.AdViewRequestListener;
import net.nend.android.NendAdView;
import android.app.Activity;
import android.widget.LinearLayout;

import com.adwhirl.AdWhirlLayout;
import com.adwhirl.AdWhirlLayout.AdWhirlInterface;

public class Ads implements AdWhirlInterface{
private Activity mActivity;
private LinearLayout mLayout;

private AdWhirlLayout adWhirlLayout;
private jp.co.imobile.android.AdView imobileAd;
private NendAdView nendAd;

// nend用
private final int nendSpot_id = xxxxxx;
private final String nendApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// i-mobile用
private final int iMobileMediaID = xxxxx;
private final int iMobileSpotID = xxxxx;
// adwhirl用
private final String adWhirlID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

public Ads(Activity act, LinearLayout layout) {
mActivity = act;
mLayout = layout;
adInit();
}

/**
* 広告初期化
*/
private void adInit() {
// i-mobile初期化
imobileAd = AdView.createForAdWhirl(mActivity, iMobileMediaID, iMobileSpotID);
// adwhirl初期化(AdWhirl管理画面のSDK Key:を入力する)
adWhirlLayout = new AdWhirlLayout(mActivity, adWhirlID);
adWhirlLayout.setAdWhirlInterface(this);
mLayout.addView(adWhirlLayout);

}

/**
* カスタムイベントのnend処理
*/
public void nend() {
nendAd = null;
nendAd = new NendAdView(mActivity, nendSpot_id, nendApiKey);
nendAd.loadAd();

adWhirlLayout.adWhirlManager.resetRollover();
adWhirlLayout.removeAllViews();
adWhirlLayout.addView(nendAd);
adWhirlLayout.rotateThreadedDelayed();
}

/**
* カスタムイベントimobile処理
*/
public void imobile() {
imobileAd.setOnRequestListener(new AdViewRequestListener() {
@Override
public void onCompleted(AdRequestResult result, AdView sender) {
adWhirlLayout.adWhirlManager.resetRollover();
adWhirlLayout.removeAllViews();
adWhirlLayout.addView(sender);
adWhirlLayout.rotateThreadedDelayed();
}
@Override
public void onFailed(AdRequestResult result, AdView sender) {
adWhirlLayout.rollover();
}
});
// 広告取得開始
imobileAd.start();
}

@Override
public void adWhirlGeneric() {
// TODO 自動生成されたメソッド・スタブ

}


}


続いてCocos2dxActivity.javaを編集します。
2013050107.png


public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {
private Cocos2dxGLSurfaceView mGLSurefaceView;
private Cocos2dxHandler mHandler;
private static Cocos2dxActivity myref;

// 幅、または高さいっぱいに広げる
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
// ジャストのサイズにする
private final int FP = LinearLayout.LayoutParams.FILL_PARENT;
// 広告レイアウト
private LinearLayout adView;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

this.init();

Cocos2dxHelper.init(this, this);

}
/**
* 初期処理
*/
public void init() {
// Init handler
this.mHandler = new Cocos2dxHandler(this);

// FrameLayout
ViewGroup.LayoutParams framelayout_params =
new ViewGroup.LayoutParams(FP,FP);
FrameLayout framelayout = new FrameLayout(this);
framelayout.setLayoutParams(framelayout_params);

// Cocos2dxEditText layout
ViewGroup.LayoutParams edittext_layout_params =
new ViewGroup.LayoutParams(FP,WC);
Cocos2dxEditText edittext = new Cocos2dxEditText(this);
edittext.setLayoutParams(edittext_layout_params);

// ...add to FrameLayout
framelayout.addView(edittext);

// Cocos2dxGLSurfaceView
this.mGLSurefaceView = this.onCreateGLSurfaceView();

// ...add to FrameLayout
framelayout.addView(mGLSurefaceView);

mGLSurefaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
mGLSurefaceView.setCocos2dxEditText(edittext);

RelativeLayout adMain = new RelativeLayout(this);

// 広告表示するViewの初期化
adView = new LinearLayout(this);
RelativeLayout.LayoutParams layoutParams =
new RelativeLayout.LayoutParams(FP, (int)(50 * getResources().getDisplayMetrics().density));
// 下に表示する場合は有効にしてください
// layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

// 中央に表示
adView.setGravity(Gravity.CENTER_HORIZONTAL);
adView.setLayoutParams(layoutParams);

this.runOnUiThread(new Runnable() {
@Override
public void run() {
// adwhirl初期化
new Ads(Cocos2dxActivity.this, adView);
}
});

adMain.addView(adView);
framelayout.addView(adMain);

// Set framelayout as the content view
setContentView(framelayout);
}
}



これで起動すれば、広告が表示されると思います。



CCEditBoxで入力した文字数を取得する

CCEditBoxを使って、入力した文字数を取得しようとした時にえらいハマったので、
備忘録として残しておきます。


#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"

class InputLayer: public cocos2d::CCLayer, public cocos2d::extension::CCEditBoxDelegate {
public:
InputLayer();
~InputLayer();

static cocos2d::CCScene* scene();
virtual void editBoxEditingDidBegin(cocos2d::extension::CCEditBox* editBox);
virtual void editBoxEditingDidEnd(cocos2d::extension::CCEditBox* editBox);
virtual void editBoxTextChanged(cocos2d::extension::CCEditBox* editBox, const std::string& text);
virtual void editBoxReturn(cocos2d::extension::CCEditBox* editBox);


private:
cocos2d::extension::CCEditBox* m_pEditName;
int wlen(const char *str);
};



#include "InputLayer.h"

using namespace cocos2d;
using namespace extension;

////////////////////////////////////////////////////////////////////////////////
InputLayer::InputLayer()
{
CCSize visibleSize = CCEGLView::sharedOpenGLView()->getVisibleSize();
CCSize editBoxSize = CCSizeMake(visibleSize.width - 30, 30);
CCSize s = CCDirector::sharedDirector()->getWinSize();

m_pEditName = CCEditBox::create(editBoxSize, CCScale9Sprite::create("edit.png"));
m_pEditName->setPosition(ccp(s.width/2, s.height/2));
m_pEditName->setFontColor(ccRED);
m_pEditName->setPlaceHolder("入力してね");
m_pEditName->setMaxLength(15);
m_pEditName->setReturnType(kKeyboardReturnTypeDone);
m_pEditName->setDelegate(this);
addChild(m_pEditName);

}

////////////////////////////////////////////////////////////////////////////////
void InputLayer::editBoxEditingDidBegin(cocos2d::extension::CCEditBox* editBox)
{
}

////////////////////////////////////////////////////////////////////////////////
void InputLayer::editBoxEditingDidEnd(cocos2d::extension::CCEditBox* editBox)
{
}

////////////////////////////////////////////////////////////////////////////////
void InputLayer::editBoxTextChanged(cocos2d::extension::CCEditBox* editBox, const std::string& text)
{
int cnt = this->wlen(text.c_str());
CCLog("文字数=%d", cnt);
}

////////////////////////////////////////////////////////////////////////////////
void InputLayer::editBoxReturn(CCEditBox* editBox)
{
}

////////////////////////////////////////////////////////////////////////////////
// 文字数取得
int InputLayer::wlen(const char *buff)
{
if( buff == NULL ) return 0;

int count = 0;
int pos = 0;
int max_bytes = strlen( buff );

// BOM 読み飛ばし
if( max_bytes >= 3 )
{
if( static_cast<unsigned char>( buff[0] ) == 0xEF &&
static_cast<unsigned char>( buff[1] ) == 0xBB &&
static_cast<unsigned char>( buff[2] ) == 0xBF )
{
pos += 3;
}
}

while( pos < max_bytes )
{
++count; // 文字数カウント

if( ( buff[pos] & 0x80 ) == 0 )
{
++pos; // 1バイト文字
}
else
{
for( char tmp = buff[pos] & 0xfc; (tmp & 0x80); tmp = tmp << 1 )
{
++pos; // 複数バイト文字
}
}
}
return count;
}
////////////////////////////////////////////////////////////////////////////////
InputLayer::~InputLayer() {
}

////////////////////////////////////////////////////////////////////////////////
CCScene* InputLayer::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();

// add layer as a child to scene
InputLayer* layer = new InputLayer();
scene->addChild(layer);
layer->release();

return scene;
}

cocos2d-xにスコアセンターを組み込む

要望があったので、Android用マルジュ製のスコアセンターをcocos2d-xに
組み込んでみましょう。

Xcode側はJNIとか面倒くさいので、CCMessageBoxを使って実装していきます。
そりゃJNI使っても構いません。

スコアセンターの登録や必要なスコアボードIDの取得はこちらから確認してください。

では、Xcode側で、スコアを送りたいタイミングでこれを記述
下記例では100点をスコアセンターに送ります


#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
// スコア送信
CCMessageBox("submit_score@100", "command");

// スコアボード表示
CCMessageBox("showLeaderbord", "command");

#endif



続いてEclipse側にScoreCenterSDK-v1.0.1.jarにビルドパスを通してください。
s_20130325_0.png

続いてCocos2dxActivity.javaを編集します

public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {
// マルジュ用スコアセンター
private ScoreCenter mScoreCenter;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// マルジュ用スコアボード初期化
mScoreCenter = ScoreCenter.getInstance();
mScoreCenter.initialize(getApplicationContext());
mScoreCenter.hello();

}

@Override
public void showDialog(final String pTitle, final String pMessage) {

if (pTitle.equals("command")&&pMessage.indexOf("showLeaderbord") >= 0) {
// ランキングを表示
mScoreCenter.show();

} else if (pTitle.equals("command")&&pMessage.indexOf("submit_score") >= 0) {
// @マークで区切ってます
String[] str = pMessage.split("@");
mScoreCenter.postScore("取得したスコアボードID", str[1]);
}
}


}


これでスコアセンターにスコアを送信することが出来ました。


次のページ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。