Gravity Field

Gravity Field (引力谜题) 第一版已成功发到 Google Play
Cheers!
Gravity Field (Google Play)
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根据实际情况指定版本

一天一时书计划

计划每天花一小时时间读书

Keep Connected

q1t5914137.51mypc.cn
11269/14162

晚来天欲雪

微信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不会不响应