Gravity Field (引力谜题) 第一版已成功发到 Google Play
Cheers!
Gravity Field (Google Play)
Gravity Field (本站)
Gravity Field
cocos2dx 3.x Android中加入AdMob
观察 AppActivity.java:
public class AppActivity extends Cocos2dxActivity
启动的Activity是继承Cocos2dxActivity;
Cocos2dxActivity 存在 mFrameLayout,那就直接在里面设置个PopupWindow即可;
Activity本身空无一物,直接加上一下代码即可:
public class AppActivity extends Cocos2dxActivity {
private AdView adView;
private PopupWindow popUp;
private static AppActivity _activity;
private LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_activity = this;
adView = new AdView(this);
adView.setAdUnitId("ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx"); // 这里填自己的AdUnitId
adView.setAdSize(AdSize.BANNER);
adView.setAdListener(new AdmobListener()); // AdmobListener 中处理收到事件
}
public static void showHideAdPopup() { // 静态方法供Native代码调用
_activity._showHideAdPopup();
}
public void _showHideAdPopup() {
if (popUp == null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
popUp = new PopupWindow(_activity);
popUp.setWidth(360);
popUp.setHeight(50);
popUp.setWindowLayoutMode(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT);
popUp.setClippingEnabled(false);
layout = new LinearLayout(_activity);
layout.setPadding(-10, -10, -10, -10); // 不加这句AdView可能会没有足够Size容纳加载不了
MarginLayoutParams params = new MarginLayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
params.setMargins(0, 0, 0, 0);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(adView, params);
popUp.setContentView(layout);
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("xxxxxxxxxxxxxxxxxxxxxxxx") // 申明测试设备,不加乱点会被ban账号,在logcat中搜AdRequest可以看到
.build();
_activity.adView.loadAd(adRequest);
popUp.showAtLocation(mFrameLayout, Gravity.BOTTOM, 0, 0);
popUp.update();
} catch (Exception ex) {
Toast.makeText(AppActivity.this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
} else { // 再次调用隐藏
runOnUiThread(new Runnable() {
@Override
public void run() {
layout.removeView(adView);
popUp.dismiss();
popUp = null;
}
});
}
}
private class AdmobListener extends AdListener {
@Override
public void onAdClosed() {
Log.d("", "Closed");
super.onAdClosed();
}
@Override
public void onAdFailedToLoad(int errorCode) {
Log.d("", "Failed");
super.onAdFailedToLoad(errorCode);
}
@Override
public void onAdLeftApplication() {
Log.d("", "Left");
super.onAdLeftApplication();
}
@Override
public void onAdLoaded() {
Log.d("", "Loaded");
super.onAdLoaded();
}
@Override
public void onAdOpened() {
Log.d("", "Opened");
super.onAdOpened();
}
}
@Override
public void onDestroy() {
if (adView != null) {
adView.destroy();
}
super.onDestroy();
}
}
Native 代码中通过cocos2d::JniHelper交互
记得判断CC_TARGET_PLATFORM,防止XCode编译ios时出错
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
const char* NativeActivityClassName = "org/cocos2dx/cpp/AppActivity";
#endif
void AdmobHelper::showAds() {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
cocos2d::JniMethodInfo t;
if (cocos2d::JniHelper::getStaticMethodInfo(t
, NativeActivityClassName
, "showHideAdPopup"
, "()V"))
{
t.env->CallStaticVoidMethod(t.classID, t.methodID);
t.env->DeleteLocalRef(t.classID);
}
#endif
}
cocos2dx 单点点击事件
1、通过cocos2d::EventListenerTouchOneByOne::create()创建 listener;
2、多个listener addEventListenerWithSceneGraphPriority 按z-order顺序触发,需要自行判断点击范围;
3、onTouchBegan 中返回值为true才会触发后续Moved Ended Cancelled事件;
4、setSwallowTouches(true) 且onTouchBegan返回true时,不会触发其他的listener;
cocos2d 编译android报错解决
cocos compile 参数中要加上 –app-abi armeabi –ndk-toolchain arm-linux-androideabi-4.9
说明中app-abi默认为armeabi,实际上为arm64
ndk-toolchain根据实际情况指定版本
微信JSBridgeAPI
1、隐藏微信网页右上角的按钮
document.addEventListener(‘WeixinJSBridgeReady’, function onBridgeReady() {
// 通过下面这个API隐藏右上角按钮
WeixinJSBridge.call(‘hideOptionMenu’);
});
document.addEventListener(‘WeixinJSBridgeReady’, function onBridgeReady() {
// 通过下面这个API显示右上角按钮
WeixinJSBridge.call(‘showOptionMenu’);
});
2、隐藏微信网页底部的导航栏
document.addEventListener(‘WeixinJSBridgeReady’, function onBridgeReady() {
// 通过下面这个API隐藏底部导航栏
WeixinJSBridge.call(‘hideToolbar’);
});
document.addEventListener(‘WeixinJSBridgeReady’, function onBridgeReady() {
// 通过下面这个API显示底部导航栏
WeixinJSBridge.call(‘showToolbar’);
});
3、在微信网页中获取用户的网络状态
WeixinJSBridge.invoke(‘getNetworkType’,{},function(e){
// 在这里拿到e.err_msg,这里面就包含了所有的网络类型
alert(e.err_msg);
});
e.err_msg的取值如下所示:
network_type:wifi wifi网络 2 network_type:edge 非wifi,包含3G/2G 3 network_type:fail 网络断开连接 4 network_type:wwan 2g或者3g
AS中引用本地aar
生成aar之后下一步就是如何引用本地的aar文件?以test.aar文件为例
1、把aar文件放在一个文件目录内,比如就放在libs目录内
2、在app的build.gradle文件添加如下内容
repositories {
flatDir {
dirs ‘libs’ //this way we can find the .aar file in libs folder
}
}
3、之后在其他项目中添加一句gradle依赖便方便的引用了该library
dependencies {
compile(name:’test’, ext:’aar’)
}
ssh连接超时问题解决方案:
2选1即可:
1.修改server端的etc/ssh/sshd_config
ClientAliveInterval 60 #server每隔60秒发送一次请求给client,然后client响应,从而保持连接
ClientAliveCountMax 3 #server发出请求后,客户端没有响应得次数达到3,就自动断开连接,正常情况下,client不会不响应
2.修改client端的etc/ssh/ssh_config添加以下:(在没有权限改server配置的情形下)
ServerAliveInterval 60 #client每隔60秒发送一次请求给server,然后server响应,从而保持连接
ServerAliveCountMax 3 #client发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,server不会不响应

近期评论