cocos2dx—游戏摇杆类(观察者模式控制英雄移动)

1:摇杆类:JoyStick
+  共有继承 public cocos2d::ui::Widget
+  观察者模式
2:成员函数
//头文件#include "ui/CocosGUI.h"#include"cocos2d.h"
//成员cocos2d::ui::ImageView* stick;float radius;//半径cocos2d::Vec2 originPos;//摇杆起始坐标bool isTouch;//是否触摸cocos2d::Vec2 touchAxis;//触摸方向
:3:create 函数:1:背景图片,2摇杆图片
JoyStick* JoyStick::create(const std::string& bgImage, const std::string& stickImage)
{JoyStick* ret = new (std::nothrow)JoyStick();if (ret&&ret->init(bgImage, stickImage)){ret->autorelease();}else{delete ret;ret = nullptr;}return ret;
}
4:init()函数
bool JoyStick::init(const std::string& bgImage, const std::string& stickImage)
{if (!Widget::init()){return false;}//创建背景图片:ImageView可以直接添加触摸/监听事件ImageView* bg = ImageView::create(bgImage);this->addChild(bg);//创建摇杆图片,可以拖动,必须先开启触摸stick = ImageView::create(stickImage);stick->setTouchEnabled(true);//开启触摸this->addChild(stick);//给Stick添加触摸监听事件stick->addTouchEventListener(CC_CALLBACK_2(JoyStick::onJoyStickTouch,this));//初始化半径,坐标radius = bg->getContentSize().width / 2 * bg->getScale();//半径=图片的宽度一半*缩放比例(缩放的时候依然你能使用)originPos = stick->getPosition();//开启默认调度器scheduleUpdate();return true;
}
5:默认调度器update()
//默认调度器
void JoyStick::update(float dt)
{//判断是否触摸if (isTouch&&onJoyStickMoved != nullptr){onJoyStickMoved(touchAxis);}
}
6:摇杆触摸监听事件函数:摇杆拖动时调用
void JoyStick::onJoyStickTouch(Ref* pSender, Widget::TouchEventType type)
{Vec2 touchPoint = Vec2::ZERO;Vec2 pos;switch (type){//触摸开始case cocos2d::ui::Widget::TouchEventType::BEGAN:{isTouch = true;if (onJoyStickBegan != nullptr)//观察者模式调用{onJoyStickBegan();}  touchPoint= stick->getTouchBeganPosition();//获取触摸点的坐标pos=this->convertToNodeSpaceAR(touchPoint); //转换坐标系:将touchPoint从世界转到JoyStick坐标系下stick->setPosition(pos);//stick用触摸点坐标赋值break;}   //触摸移动case cocos2d::ui::Widget::TouchEventType::MOVED:{touchPoint=stick->getTouchMovePosition();//获取触摸点的位置pos = this->convertToNodeSpaceAR(touchPoint); //转换坐标系:将touchPoint从世界转到JoyStick坐标系下stick->setPosition(pos);//stick用触摸点坐标赋值Vec2 offset;//将摇杆限制在半径内offset = pos - originPos;//获得向量if (offset.getLength() > radius)//判断是否大于半径{offset = offset.getNormalized()*radius;//getNormailzed:获得单位向量  长度为1的向量pos = offset + originPos;}stick->setPosition(pos); //stick用触摸点赋值touchAxis = offset.getNormalized();if (onJoyStickMoved != nullptr)//观察者模式调用{onJoyStickMoved(touchAxis);}break;}case cocos2d::ui::Widget::TouchEventType::ENDED: case cocos2d::ui::Widget::TouchEventType::CANCELED: //触摸结束/取消default:{isTouch = false;//摇杆回到原点//stick->setPosition(originPos);auto move = MoveTo::create(0.3f, originPos);stick->runAction(move);//stick->getTouchEndPosition();if (onJoyStickEnded != nullptr)//观察者模式调用{onJoyStickEnded();}break;}     }
}
7:观察者模式类外调用
 //function<返回值类型  (形参表类型)> 变量名typedef std::function<void()> ccJoyStickBeganCallback;typedef std::function<void(cocos2d::Vec2)> ccJoyStickMovedCallback;typedef std::function<void()> ccJoyStickEndedCallback;ccJoyStickBeganCallback onJoyStickBegan;//摇杆开始拖动时ccJoyStickMovedCallback onJoyStickMoved;//摇杆拖动时ccJoyStickEndedCallback onJoyStickEnded;//摇杆结束拖动时
7.1默认构造函数初始化nullptr
 JoyStick():onJoyStickBegan(nullptr), onJoyStickMoved(nullptr), onJoyStickEnded(nullptr),isTouch(false), touchAxis(cocos2d::Vec2(0,0)){}
8:主函数中创建摇杆
void HelloWorld::addJoyStick()
{JoyStick* joy = JoyStick::create("image3/JoyStick_Bg.png", "image3/JoyStick.png");//joy->onJoyStickMoved = CC_CALLBACK_1(Hero::move, hero);//摇杆控制英雄移动joy->setPosition(Vec2(200, 200));this->addChild(joy);
}

cocos2dx---游戏摇杆类(观察者模式控制英雄移动)相关推荐

  1. uni-app:游戏摇杆,遥控控制4方向 常用于移动端组件

    一.效果图 二.编写步骤及原理 1.方法一:利用css三角形原理, 缺点:不能准确控制盒子大小 (建议使用 方法二) 代码如下(示例): <template><view class= ...

  2. 最齐全的Cocos2D Cocos creator Cocos2Dx游戏源代码素材,速来收藏

    Cocos2D Cocos creator Cocos2Dx游戏源代码类资源应该算是素材类网站中必不可少的资源类型了吧~今天给大家推荐超好用,免费质量高的素材噢,让你坐拥海量资源同时又不撞款! 本人曾 ...

  3. Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要格斗》(1)

      这里是Evankaka的博客,欢迎大家前面讨论与交流------      转载请注明出处http://blog.csdn.net/evankaka/article/details/4204350 ...

  4. Cocos2d-x虚拟摇杆控制精灵上下左右运动之————“赵云要格斗”(1)

    转载请注明出处http://blog.csdn.net/evankaka/article/details/42043509 有需要源代码和材料的邮箱留个,这里实现了能通过虚拟摇杆控制精灵的运动,而且能 ...

  5. cocos2dx游戏开发学习——虚拟摇杆(8方向)讲解

    写这篇博客的目的主要是记录一下 虚拟摇杆的实现过程.虚拟摇杆一般分文四方向和八方向,也主要根据项目需求来决定.直接进入主题吧. 先上效果图: 方向的思路分析 看图,说先我们可以将8个方向在坐标系中画出 ...

  6. 手机游戏摇杆控制人物移动解决方案

    手机游戏摇杆控制人物移动解决方案 https://zhuanlan.zhihu.com/p/358614239 完成之后的演示 一.摇杆的UI搭建 Panel里主要是一个摇杆的背景(圆环)和摇杆头(红 ...

  7. cocos2d-x 游戏 之 Tiled Map Editor(地图编辑)

    转载于:http://blog.csdn.net/zhy_cheng/article/details/8308609 Tiled Map Editor是Cocos2d-x支持的地图编辑器,使用Tile ...

  8. 15款Cocos2d-x游戏源码

    (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现.新局面.悔棋.游戏音乐.胜利后会显示游戏结果. 源码下载:http://www ...

  9. 15款Cocos2d-x游戏源码 1

    转自:http://blog.okbase.net/iphone/archive/4619.html (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象 ...

最新文章

  1. 每天一道LeetCode-----数独盘求解
  2. oracledatabase11gr2怎么打开_win10 安装oracle 11gR2_database(内附下载地址)
  3. monkey测试小结
  4. SAP License:SAP Business One系统功能
  5. 如何保养与维护笔记本硬盘
  6. Java中的ConcurrentModificationException
  7. jsp java 购物车,jsp简单购物车
  8. 在ideaIU上使用JDBC连接MySQL及简单操作
  9. 管理好项目——带好技术团队的秘籍
  10. 基于linux的软件测试,基于linux的Web服务器性能测试
  11. Apache-DBUtils实现CRUD操作
  12. 出方向链路负载均衡技术(原理部分)
  13. H3C S5560-EI系列交换机配置Web管理
  14. itext生成pdf文档时给文档添加背景图片
  15. 关于selenium调用firefox浏览器的调试
  16. 澳洲留学生论文写作必备好用软件or网站
  17. app互斥登录,只能登录一个.
  18. _.chunk的用法
  19. 56个国内常用快递公司网址
  20. Flex/FlashBuilder4.5破解

热门文章

  1. 年薪百万交流python群
  2. 微信公众号注销【已解决】
  3. 简单血条UI的制作以及跟随物体
  4. 学术工具-3分钟玩转毕业论文文献引用及文献计量可视化分析(CNKI版)
  5. oracle 差分备份,Oracle数据库RMAN备份与恢复:备份与恢复(手机搬家)
  6. Spring生命周期——简介
  7. 反汇编调试之分析OOPS
  8. Java 实现线程安全的方式
  9. Selenium webdriver安装配置
  10. 新办理的手机卡提示已被注册微信该如何处理?