cocos2d-x-3.3-018-游戏摇杆joystick源码分享
来源:未知 责任编辑:责任编辑 发表时间:2015-09-16 20:03 点击:次
-
核心思想
- 解耦,采用事件机制将joystick的事件和目标对象之间的关联进行解耦
实现思路
- 1.继承自layer并注册监听touch event
- 2.若touch事件在joystick的中心点触发的,则继续下面的逻辑
- 3.更新joystick中心点的位置
- 4.计算touch点joystick中心点的角度(角度范围,第一象限[0, 90], 第二象限[90, 180], 第三象限[-180, -90], 第四象限[-90, 0])
- 5.发布自定义的joystick event,目前事件仅包含上面计算的角度值,可根据需要进行增改
- 6.注册joystick event的事件监听器,并在回调函数里实现你的业务逻辑
- 7.joystick event中的userdata的内存释放,交给auto-release-pool了, 具体见JoystickEvent的实现
核心代码
- JoystickEvent主要是规范内存管理,严格按照cocos的'风俗'进行: 两段构造方式create+Ref+pool,使create出的对象像个栈上的局部变量。(mainLoop下次清理pool时自动删除)。
- Joystick的核心代码
bool Joystick::init() { bool result = false; do { // 父类初始化 if (!Layer::init()) { break; } // joystick的背景 mJsBg = Sprite::create(joystick_bg.png); if (nullptr == mJsBg) { break; } mJsBg->setPosition(mJsPos); addChild(mJsBg); // joystick的中心点 mJsCenter = Sprite::create(joystick_center.png); if (nullptr == mJsCenter) { break; } mJsCenter->setPosition(mJsPos); addChild(mJsCenter); // touch event监听 auto touchListener = EventListenerTouchOneByOne::create(); if (nullptr == touchListener) { break; } touchListener->setSwallowTouches(true); touchListener->onTouchBegan = CC_CALLBACK_2(Joystick::onTouchBegan, this); touchListener->onTouchMoved = CC_CALLBACK_2(Joystick::onTouchMoved, this); touchListener->onTouchEnded = CC_CALLBACK_2(Joystick::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); result = true; } while (0); return result; } bool Joystick::onTouchBegan(Touch *touch, Event *unused_event) { log(onTouchBegan); auto point = touch->getLocation(); if (mJsCenter->getBoundingBox().containsPoint(point)) { // 若触摸点在joystick的中心点,则继续接受事件 return true; } // 否则不接受后续事件 return false; } void Joystick::onTouchMoved(Touch *touch, Event *unused_event) { log(onTouchMoved); // 1. 获得角度, //第一象限是0,90度 //第二象限是90,180度 //第三象限是-90,-180度 //第四象限是-90,0度 Vec2 point = touch->getLocation(); double y = point.y - mJsPos.y; double x = point.x - mJsPos.x; double angle = atan2(y, x) * 180 / PI; log(------------------------------------ %f, angle); // 2. 更新joystick中心点位置,目的是想让中心点始终在它的背景图范围 // joystick背景图半径 double jsBgRadis = mJsBg->getContentSize().width * 0.5; //触摸点到中心点的实际距离 double distanceOfTouchPointToCenter = sqrt( pow(mJsPos.x - point.x, 2) + pow(mJsPos.y - point.y, 2)); if (distanceOfTouchPointToCenter >= jsBgRadis) { //利用等比关系计算delta x y double deltX = x * (jsBgRadis / distanceOfTouchPointToCenter); double deltY = y * (jsBgRadis / distanceOfTouchPointToCenter); mJsCenter->setPosition(Vec2(mJsPos.x + deltX, mJsPos.y + deltY)); } else { mJsCenter->setPosition(point); } // 3. 分发joystick event JoystickEvent* jsEvent = JoystickEvent::create(); jsEvent->mAnagle = angle; Director::getInstance()->getEventDispatcher()->dispatchCustomEvent( JoystickEvent::EVENT_JOYSTICK, jsEvent); } void Joystick::onTouchEnded(Touch *touch, Event *unused_event) { log(onTouchEnded); // 事件结束,还原joystick中心点位置 mJsCenter->setPosition(mJsPos); }
- 解耦,采用事件机制将joystick的事件和目标对象之间的关联进行解耦
相关新闻>>
- Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2
- Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3
- Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走
- Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走
- 用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编
- Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
- Cocos2d-x3.0游戏实例之《别救我》第一篇——前言
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>
您可能感兴趣的文章
- UIViewController的retainCount(Object C)
- cocos2d-x-3.0 alpha1与C++11练习三:飞镖忍者,如何移动精灵及
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编
- quick-cocos2d-x教程12:实现文本和密码输入界面
- Cocos2d-x3.0 文件处理
- cocos2d-x在mac下配置安卓开发环境
- 五 手游开发神器 cocos2d-x editor 之贴图(TexturePacker)
- cocos2dx V3.2 mac os Xcode6.1 环境配置
- 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之
- symbian UI开发小结(一)