这节我们来学习Cocos2d-x的最后一节,怎样处理重力感应事件,移植到Android后加入再按一次返回键退出游戏等。我这里用的Android,IOS不会也没设备呃

效果图不好弄,由于是要移植到真机上的。

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"
using namespace cocos2d;
class HelloWorld : public cocos2d::CCLayer
{
public:// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphonevirtual bool init();  // there's no 'id' in cpp, so we recommend returning the class instance pointerstatic cocos2d::CCScene* scene();//重力感应事件virtual void didAccelerate(CCAcceleration* pAccelerationValue);//返回buttonvirtual void keyBackClicked();// implement the "static node()" method manuallyCREATE_FUNC(HelloWorld);
};#endif // __HELLOWORLD_SCENE_H__

这里重写了两个方法

我们都知道CCLayer是继承了重力感应事件和触屏事件,button事件的

#include "HelloWorldScene.h"#define FIX_POS(_pos, _min, _max) \if (_pos < _min)        \_pos = _min;        \
else if (_pos > _max)   \_pos = _max;        \USING_NS_CC;CCScene* HelloWorld::scene()
{// 'scene' is an autorelease objectCCScene *scene = CCScene::create();// 'layer' is an autorelease objectHelloWorld *layer = HelloWorld::create();// add layer as a child to scenescene->addChild(layer);// return the scenereturn scene;
}// on "init" you need to initialize your instance
bool HelloWorld::init()
{//// 1. super init firstif ( !CCLayer::init() ){return false;}this->setAccelerometerEnabled(true);this->setKeypadEnabled(true);CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();CCLabelTTF *lable= CCLabelTTF::create("AccelerometerTest","Arial",34);lable->setPosition(ccp(visibleSize.width/2,visibleSize.height-50));this->addChild(lable,0,0);CCSprite *pSprite= CCSprite::create("ball.png");pSprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));this->addChild(pSprite,0,1);return true;
}
void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)
{CCObject *pObjectlable= this->getChildByTag(0);if (pObjectlable==NULL){return;}CCLabelTTF *lable=(CCLabelTTF*)pObjectlable;std::ostringstream strstream;strstream<<"X:"<<pAccelerationValue->x<<"  Y:"<<pAccelerationValue->y<<"  Z:"<<pAccelerationValue->z;std::string str=strstream.str();lable->setString(str.c_str());//改变小球位置CCObject *pObjectSprite= this->getChildByTag(1);if (pObjectSprite==NULL){return;}CCSprite *pSprite=(CCSprite*)pObjectSprite;CCSize pSpriteSize= pSprite->getContentSize();CCPoint ptNow  = pSprite->getPosition();CCPoint ptTemp=CCDirector::sharedDirector()->convertToUI(ptNow);ptTemp.x += pAccelerationValue->x * 9.81f;ptTemp.y -= pAccelerationValue->y * 9.81f;CCPoint ptNext = CCDirector::sharedDirector()->convertToGL(ptTemp);CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();FIX_POS(ptNext.x, (pSpriteSize.width / 2.0), (visibleSize.width - pSpriteSize.width / 2.0));FIX_POS(ptNext.y, (pSpriteSize.height / 2.0), (visibleSize.height - pSpriteSize.height / 2.0));pSprite->setPosition(ptNext);}
void HelloWorld::keyBackClicked()
{
}

源文件代码如上,

init中我们创建了一个lable和小球的精灵

通过setAccelerometerEnabled启用重力感应事件

这里能够看下源代码,比触屏事件简单多了。

然后重写重力感应事件,这里我再事件中改动了CCLableTTF的文本,

改变小球的位置

改动文本就不多说了,非常easy,我们主要来看看怎样改变小球位置的

首先我们获得小球精灵

得到精灵位置

转换为UIKIT

这里*9.81f我也不知道什么意思,TestCpp这么写我也就这么写了

为了小球不超出手机屏幕。所以我们写了一个宏  FIX_POS

这里看看就懂了

OK。

我们移植到Android,看看效果,怎么移植,第一节专门介绍了的

效果不错,可是我们按返回键它没有退出游戏。没不论什么反应,

我们在src下的org.cocos2dx.lib中找到Cocos2dxGLSurfaceView.java打开

找到

@Overridepublic boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {switch (pKeyCode) {case KeyEvent.KEYCODE_BACK: return false;//这里是自己新增的, 返回falsecase KeyEvent.KEYCODE_MENU:this.queueEvent(new Runnable() {@Overridepublic void run() {Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);}});return true;default:return super.onKeyDown(pKeyCode, pKeyEvent);}}

然后我们在自己的java文件里重写onKeyDown,

详细代码例如以下

/****************************************************************************
Copyright (c) 2010-2011 cocos2d-x.orghttp://www.cocos2d-x.orgPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package com.huc.test;import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;public class test20140521 extends Cocos2dxActivity{private long mExitTime;protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);    }@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubif (keyCode == KeyEvent.KEYCODE_BACK) {  if ((System.currentTimeMillis() - mExitTime) > 2000) {// 假设两次按键时间间隔大于2000毫秒。则不退出  Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();  mExitTime = System.currentTimeMillis();// 更新mExitTime  } else {  System.exit(0);// 否则退出程序  }  return true;  }  return super.onKeyDown(keyCode, event);}public Cocos2dxGLSurfaceView onCreateView() {Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);// test20140521 should create stencil bufferglSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);return glSurfaceView;}static {System.loadLibrary("cocos2dcpp");}
}

OK,试试吧。

。。

附源代码和APK

Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)...相关推荐

  1. 软件调试学习笔记(三)—— 调试事件的处理

    软件调试学习笔记(三)-- 调试事件的处理 要点回顾 调试事件的处理 实验一:实现简单调试器(创建进程) 实验二:分析异常来源 实验三:实现简单调试器(附加进程) 实验四:分析NtDebugActiv ...

  2. 软件调试学习笔记(二)—— 调试事件的采集

    软件调试学习笔记(二)-- 调试事件的采集 要点回顾 调试事件的种类 调试事件采集函数 例:分析PspUserThreadStartup 例:分析PspExitThread 总结 要点回顾 调试器与被 ...

  3. jQuery学习笔记之DOM操作、事件绑定(2)

    jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...

  4. Unity游戏框架学习笔记——03基于观察者模式的事件中心

    Unity游戏框架学习笔记--03基于观察者模式的事件中心 基于观察者模式的事件中心 一如既往指路牌:https://www.bilibili.com/video/BV1C441117wU?p=5. ...

  5. libevent学习笔记六:libevent核心事件event

    libevent学习笔记六:libevent核心事件event 前面对reactor模式.事件处理流程.libevent源代码结构等有了高层的认识后,接下来将详细介绍libevent的核心结构even ...

  6. android中资源文件的两种访问方式,Android_Android学习笔记-保存文件(Saving Files),Android设备有两种文件存储区域 - phpStudy...

    Android学习笔记-保存文件(Saving Files) Android设备有两种文件存储区域: 内部存储和外部存储 ("internal" and "externa ...

  7. Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画

    文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...

  8. 学习笔记之——Event Camera(事件相机)调研

    本博文是本人调研Event Camera写下的学习记录,本博文的内容来源于网络.paper以及本人学习调研过程的心得,仅供本人学习记录用,不作商业用途. 我们团队在事件相机方面的工作请见: GitHu ...

  9. 【LVGL】学习笔记--(1)Keil中嵌入式系统移植LVGL

    一 LVGL简介 最近emwin用的比较烦躁,同时被LVGL酷炫的界面吸引到了,所以准备换用LVGL试试水. LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切 ...

  10. 安卓学习笔记13:安卓触摸事件

    文章目录 零.学习目标 一.安卓触摸事件概述 1.触摸分类 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 二.安卓单点触摸 三.教学案例--通过单点触摸移动米老鼠 (一)运行效果 ( ...

最新文章

  1. 移动设备应用程序开发入门一:创建用于设备的 Windows 窗体应用程序并打包进行部署...
  2. LeetCode 1293. 网格中的最短路径(DP/BFS)
  3. 【CAA智库】宁滨院士:智能交通中的若干科学和技术问题
  4. 【汇编优化】之linux下如何利用gdb调试汇编代码
  5. 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
  6. channel带缓冲区和不带缓冲区的区别
  7. 【 javascript 】.innerHTML属性定义
  8. SQLite:注意查询条件中空格的影响
  9. 队列与栈(Queue,Deque,Stack)
  10. 厦门理工学院计算机毕业要求,计算机教学中心-厦门理工学院教务处.PDF
  11. 小朋友Stem课程制作3D打印无人机
  12. 语法俱乐部1:基本句型及补语
  13. druid数据库连接池 数据库配置密码加密
  14. HDFS配置之NN-SNN-DN
  15. 抖音小店无货源,如何找到适合自己店铺的达人,精选联盟玩法分享
  16. (二十一)资产(组合)的预期收益率和风险
  17. 基于安卓的掌上二手图书交易app
  18. 机器人开发--pgv 视觉引导(Position Guided Vision)
  19. org.eclipse.jdi.TimeoutException:Timeout occured while waiting for packet x.occurred resuming thread
  20. 清华大学计算机科学与技术专业课程

热门文章

  1. Atitit  404错误的排查流程总结 v3 qaf
  2. atitit 图像处理机器视觉专业博硕连读课程表.xlsx
  3. Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
  4. paip.论程序断点的类型以及设置总结
  5. paip.oracle10g dmp文件导入总结
  6. 【交易技术前沿】券商买方投顾系统建设实践
  7. Rust: Lifetime小心要你命!
  8. 期货交易的异常交易认定标准
  9. 求求你,千万别为我好!
  10. 【回归预测】基于matlab灰狼算法优化ELMAN神经网络回归预测【含Matlab源码 1782期】