cocos2dx android平台事件系统解析
对于cocos2dx在android平台事件的响应过程很模糊,于是分析了下源码,cocos2dx 版本3.4,先导入一个android工程,然后看下AndroidManifest.xml
- <application android:label="@string/app_name"
- android:icon="@drawable/icon">
- <!-- Tell Cocos2dxActivity the name of our .so -->
- <meta-data android:name="android.app.lib_name"
- android:value="cocos2dcpp" />
- <activity android:name="org.cocos2dx.cpp.AppActivity"
- android:label="@string/app_name"
- android:screenOrientation="landscape"
- android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
- android:configChanges="orientation">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
由此得知启动窗口类为 org.cocos2dx.cpp.AppActivity,并继承之 Cocos2dxActivity
- package org.cocos2dx.cpp;
- import org.cocos2dx.lib.Cocos2dxActivity;
- public class AppActivity extends Cocos2dxActivity {
- }
- public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener
看下 Cocos2dxActivity 的 onCreate
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- Log.i(TAG, "------onCreate----");
- super.onCreate(savedInstanceState);
- CocosPlayClient.init(this, false);
- onLoadNativeLibraries();//加载了一些静态库
- sContext = this;
- this.mHandler = new Cocos2dxHandler(this);
- Cocos2dxHelper.init(this);
- this.mGLContextAttrs = getGLContextAttrs();
- this.init();//初始化
- if (mVideoHelper == null) {
- mVideoHelper = new Cocos2dxVideoHelper(this, mFrameLayout);
- }
- if(mWebViewHelper == null){
- mWebViewHelper = new Cocos2dxWebViewHelper(mFrameLayout);
- }
- }
onCreate 调用了 init() 初始化
- public void init() {
- // FrameLayout
- ViewGroup.LayoutParams framelayout_params =
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- mFrameLayout = new FrameLayout(this);
- mFrameLayout.setLayoutParams(framelayout_params);
- // Cocos2dxEditText layout
- ViewGroup.LayoutParams edittext_layout_params =
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
- Cocos2dxEditText edittext = new Cocos2dxEditText(this);
- edittext.setLayoutParams(edittext_layout_params);
- // ...add to FrameLayout
- mFrameLayout.addView(edittext);
- // Cocos2dxGLSurfaceView
- this.mGLSurfaceView = this.onCreateView();
- // ...add to FrameLayout
- mFrameLayout.addView(this.mGLSurfaceView);
- // Switch to supported OpenGL (ARGB888) mode on emulator
- if (isAndroidEmulator())
- this.mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
- this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
- this.mGLSurfaceView.setCocos2dxEditText(edittext);
- // Set framelayout as the content view
- setContentView(mFrameLayout);
- }
最终显示的视图为 this.mGLSurfaceView = this.onCreateView();
- public Cocos2dxGLSurfaceView onCreateView() {
- Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
- //this line is need on some device if we specify an alpha bits
- if(this.mGLContextAttrs[3] > 0) glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
- Cocos2dxEGLConfigChooser chooser = new Cocos2dxEGLConfigChooser(this.mGLContextAttrs);
- glSurfaceView.setEGLConfigChooser(chooser);
- return glSurfaceView;
- }
Cocos2dxGLSurfaceView 就是最终显示的视图,事件处理也在这个类中,包括 onResume,onPause,onSizeChanged,onKeyDown,onTouchEvent等 主要看下onTouchEvent事件的处理过程
- @Override
- public boolean onTouchEvent(final MotionEvent pMotionEvent) {
- //Log.d(TAG, "------onTouchEvent action=----"+pMotionEvent.getAction());
- // these data are used in ACTION_MOVE and ACTION_CANCEL
- final int pointerNumber = pMotionEvent.getPointerCount();
- final int[] ids = new int[pointerNumber];
- final float[] xs = new float[pointerNumber];
- final float[] ys = new float[pointerNumber];
- for (int i = 0; i < pointerNumber; i++) {
- ids[i] = pMotionEvent.getPointerId(i);
- xs[i] = pMotionEvent.getX(i);
- ys[i] = pMotionEvent.getY(i);
- }
- switch (pMotionEvent.getAction() & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_POINTER_DOWN:
- final int indexPointerDown = pMotionEvent.getAction() >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
- final int idPointerDown = pMotionEvent.getPointerId(indexPointerDown);
- final float xPointerDown = pMotionEvent.getX(indexPointerDown);
- final float yPointerDown = pMotionEvent.getY(indexPointerDown);
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionDown(idPointerDown, xPointerDown, yPointerDown);
- }
- });
- break;
- case MotionEvent.ACTION_DOWN:
- // there are only one finger on the screen
- final int idDown = pMotionEvent.getPointerId(0);
- final float xDown = xs[0];
- final float yDown = ys[0];
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionDown(idDown, xDown, yDown);
- }
- });
- break;
- case MotionEvent.ACTION_MOVE:
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionMove(ids, xs, ys);
- }
- });
- break;
- case MotionEvent.ACTION_POINTER_UP:
- final int indexPointUp = pMotionEvent.getAction() >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
- final int idPointerUp = pMotionEvent.getPointerId(indexPointUp);
- final float xPointerUp = pMotionEvent.getX(indexPointUp);
- final float yPointerUp = pMotionEvent.getY(indexPointUp);
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionUp(idPointerUp, xPointerUp, yPointerUp);
- }
- });
- break;
- case MotionEvent.ACTION_UP:
- // there are only one finger on the screen
- final int idUp = pMotionEvent.getPointerId(0);
- final float xUp = xs[0];
- final float yUp = ys[0];
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionUp(idUp, xUp, yUp);
- }
- });
- break;
- case MotionEvent.ACTION_CANCEL:
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionCancel(ids, xs, ys);
- }
- });
- break;
- }
- /*
- if (BuildConfig.DEBUG) {
- Cocos2dxGLSurfaceView.dumpMotionEvent(pMotionEvent);
- }
- */
- return true;
- }
看下 MotionEvent.ACTION_DOWN,调用了Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionDown
- public void handleActionDown(final int id, final float x, final float y) {
- Log.i("Cocos2dxRenderer","-----handleActionDown--");
- Cocos2dxRenderer.nativeTouchesBegin(id, x, y);
- }
这里的nativeTouchesBegin 是一个jni方法,是现在cocos2d\cocos\platform\android\jni\TouchesJni.cpp里,
- private static native void nativeTouchesBegin(final int id, final float x, final float y);
- JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeTouchesBegin(JNIEnv * env, jobject thiz, jint id, jfloat x, jfloat y) {
- intptr_t idlong = id;
- log("----Info:nativeTouchesBegin id = %d, x=%f, y=%f",id,x,y);
- cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesBegin(1, &idlong, &x, &y);
- }
最后调用GLView::handleTouchesBegin 通过 EventDispatcher::dispatchEvent进行事件的分发,调用事件响应函数,都是C++里完成的,就不再往下分析了。
能力有限,分析有误处请指正。
cocos2dx android平台事件系统解析的更多相关文章
- Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!
从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...
- Cocos2d-x 3.2 打包Android平台APK
(转自:http://www.cnblogs.com/Richard-Core/p/3855130.html) 从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭 ...
- Cocos2d-x 3.0修改Android平台帧率fps - 解决游戏运行手机发热发烫问题
使用Cocos2d-x 3.0开发游戏之后,发现游戏在android手机上发热非常严重,在魅族2上,几乎担心手机会爆炸了~~~采取的一个措施就是降低帧率,因为游戏对于帧率要求不是非常高. 做过coco ...
- 关于文章“cocos2dx移植android平台-我的血泪史”需要注意事项
关于文章"cocos2dx移植android平台-我的血泪史"需要注意事项 在上次转载的这篇文章中,按照配置一步一步的下去.发现工程中在Android.mk中有一处错误.直接bui ...
- cocos2dx使用了第三方库照样移植android平台-解决iconv库的移植问题
当我写这篇文章的时候我是怀着激动的心情的,因为我又解决了一个技术问题.你可能对题目还一知半解,这是什么意思,我之所以要写这篇文章就是要解决当我们在cocos2dx中使用了第三方库的时候,移植到andr ...
- cocos2dx移植android平台-我的血泪史
版权声明:本文由( 小塔 )原创,转载请保留文章出处! 本文链接:http://www.zaojiahua.com/android-platform.html 本人这几天一直都没有跟新自己的网站内容, ...
- TalkingData Cocos2dx在android平台使用总结
前言:最近发现很多朋友在使用TalkingData游戏版本Cocos2dx SDK使用过程中会出现的一些问题,今天来做一下总结,希望对您有所帮助: 首先非常感谢您使用TalkingData游戏统计平台 ...
- mac下面xcode+ndk7配置cocos2dx & box2d的跨ios和android平台的游戏教程
这篇教程是介绍如何使用cocos2d-x和box2d来制作一个demo,且此demo能同时运行于ios和android平台.在继续阅读之前,建议您先阅读上一篇教程. 首先,按照上一篇教程,搭建好mac ...
- 为Cocos2d-x的Android平台加入Protobuffer支持
为Cocos2d-x的Android平台加入Protobuffer支持 分类: 工作2013-11-27 18:00 386人阅读 评论(1) 收藏 举报 cocos2d-xandroid平台交叉编译 ...
随机推荐
- 高灵活低耦合Adapter快速开发攻略
Android开发中经常需要使用Adapter. 传统方法是自定义一个Adapter并继承AndroidSDK内的BaseAdapter, 这种方式代码量大,耦合度高,灵活性差(各种监听事件需要对Vi ...
- NekoHTML and Dom4j
http://pro.ctlok.com/2010/07/java-read-html-dom4j-nekohtml.html package com.ctlok.pro; import java.i ...
- 【转】Split strings the right way – or the next best way
I know many people are bored of the string splitting problem, but it still seems to come up almost ...
- 关于Git的暂存区这个概念的理解.
Git中的暂存区成为stage或者是index.可以理解成一个"提交任务".Git暂存区是Git最成功的设计之一,但是也是最难理解的. 暂存区是一个介于工作区和版本库的中间状态.当 ...
- CentOS下modelsim 10.2c install & crack
install: 1. install is easy to all : run install.linux 2 crack: this section is important: a. instal ...
- Rshare Pro是否可以放入至客户企业App Store?
现在很多客户内部部署了苹果授权的企业内部的AppStore,我们的Rshare Pro 是完全允许放入企业搭建的AppStore平台中.但每份需要收费20美元,换成人民币是120元.
- EditPlus自动补全、模板配置
EditPlus真的是一款非常好用的编辑器,虽然小,但是短小精悍,速度快.只要配置好了,功能也是很强大的.下面来总结一下如何配置EditPlus的自动补全,和模板配置. 一.配置自动补全:(以开发CS ...
- 预算oracle
select * from ( )) CODE_VERSION from ( SELECT tb_cube_fc05.pk_entity pk_org,/*主体pk*/ org_orgs.code o ...
- Asp.net MVC 4 视图相关和其他
@{ Layout = “…”} To define layout page Equivalent to asp.net master-page 要定义相当于ASP.NET母版页的页面布局 @mode ...
- zxing.dll生成条码
引入zxing.dll using System; using System.Drawing; using ZXing.QrCode; using ZXing; using ZXing.Common; ...