게임 개발/Cocos2d-x

Cocos2d-x 3.0 베타2 안드로이드에서 애드몹(Admob) 달기

날개 2014. 3. 4. 13:25

Cocos2d-x가 기존 2.x대 버전과는 달리 3.0으로 오면서 안드로이드의 메인 액티비티가 일반 액티비티가 아닌 NativeActivity로 변경되었습니다.


NativeActivity를 사용하면, 자바 호출이 필요하지 않는 프로젝트에서는 성능향상을 가져올 수 있다고 합니다만, 문제는 자바 호출이 필요할 경우 입니다.


대표적인 것이 인앱결제라든지 랭킹플랫폼, 광고 플랫폼등이 있겠지요.


3.0 베타2 버전에서는 알파버전과는 달리 기본적으로 Cocos2dxActivity.java 가 들어있습니다만 (알파버전은 이조차도 없어서 직접 생성해야 했습니다) 기존 2.x대의 일반 액티비티에서 애드몹과 같은 광고 플랫폼을 올리는 방식이 더이상 통하지 않더군요.(광고배너가 아예 화면에 나타나지를 않습니다.)


Cocos2d-x에서는 PluginX를 사용하는 것을 권장합니다만, 아직 그에 대한 자료도 찾기 어렵고 아무래도 형식이 정해져 있어서 다른 방법을 찾아보았습니다.


구글등 검색을 해 보았지만, 아직 3.0 사용자가 많지 않은지 딱히 이거다 싶은 것은 없었지만, 몇가지 NativeActivity에 뷰를 올리는 방법에 대한 힌트와 Cocos2d-x 자체의 PluginX 관련 소스를 열어보니(해답은 가까이에 있었....) 방법이 있는것 같아 시도해 보았는데, 잘 되는것 같아 포스팅합니다.


먼저, 애드몹 설치에 관한 기본적인 사항은 적지 않겠습니다. 워낙 많이 있는 내용이고, 구글 개발자 사이트에 가면 자세하게 나오니까요... 일단, 이클립스에 애드몹 설치는 끝낸것으로 가정합니다.


간단하게 해당 소스만 알려 드립니다.


먼저 작업중인 프로젝트의 Cocos2dxActivity.java 파일을 엽니다.


그리고 아래의 패키지나 클래스들을 임포트 합니다.


import android.widget.LinearLayout;

import android.view.Gravity;

import com.google.ads.*;

import android.view.WindowManager;


아래와 같이 메인 액티비티 클래스에 프러퍼티를 선언해 주고,


public class Cocos2dxActivity extends NativeActivity {


// For Admob [+]

private AdView admobView;

Cocos2dxActivity mActivity;

LinearLayout layout;

LinearLayout mainLayout;

boolean isAdmobInited = false;

// For Admob [-]




그리고, onCreate에 아래의 굵은 글씨와 같이 애드몹 인스턴스를 생성해 줍니다. 그리고, showAdmob () 함수는 Admob 배너광고를 보여주는 것입니다.


protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

// For Admob [+]

mActivity = this;

admobView = new AdView (this, AdSize.BANNER, "여기에 애드몹 앱 아이디를...");

showAdmob ();

// For Admob [-]

//For supports translucency

//1.change "attribs" in cocos\2d\platform\android\nativeactivity.cpp

/*const EGLint attribs[] = {

           EGL_SURFACE_TYPE, EGL_WINDOW_BIT,

           EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,  

           //EGL_BLUE_SIZE, 5,   -->delete 

           //EGL_GREEN_SIZE, 6,  -->delete 

           //EGL_RED_SIZE, 5,    -->delete 

           EGL_BUFFER_SIZE, 32,  //-->new field

           EGL_DEPTH_SIZE, 16,

           EGL_STENCIL_SIZE, 8,

           EGL_NONE

   };*/

//2.Set the format of window

// getWindow().setFormat(PixelFormat.TRANSLUCENT);

}



실제 Admob 배너광고를 보여주는 코드는 아래 showAdmob () 입니다.


public void showAdmob ()

{

if (isAdmobInited || admobView == null) {

return;

}


// OnCreate 에서 호출할때는 액티비티 실행 사이클이 모드 끝나기 전에 호출하므로 post 함수로 시작 사이클이 끝나고 Runable 을 실행함.

// Runnable 내의 코드들은 UI 스레드에서 실행.

// mActivity.runOnUiThread (new Runnable () {

mainLayout = new LinearLayout (mActivity);

mainLayout.post (new Runnable () {

@Override

public void run () {

AdRequest adRequest = new AdRequest ();

WindowManager wm = (WindowManager) mActivity.getSystemService ("window");

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams ();

mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;

mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;

mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

mLayoutParams.gravity = Gravity.BOTTOM;

wm.addView (mActivity.admobView, mLayoutParams);


// Enable this if your are testing AdMob, otherwise you'll risk to be banned!

//adRequest.addTestDevice (AdRequest.TEST_EMULATOR);

mActivity.admobView.loadAd (adRequest);

isAdmobInited = true;

}

});

}


결론은, Runable을 사용해야 하더군요. UI 쓰레드에서 처리하도록 손을 봐 줘야 배너광고가 나타나더군요.


참고로, 위 소스코드에서는 레이아웃 post 함수로 Runable을 생성했는데, OnCreate에서 showAdmob()을 호출했기 때문에, 액티비티 생성이 완료된 이후에 실행되도록 한 것입니다. (안그러면 프로그램이 죽습니다.)


실제로는 게임에 따라 배너가 보였다 안보였다 해야 할텐데, 그건 숙제로 남기겠습니다.


실행결과는 아래와 같이,





아래에 배너광고가 잘 나왔죠? (참고로, 위 스크린샷은 다음주 완성을 목표로 하고 있는 게임입니다. 미리 광고를 ....--; )


다른 광고 플랫폼도 유사한 방법으로 사용하면 될 것 같습니다.


어제 많이들 사용하는 애드립을 달아봤는데, 약간 차이가 있지만 잘 되더라고요.


나중에 시간이 되면 애드립 다는 방법도 포스팅 하도록 하죠. (사실 별 차이는 없습니다.)







끝.