Cocos2dx透明背景 + 植入广告

  • Android Studio 1.5.1
  • Cocos2d-x v3.8.1
  • Android SDK 5.1

1. 实现Cocos2dx背景透明

1.1 新建Cocos2dx工程

cocos new AdTransparent -p com.cocos2dx.adtransparent -l cpp -d .

1.2 进入工程根目录, 编译并运行

cocos compile -p android --android-studio

1.3 修改CCDirector.cpp,该文件在cocos/base/ 目录下

在drawScene()方法中

if (_nextScene)
{
    setNextScene();
}

之前添加下面两行代码,用来每帧时对屏幕做透明清除

glClearColor(0.0f,0.0f,0.0f,0.0f); // add it to make 3D transparent  
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  

如下图所示:

此外,在初始化时也得清除一下,在setGLDefaultValues()方法结束前,添加一行

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

1.4 修改Cocos2dxActivity.java内容,该文件在下面红圈目录下,也就是目录

cocos/platform/android/java/src/org/cocos2dx/lib

接下来,还得把我们的View容器给透明化,在init()方法体里修改,因为view底层有个文本编辑框EditBox, 我们需要事先屏蔽掉,而后将SurfaceView透明,添加

// Cocos2dxGLSurfaceView
this.mGLSurfaceView = this.onCreateView();
this.mGLSurfaceView.setZOrderOnTop(true);
this.mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
this.mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

1.5 最后修改AndroidManifest.xml

修改activity的主题为半透明

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"

最终效果如图

2. 植入Google Admob广告

2.1 注册Admob账号

登录需要用谷歌账户,根据说明填写就行了
添加新应用,填入应用名称,新建,选择广告类型,这里选的是横幅广告

2.2 得到应用的广告单元ID, 后面会用到这个ID

2.3 开始代码部分

2.3.1 使用google play service

在app/build.gradle里,添加Google play service依赖项

compile 'com.google.android.gms:play-services:4.0.30'

2.3.2 修改AppActivity, 该文件在/app/src/org/cocos2dx/cpp目录下

package org.cocos2dx.cpp;

import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.FrameLayout;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import java.security.MessageDigest;
import android.provider.Settings;
import android.util.Log;
import java.security.NoSuchAlgorithmException;

import org.cocos2dx.lib.Cocos2dxActivity;

public class AppActivity extends Cocos2dxActivity {
    private AdView adView;
    private static final String AD_UNIT_ID = "ca-app-pub-4514291455344558/5495177228";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        adView = new AdView(this);
        adView.setAdSize(AdSize.BANNER);
        adView.setAdUnitId(AD_UNIT_ID);

        String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
        String deviceId = md5(android_id).toUpperCase();

//      AdRequest adRequest = new AdRequest.Builder().addTestDevice("4595175973376A75D45C9C7F424562A5").build();
        AdRequest adRequest = new AdRequest.Builder().addTestDevice(deviceId).build();
        Log.e("device Id: %s", deviceId);

        adView.loadAd(adRequest);
        adView.setBackgroundColor(Color.BLACK);
        adView.setBackgroundColor(0);

        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.BOTTOM;

        addContentView(adView, params);
    }

    public static final String md5(final String s) {
        try {
            // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest
                    .getInstance("MD5");
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();

            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < messageDigest.length; i++) {
                String h = Integer.toHexString(0xFF & messageDigest[i]);
                while (h.length() < 2)
                    h = "0" + h;
                hexString.append(h);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
//            Logger.logStackTrace(TAG,e);
        }
        return "";
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(adView != null)
            adView.resume();
    }

    @Override
    protected void onPause() {
        if(adView != null)
            adView.pause();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        adView.destroy();
        super.onDestroy();
    }
}

AD_UNIT_ID是广告单元ID,这是在2.2部分得到的, 上面的代码还有个Device Id,需要根据你的测试设备ID而定,如果用的是模拟器,对应部分可以修改为

AdRequest adRequest = new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR).addTestDevice(deviceId).build();

貌似还是需要deviceId,但我没用模拟器测试,而用真机测试的
参照链接:http://stackoverflow.com/questions/4524752/how-can-i-get-device-id-for-admob

2.3.3 修改AndroidManifest.xml

在manifest结束前的最末端添加

<meta-data
            android:name= "com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <activity
            android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    </application>

    <supports-screen
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

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

最终效果图