我们的游戏辛辛苦苦的写了一周,如果不赚点貌似对不起自己,但是这个项目只是作为练手的项目,学习的目的大于赚钱的目的(根本就没有赚钱的目的),更何况游戏的创意是人家的,我们只是copy过来学习一下。所以从各种角度来说,我们都应该加入第三方SDK,既可以用来学习一下第三方SDK的接入技巧,同时如果能上线也可以赚一点(只能呵呵了)。本篇博客我们就来接入一下万普的广告平台,广告平台有很多家,大家可以根据自己的喜好选择,对于各个广告平台的优劣我还不了解(留给以后学习了),希望了解的哥们留个言共同探讨一下。
1、首先去万普注册一个账号,登录后台填写应用的名称,主要是为了获取APP_ID,然后下载他的SDK,这个SDK就是他写的一些库供我们调用的,所以要根据平台下载对应的SDK,我们只在Android下接入,那就下载Android平台的SDK。在下载下来的文档中有一个他们自己的Demo和接入手册,我们可以通过他们的手册来接入广告,我使用手册的时候感觉歧义不断,而且针对的是2.x的版本,所以只好再研究研究了。
2、将我们的项目导入到eclipse中,注意这里有坑,Cocos-x-3.0以后我们还需要导入项目路径cocos2d\cocos\platform\android\java下的库,不会导入的查看它的文档,最后的效果是这样的,在工程视图处明显是有俩个项目。
3、接着我们就需要导入万普的SDK了,将Demo解压包中libs目录下的 AppOffer_2.1.1.jar 放入工程指定的 libs目录。将万普demo例子中src目录下的cn.waps.extend包放到我们的工程源码目录src下,最后的工程效果是这样的。
4、打开AndroidManifest.xml文件,按照文档要求添加它所需要的权限,AndroidManifest.xml截图如下。
5、做完了以上的初始化工作接下来我们就来写代码了,打开源码目录下的AppActivity.java文件,在3.0以后的Cocos目录下,这个文件只有一个类,里边的实现全部是空的,就连onCreate()函数也没有,既然没有我们就在这里添加onCreate()函数,在onCreate函数中完成广告接口的初始化和调用。
2 | private static Handler handler; |
3 | private static Context mContext; |
4 | private String app_id = "0171a39202ff2653c82f4d7ec4cde53a" ; |
6 | protected void onCreate(Bundle savedInstanceState) { |
8 | super .onCreate(savedInstanceState); |
12 | handler = new AdHandler(); |
17 | public void initAds(){ |
19 | AppConnect.getInstance(app_id, "baidu" , this ); |
21 | AppConnect.getInstance( this ).initPopAd( this ); |
23 | AppConnect.getInstance( this ).initAdInfo(); |
26 | protected void onStop(){ |
28 | AppConnect.getInstance( this ).close(); |
以上的代码是用来初始化广告的,学过java和Android的同学不需要我解释,只说涉及到广告的东西,在initAds()函数中我们完成了广告的初始化,其中app_id就是在友盟的后台获得的ID,而字符串"baidu"是app_pid,官方的说法是分发渠道的ID,关于各个渠道的ID请大家查看友盟提供的文档,我要在百度上线,所以这里的渠道写的就是百度。后俩句的代码说的很明白了,友盟提供给我们很多的广告类型,有些广告在使用的时候不需要我们预先加载,但是有些是不行的,比如插屏广告和迷你广告就必须先加载再调用,我用到了这俩种类型的广告,所以加载一下。最后在onStop里边关闭广告。这样的话整个广告的生命周期我们就理清楚了,接下来就是实现调用广告的接口了。
6、为了让大家看清楚整个类,我把整个activity都贴上来了,调用广告的接口是函数showAdStatic,里边传入一个广告类型的ID,然后根据这个广告类型ID会调用handleMessage方法,关于Android的内容我了解的不多,就不误导大家了,大家只要清楚你做修改的时候在handleMessage中就好了,这个函数中的代码很简单应该去看一下。这样的话Android部分的代码我们就完成了,接下来要做的事情就是在c++代码层使用jni来调用showAdStatic函数。
1 | public class AppActivity extends Cocos2dxActivity implements UpdatePointsNotifier{ |
4 | private static Handler handler; |
5 | private static Context mContext; |
6 | private String app_id = "0171a39202ff2653c82f4d7ec4cde53a" ; |
8 | protected void onCreate(Bundle savedInstanceState) { |
10 | super .onCreate(savedInstanceState); |
14 | handler = new AdHandler(); |
19 | public void initAds(){ |
21 | AppConnect.getInstance(app_id, "baidu" , this ); |
23 | AppConnect.getInstance( this ).initPopAd( this ); |
25 | AppConnect.getInstance( this ).initAdInfo(); |
28 | protected void onStop(){ |
30 | AppConnect.getInstance( this ).close(); |
34 | public void getUpdatePoints(String arg0, int arg1) { |
38 | public void getUpdatePointsFailed(String arg0) { |
42 | public static void showAdStatic( int adTag) { |
43 | Message msg = handler.obtainMessage(); |
46 | handler.sendMessage(msg); |
49 | class AdHandler extends Handler{ |
50 | public void handleMessage(Message msg) { |
54 | AppConnect.getInstance(mContext).showOffers(mContext); |
59 | boolean hasPopAd = AppConnect.getInstance(mContext).hasPopAd(mContext); |
61 | AppConnect.getInstance(mContext).showPopAd(mContext); |
66 | AppConnect.getInstance(mContext).showAppOffers(mContext); |
70 | AppConnect.getInstance(mContext).showGameOffers(mContext); |
77 | AdInfo adInfo = AppConnect.getInstance(mContext).getAdInfo(); |
78 | AppDetail.getInstanct().showAdDetail(mContext, adInfo); break ; |
81 | AppConnect.getInstance(mContext).spendPoints( 10 ,AppActivity. this ); |
85 | AppConnect.getInstance(mContext).awardPoints( 10 ,AppActivity. this ); |
89 | AppConnect.getInstance(mContext).showMore(mContext); |
93 | AppConnect.getInstance(mContext).showMore(mContext,app_id); |
97 | String uriStr = "http://www.baidu.com" ; AppConnect.getInstance(mContext).showBrowser(mContext,uriStr); |
101 | AppConnect.getInstance(mContext).showFeedback(mContext); |
105 | QuitPopAd.getInstance().show(mContext); |
109 | AppConnect.getInstance(mContext).showBannerAd(mContext,getBannerAd()); |
113 | AppConnect.getInstance(mContext).showMiniAd(mContext,getMiniAd(), 10 ); |
119 | private LinearLayout getBannerAd(){ |
121 | LinearLayout adBannerLayout = new LinearLayout(mContext); |
122 | adBannerLayout.setOrientation(LinearLayout.VERTICAL); |
123 | FrameLayout.LayoutParams lp_banner = new FrameLayout.LayoutParams( |
124 | FrameLayout.LayoutParams.FILL_PARENT, |
125 | FrameLayout.LayoutParams.WRAP_CONTENT); |
127 | lp_banner.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; |
128 | AppActivity. this .addContentView(adBannerLayout, lp_banner); |
130 | LinearLayout bannerLayout = new LinearLayout(mContext); |
131 | adBannerLayout.addView(bannerLayout); |
137 | private LinearLayout getMiniAd(){ |
138 | LinearLayout adMiniLayout = new LinearLayout(mContext); |
139 | adMiniLayout.setOrientation(LinearLayout.VERTICAL); |
140 | FrameLayout.LayoutParams lp_mini = new FrameLayout.LayoutParams( |
141 | FrameLayout.LayoutParams.FILL_PARENT, |
142 | FrameLayout.LayoutParams.WRAP_CONTENT); |
144 | lp_mini.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; |
145 | AppActivity. this .addContentView(adMiniLayout, lp_mini); |
146 | LinearLayout miniLayout = new LinearLayout(mContext); |
147 | adMiniLayout.addView(miniLayout); |
7、回到c++代码层,我们新建文件WapsAd.h和WapsAd.cpp,在这里我们写一个接口根据指定的广告ID值来调用不同类型的广告。用到的技术主要是jni,关于代码如果理解如果你懂jni的话应该是很简单的,不懂的童鞋如果仅仅是为了实现功能可以搬来我的使用,如果想刨根问底请看我关于jni的博客。本人自认为写的很详细了,看完了以后对以下的代码绝对理解。
9 | #ifndef __Plane__WapsAd__ |
10 | #define __Plane__WapsAd__ |
13 | using namespace cocos2d; |
15 | #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
17 | #include "platform/android/jni/JniHelper.h" |
28 | static void showAd( int adTag); |
32 | #endif /* defined(__Plane__WapsAd__) */ |
14 | void WapsAd::showAd( int adTag) |
18 | #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
20 | bool isHave = JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/AppActivity" , "showAdStatic" , "(I)V" ); |
23 | CCLog( "jni:showAdStatic is null" ); |
28 | minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,adTag); |
8、现在是万事具备只差调用了,我们在自己认为合理的地方调用WapsAd::showAd(14),里边的参数就是广告类型的ID(在调用的类里边记住包含WapsAd头文件)。首页我不准备显示广告内容,在分数榜处我显示一个迷你广告,在关于作者的地方我显示一个banner广告,在游戏结束的时候我显示一个插屏广告,最后的效果如图所示。
代码已经放到了GitHub上,大家可以到GitHub上下载。关于广告不同的应用市场要求不一样,加了广告上某些市场是上不去的,加的广告太多对用户体验又不好,这里只是学一下技术,对于设计慢慢斟酌吧!