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" />