Cocos2d-x之testCpp---Accelerometer(重力感应)分析

cocos2dx 三轴螺旋仪 陀螺仪的作用简单点说就是可以跟踪位置变化,只要你在某个时刻得到了当前所在位置,然后只要陀螺仪一直在运行,根据数学计算,就可以知道你的行动轨迹。Cocos2dxAccelerometer是继承于类。该函数处理数据,然后抛给cocos的事件。主要使用的是CoreMotion框架。开启不同设备的加速计,然后进行监听。设置陀螺仪间隔(cocos没有)设置磁力计间隔(cocos没有)加速计事件,然后将数据抛给。(安卓的传感器监听事件) 阅读详情

 决定好好总结下testCpp里面的知识,这里我把testCpp中AccelerometerTest剥离出来了,总结下~

我用的最新版的2dx。。。。cocos2d-2.1rc0-x-2.1.3  

ndk是android-ndk-r8d

class文件下载地址:http://download.youkuaiyun.com/detail/bill_ming/5568563

#include "HelloWorldScene.h"
#include "cocos2d.h"


#define FIX_POS(_pos, _min, _max) \
	if (_pos < _min)        \
	_pos = _min;        \
else if (_pos > _max)   \
	_pos = _max;        \

HelloWorld::HelloWorld()

{
	m_fLastTime = 0.0;
}
HelloWorld::~HelloWorld()
{
	m_pBall->release();
}
CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do 
    {
        // 'scene' is an autorelease object
        scene = CCScene::create();
        CC_BREAK_IF(! scene);

        // 'layer' is an autorelease object
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);

        // add layer as a child to scene
        scene->addChild(layer);
    } while (0);

    // return the scene
    return scene;
}
std::string HelloWorld::titile()
{
	return "hehehaha~";
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());
		//打开重力感应
		setAccelerometerEnabled(true);

		CCLabelTTF *label = CCLabelTTF::create(titile().c_str(),"Arial",32);
        addChild(label,1);
	    label->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y-50) );
		
		m_pBall = CCSprite::create("ball.png");
		//m_pBall->setPosition(ccp(winSize.height/2,winSize.width/2));
		m_pBall->setPosition(ccp(VisibleRect::center().x, VisibleRect::center().y));
		addChild(m_pBall);
		/************************************************************************/
		/* 必须要调用了对象的autoRelease函数之后,retain和release函数才会生效,
		   否则,一切都是徒劳。create已经包含了autoRelease
	   	    注意:addChild函数已经包含了retain                                                                     
			参考:http://www.xue5.com/Mobile/Mobile/680881.html
	   */
		/************************************************************************/
            
        bRet = true;
    } while (0);

    return bRet;
}
void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)
{
	CCDirector *pDir = CCDirector::sharedDirector();
	if ( m_pBall == NULL)
	{
		return;
	}
	CCSize ballSize = m_pBall->getContentSize();
	CCPoint ptNow = m_pBall->getPosition();
	CCPoint ptTemp = pDir->convertToUI(ptNow);

	ptTemp.x += pAccelerationValue->x * 9.81f;
	ptTemp.y -= pAccelerationValue->y * 9.81f;

	CCPoint ptNext = pDir->convertToGL(ptTemp);
	FIX_POS(ptNext.x, (VisibleRect::left().x+ballSize.width / 2.0), (VisibleRect::right().x - ballSize.width / 2.0));
	FIX_POS(ptNext.y, (VisibleRect::bottom().y+ballSize.height / 2.0), (VisibleRect::top().y - ballSize.height / 2.0));
	m_pBall->setPosition(ptNext);
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // "close" menu item clicked
    CCDirector::sharedDirector()->end();
}


1.先调用CCLayer的方法setAccelerometerEnabled(true);启用重力感应

2.在重力方向改变时,会调用CCLayer的didAccelerate(CCAcceleration *pAccelerationValue),所以自己的HelloWorld类继承了CCLayer,这里重写这个方法

问题总结:

1.原来testCpp里实在controller.ccp中在CreateTestScene函数中调用的,他用的是

new AccelerometerTestScene();进入到AccelerometerTest.cpp,我们会发现,它还是用CCLayer* pLayer = new AccelerometerTest();而不是create方法,这两种有什么区别呢?我们知道当我们调用create()方法时,会调用init来初始化,但直接用new AAA();这种方式时,会调用onEnter()而不会是init...可以参考下:http://blog.youkuaiyun.com/bill_ming/article/details/9080271


2.testCpp里,它的onEnter()函数中,创建ball精灵后有一句:m_pBall->retain();

但我记得调用addChild(m_pBall);这个函数后,就不必要再retain()了啊。。。可以参考下:

笨木头的一篇博文:http://www.xue5.com/Mobile/Mobile/680881.html

希望看到的朋友能稍微解释下哈,是不是我理解错了。。。感谢感谢~~~


3.或许很多朋友也和我一样,被各种getWinSize(),getContentSize(),getVisibleSize(),以及一些坐标转换搞混了、、、

可以参考下我总结的另一篇文章:http://blog.youkuaiyun.com/bill_ming/article/details/9078781

它根据重力移动的过程:

 (1.取得小球的逻辑尺寸:为了在后边移动时修正小球位置,不让它跑出边界

 (2.取得当前位置,然后转化为屏幕坐标,然后根据当前位置以及加速度(9.81)计算出下一处的坐标。

 (3.把坐标系转换为openGl坐标,然后根据小球逻辑尺寸,修正位置,最后setPosition就好了


4.但还有一个问题,小球可以根据重力移动,但如何设定加速减速的速度大小呢?

可以参考下:http://blog.youkuaiyun.com/jinglijun/article/details/8048013

这里我没用到,希望看到的朋友推荐一些资料~

模型优化系列——模型剪枝/量化概述 模型优化目的:通过减少模型大小,提高推理速度等使模型成功部署在各个硬件中并实时有效运作。 阅读详情

相关推荐

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 6005

cocos2dx游戏开发加速度计

在cocos2d-x引擎中 使用了类CCAccelerometer来存储加速度计的信息 类CCAccelerometer的作用和用户操作的分发器类似 区别在于用户操作的分发器可以拥有很多委托对象 而加速度计只存在一个委托对象 这是因为一个移动设备只有一个硬件 所以接口进行了简化 CCAccelerometerDelegate就是加速度计的委托对象  和触摸事件事件一样 重力感应的处理先被引擎

兔子妈妈的专栏 1570

从S参数到SPICE模型:Cadence Sigrity Boardband SPICE完整使用指南

本文详细介绍了Cadence Sigrity Boardband SPICE工具的核心价值与完整使用流程。该工具通过矢量拟合算法,将复杂的多端口S参数文件转化为无源、紧凑且高精度的SPICE等效电路模型,从而极大提升时域仿真效率。指南涵盖了从数据导入、关键参数配置、模型精度验证到集成应用于PowerSI等系统级仿真的全步骤,是信号与电源完整性分析的必备利器。

defi6farmer的博客 432

Cocos2d-x Cocos2dxAccelerometer和Cocos2dxGLSurfaceView出错解决方案

最近使用最新版本的eclipse juno配置android开发cocos2dx,按照这篇文章(http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=882)进行配置后发现工程报cocos2d-x源文件报错,刚开始以为是cocos2d-x的一个bug,后面经过多方面查找资料测试,发现这并不是cocos2d-x的罪过(阿弥陀佛,cocos2

飞鱼 4203

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3789

流媒体学习之路(mediasoup)——simulcast 与 svc 简介(7)

流媒体学习之路(mediasoup)——simulcast 与 svc(7) 文章目录流媒体学习之路(mediasoup)——simulcast 与 svc(7)

qw225967的博客 7339

[CocosCreator]-02-设备重力传感事件

cc.Class({ extends: cc.Component, onLoad () { // open Accelerometer cc.systemEvent.setAccelerometerEnabled(true); cc.systemEvent.on(cc.SystemEvent.EventType.DEVICEMOTI...

1897

SAP 清账凭证 完整生成逻辑(超详细原理 + 底层规则 + 分录逻辑 + 互清特殊规则)

【SAP清账凭证核心逻辑摘要】(149字) SAP清账凭证生成遵循两大类型:1)资金往来对冲型(如F-32/F-44互清),强制生成含完整借贷分录的独立凭证,通过AUGDT/AUGBL字段绑定未清项,典型场景如应收冲应付(借:应付账款 贷:应收账款);2)纯核销型(如F.13自动清账),仅标记行项目状态不产生实际分录。关键规则:①仅未清项管理科目可清账;②互清必须配置主数据关联;③差额清账自动补差(折扣/汇差);④原始凭证永不修改,仅更新BSIK/BSAD等表状态。清账凭证均保留可追溯性,支持FBRA重置还

金牌架构师 542

Cocos2d开发系列(三)

这个例子是一个叫做Doodle Drop的游戏,是一个重力感应类游戏。玩家操纵角色来躲避从空中坠落的障碍物。

kmyhy的专栏 2万+

工业级向量检索核心技术:IVF-PQ原理与全流程解析

在大规模高维向量检索场景中,IVF-PQ(倒排索引结合乘积量化)凭借“粗筛范围+细算距离”的双重加速策略,成为核心解决方案。本文将深入解析其原理与全流程,助力开发者掌握这一关键技术。

进一步有进一步的欢喜~ 1197

《QGIS快速入门与应用基础》294:双地图框布局(真彩色+假彩色对比)

摘要 本文详细介绍了在QGIS中创建专业级遥感影像对比地图的完整流程。作者作为时空智能领域专家,重点讲解了双地图框布局的实现方法,通过真彩色与假彩色影像的同步对比,满足学术研究和工程应用需求。文章包含三个核心部分:1) 前期准备工作,包括图层复制、标准化命名和参数校验;2) 布局创建与页面设置,详细说明了A4横向布局的参数配置;3) 双地图框同步技术,提供了复制粘贴法和手动设置两种实现方案。教程特别强调图层锁定、比例尺固定等关键操作,确保对比图的专业性和准确性,适合GIS从业人员和遥感研究者学习参考。

LuckyHanMo的博客 358

Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计)

https://blog.youkuaiyun.com/wwj_748/article/details/37544835本篇博客介绍Cocos2d-x的第一个实例——重力加速计测试;效果图(注:这里无法模拟重力感应):   [javascript] view plain copy--[[    AccelerometerTest.lua    重力加速器例子  ]]    --返回一个层  local fun...

北极洲的博客 374

ParaView :在paraview创建渲染视图

ParaView :在paraview创建渲染视图

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1304

关于cocos2dx里面的重力感应事件

这次这个只是我学习的一个记录,重力感应就像touch事件一样,我们在init里面开启重力感应事件,然后重写函数就可以了。 首先在init里面开启重力事件: this->setAccelerometerEnabled(true);//开启重力感应 this->setKeypadEnabled(true);//这个是开启手机的返回键事件,大家可以忽略这个 现在我们重写函数:

u014417405的专栏 853

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

cocos2d-x重力感应

1.调用cclayer的方法setAccelerometerEnabled(true)在层里启用重力感应 2.启用重力感应后,重力方向变化时,会回调cclayer的方法didAccelerate( CCAcceleration* pAccelerationValue ),在自己派生的层里重写此方法,如:void MyCarLayer::didAccelerate( CCAcceleratio

justinjing的专栏 4412

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

cocos2dx3.x开启重力感应

//获取事件转发器     auto eventDispatcher = Director::getInstance()->getEventDispatcher();          //开启重力感应     Device::setAccelerometerEnabled(true);     auto listener = EventListenerAcceleratio

TTUZ的博客 1083

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

cocos2dx 3.1.1官方demo阅读-AccelerometerTest【加速度传感器】

初学cocos2dx,希望在看demo的同时能够留下痕迹。 按照字母顺序。

huweigoodboy的专栏 1351

cocos2d-x第一个示例AccelerometerTest.lua详情

local function AccelerometerMainLayer()     --显示标题 AccelerometerTest     local function title()       return "AccelerometerTest"     end     --创建图层     local layer = cc.Layer:create()     --进入时

niaabiaaaaa的博客 647

cocos2dx之CCAccelerometerDelegate

CCAccelerometerDelegate的消息处理机制与win32的消息处理机制一样的,由于篇幅太长,我就不详细解答,CCAccelerMeterDelegate 例子代码如下: void MyAcceleroMeterLayerTest::initLayer() { CCSize size = CCDirector::sharedDirector()->getWinSize()

专注,努力,勤奋 1933

关于Unable to execute dex: Multiple dex files define Lorg/cocos2dx/lib/Cocos2dxAccelerometer的解决

环境:cocos2dx 2.3、ADT、android-19 接手同事的cocos2dx的单机游戏,要接SDK,在elipse上面运行,出现了Unable to execute dex: Multiple dex files define Lorg/cocos2dx/lib/Cocos2dxAccelerometer的错误。直接找到一个解决方法转载------就是remove Android

叶巷的博客 2528

Cocos2d-x之加速度计事件

一些移动设备配备了加速计。加速度计是一种测量重力和方向变化的传感器。Cocos2d-x 也支持这些事件,创建也很容易,但在使用accelerometer events(加速度计事件)之前,你要在设备上,启用它们: Device::setAccelerometerEnabled(true); 创建accelerometer事件: // creating an accelerometer event...

weixin_40763897的博客 2085

android 重力感应和屏幕旋转关系

采用重力加速度感应控制屏幕旋转最为理想。不方便作图,简单说:重力加速度感应可以想象成一个小球在坐标系中,三个方向上的加速度。永远以手机屏幕为准,不以外界为准作图,手机水平放置,向上是y轴正向,向右是x轴正向,向外是z轴正向。这和高数坐标系一样。注意:你移动手机反映在坐标系上你移动的是坐标系远点(旋转) 1. Accelrator的x,y,z轴的正负向变化:    手机屏幕向

懒猫会打盹的专栏 1万+

【Cocos2d-X开发学习笔记】第24期:事件处理机制之加速度传感器事件

本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的操作,比如赛车游戏中摇动手机控制前进 方向、动作过关游戏中通过加速度传感器来控制角色的移动和跳跃方向等。那么这一期,我们就来学习一下如何使用 加速度传感器事件。 ...

810364804 233
上一篇: Cocos2d-x之onEnter与init
下一篇: Cocos2d-x使用过程中遇到的错误(VS下开发,移植到Android发布)
i丹明扬
博客等级 码龄15年 331粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值