がおまる開発ブログ

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

スポンサーサイト

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

あぷまがないと潜入レポ!

久しぶりの更新です。
先日「あぷまがないと」に参加してきました!
その時の潜入レポです!

中学生以来飛行機に乗ってなかったので、
1人で微妙にテンション上がって空港に早めについてうろちょろして、
飛行機が飛び立つまで手汗びっしょり(^_^;)

いや〜飛行機って速いですね!
50分ぐらいで東京に着いちゃうなんて!

2013081707.png

16時に新宿に着いて、1件打合せした後に会場入りしました。
謎の地下室に潜入!
2013081705.png


もちろんソッコーでコーラを注文!
炭酸が抜けきった甘いジュースでしたw

19時定刻通りにイベントがスタート!
前でおじさん達が一生懸命喋ってたけど、お腹が空いたので焼飯食べてましたw

2013081704.png

■第1部
「売れっ子にイロイロ質問コーナー」
気になった点を箇条書き!

・ラッキーさんが終始売れてないキャラを貫いていた
・ゲーキャスの@gamecast_blogさんが馬面で登場。直ぐに脱いじゃったので微妙な空気にw
@venomin_さんが先月の月収を直ぐぶっちゃけた!
・海外に視野を広げようぜ!
 hamonさんは海外の方がアプリ売れてるみたいね
・hamonさんがアルメニアに続いてアゼルバイジャンでも総合1位に!
 アゼルバイジャンもアルメニアも分からんw
・海野野球しようぜ!というギリギリなアプリが紹介w
・関係者席の上座に座っていた人が最後まで一体誰だったのか分からなかった
 誰も触れないのねw
・ココソラの@GREEN60357931遅れて登場!最後まで魂が抜けたような表情でしたw
 本人曰くタイミングミスったらしい
・hamonさんが良くしゃべる

■第2部「アプリ開発深イイ話コーナー」
セクシーミラー 編集不要の神自撮りアプリ App (無料)
@takatronixさんが色々お話してくれました。
パチンコ業界にもいたようで、画面の見せ方やUIが逸脱してました!
ああいう動きのあるものを一瞬でささっと組み込めるようになりたいぜ!

■休憩
会いたかった人たちに名刺交換してました。
ツイッターで服装だけの情報を手がかりに◯◯さんですか?と声をかけるも、人違いw

やっぱり首から名刺ぶら下げるか、お見合いパーティーのように
1人ずつ握手していって、気になった人の番号をメモっといて、後で特攻するのが良いかもw

お目当ての方とお話が出来たので良かったです。

■第3部「ゼニのハナシコーナー」
nendさんの為になる話しが聞けました。
オフレコ話しがあったので、あまり内容書けません(^_^;)

最後のじゃんけん大会の景品が凄すぎてワロタ
ミートアイレビュー権が欲しかった!
Goodiaさんがじゃんけんで勝ってたり、100万のタマゴの作者さんが商品ゲットしたり、
やっぱり売れっ子は運も味方にしてるんですね〜

僕は初戦敗退パターンですわw

なんだかんだで、19時〜22時までぶっ通し!
とても楽しかったです。

■2次会
@sn630さんが2次会の手配をしてくれました。
朝の5時まで飲み放題付きで2500円ポッキリ!歌舞伎町のど真ん中でこんな値段あり得ません!
あぷまがないとが黒字になったようで、更に500円オフの2000円!
ありがたやー

後で聞いたのですが、店員がブチ切れてたようですw

takatronixさんが和尚さんが本当に和尚さんだと思っていたらしい。

ワイワイみんなで飲んで食べて、
相変わらずツイッターキャラと違うココソラのグリンさんが真面目な話をしていて聞き入ってしまった
皆色々考えてて凄いよ!アプリ開発面白いぜ!

hamonさんが酔いつぶれて奥さんに絶対ブチ切れられてるに違いないね(・ω<)

結局3時頃まで騒いで、オリタクさんとやっぱり漫画喫茶探しw
こんな時間なのに、歌舞伎町は眠らない街ですね〜
うじゃうじゃ人が居てました。

「お兄さん達次のお店どう?」とか言って、
通せんぼするウザい兄さんが居てました。眠たいのに!
これアプリにしてみようかなw

3時に寝てもナースのお土産を探しに行く時間も考えないといけなかったので、
7時に起床!

頼まれていたマカロンとキティちゃんグッズを無事羽田空港でゲット!
そのまま東京観光一切せず、飛行機で大阪帰ってナースにお土産を渡すというハードスケジュールでしたw
もっと今度はゆとりを持って行こう…

2013081703.png

あぷまがさん!和尚さん!貴重な場を用意して頂き誠にありがとうございました!
次は大阪で何かあればイイなぁ〜
ただただ東京までの交通費が高い(´Д⊂ヽ
2013081701.png

スポンサーサイト

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のメソッドを呼び出す方法です。



5/30 Goodia潜入&勉強会レポ

先日5/30に名古屋で行われた勉強会のレポです。

以前Goodiaさんにandroid化でアドバイスしたら、
その後からandroid名誉アドバイザーとか勝手に言われてw(^_^;)
名古屋で勉強会があったので、ついでにGoodiaさんとこに顔を出しに行って来ました。

前日にBBQが行われてその時にもGoodia重鎮3人ともそこで顔合わせしており、
社長の深野さんが高いスイカを持ってこられて、お返しに高いメロンを持って参上しました。

最初に矢場とん行って味噌カツ丼を食らう!
2013053005.png
やっぱ矢場とんはうまいわ!

そこからGoodiaさんの開発拠点まで歩いて移動。
名古屋のコワーキングスペースで開発されています。

2013053001.png
Goodiaどーん!

2013053002.png
右側にいてる方がGoodia統括ディレクターの樗澤さん
真面目に仕事してるフリをして頂きましたw

2013053003.png
ここの絨毯緑色の部分がGoodiaスペースだそうです。
手前がデザイナーさん。

日々棒人間ばかり描かされて可哀想に(´Д⊂ヽ
中央に居てるのが社長の深野さんです。

こちらも真面目に仕事してるフリw
ジュースも飲み放題で快適な環境で日々あの面白いゲームが生まれているのですね〜

1週間に1本ペースで今後もアプリを出し続けるようです!
それが2チーム現在あるので、2本という事ですな(^_^;)
もうGoodiaが止まらない!お仕事の手伝いさせて!


名古屋勉強会

夕方に解散して勉強会に参加してきました。
気になったキーワードを箇条書き!

・自分にあったリフレッシュレートを探そう
 とあるアプリではリフレッシュレートを15秒→30秒に変えると収益があがった事例もあった模様。
・広告実装位置も工夫しよう
 ボタンの側とかCPCが激下がる可能性もあるよ
・海外ではサウンド広告もあるよ
・リリースタイミング
 LINEアプリは水曜日と日曜日が多いらしい。その日のリリースは避けるか…
・リワードは週末・連休前が多い
・レビュー媒体
 誰かに紹介したくなるようなアプリ要素があるとイイネ!
 土曜日〜月曜日にレビュー依頼メールは避けよう!
 ↑担当者もサラリーマン!休みのメールが溜まって見過ごされる可能性もあるよ!気をつけて
・ストア内SEO
 なんかHITしないなぁ〜と思ったら、説明文中のキーワードを変えてみて!
 ユーザーの行動を想像して仮説検証を繰り返そう!
・アイコン最適化
 一番悪かったのはグリーのアイコンがついた奴…←登録しないといけないってユーザーが思うらしい
・スクリーンショットのファーストビュー
 インパクトがあって、アテンションが強いのがいいよね!
・説明文すごく大事!
 できるだけ続きを読むを押さなくてもアプリの概要が分かるように完結に説明しよう!

いやぁ〜とても参考になる勉強会でしたね!
帰りは3時間かけて車で帰りましたw

また名古屋であれば是非参加させて頂きます!

hamonさん家に行ってきた

先ほどまでhamonさん家にご招待されて行って来ました!
メンバーは

くらべるぞう 】の @BracchoKurotanさん
俺の校長】の @sn630さん

の3人でhamon夫妻の自宅に行って来ました


早速大失態!
開発に集中しすぎて、出る時間ミスって集合時間に全然間に合わなくなるという早速残念なスタート
ヒゲもそる時間も無く、頭もボサボサで完全なニートスタイルで自宅へ行くことにww

お土産も忘れて完全に遅れてやってきて飯だけ食って帰った感じになってしまった(´Д⊂ヽ
次はちゃんとお土産持っていきます(^_^;)

30分も遅刻して、いざhamon御殿へ!
家の近所に橋下徹市長の家があるらしい

はぁ〜ここがあのおは朝で取材に来た家なのか〜と思いつつ潜入!
もう既に木村さんと中西さんがお待ちだった(´Д⊂ヽ
遅刻して申し訳ないっすm(_ _)m

もうhamonさんの奥様が既に料理を色々と作って頂き誠にありがとうございます!
ここで幾つか写真をお見せしましょう!

2013060604.png
このサラダが美味しかったです!
一番左のゴマ豆腐ですが、男どもが群がって1/3ぐらい食べてからタレが出てきて、
あまりのスピードに驚かれてしまったww

2013060603.png
メイン料理っす!
このお肉が物凄く柔らかくて美味しかった!!
ワインボトルほぼ使って煮込んだやつらしいっす

2013060602.png
可愛いお寿司に、サンドイッチ的なやつ
さっきのお肉でだいぶお腹いっぱいw


暫く談笑していると、@yukiyama800930さんが奥から何やら出して来ました。
2013060601.png

奥さんの嫁入り道具らしいっす!
懐かしのファミコンソフトが大量に!!

借りパクしたソフトなどがあり、裏に従兄弟の名前が書かれていたソフトもありました。

スーファミとファミコンがいつでも出来る体制になっており、
マリオカートも当然あって、急遽マリカー対戦が始まりました!

hamonさんは流石強い!ノコノコ使い!
マリオサーキット1でタイムアタック対戦もしましたが、ゴーストが抜かせなくて全く勝てず…
懐かしいマリカーでとても楽しめました!

その後も夜遅くまで色々と語り、
とても楽しい時間を過ごせました♪

今度はちゃんとお土産もって参上致しますm(_ _)m
今日はありがとうございました!

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

次のページ

FC2Ad

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