cocos2dx---游戏摇杆类(观察者模式控制英雄移动)
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---游戏摇杆类(观察者模式控制英雄移动)相关推荐
- uni-app:游戏摇杆,遥控控制4方向 常用于移动端组件
一.效果图 二.编写步骤及原理 1.方法一:利用css三角形原理, 缺点:不能准确控制盒子大小 (建议使用 方法二) 代码如下(示例): <template><view class= ...
- 最齐全的Cocos2D Cocos creator Cocos2Dx游戏源代码素材,速来收藏
Cocos2D Cocos creator Cocos2Dx游戏源代码类资源应该算是素材类网站中必不可少的资源类型了吧~今天给大家推荐超好用,免费质量高的素材噢,让你坐拥海量资源同时又不撞款! 本人曾 ...
- Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要格斗》(1)
这里是Evankaka的博客,欢迎大家前面讨论与交流------ 转载请注明出处http://blog.csdn.net/evankaka/article/details/4204350 ...
- Cocos2d-x虚拟摇杆控制精灵上下左右运动之————“赵云要格斗”(1)
转载请注明出处http://blog.csdn.net/evankaka/article/details/42043509 有需要源代码和材料的邮箱留个,这里实现了能通过虚拟摇杆控制精灵的运动,而且能 ...
- cocos2dx游戏开发学习——虚拟摇杆(8方向)讲解
写这篇博客的目的主要是记录一下 虚拟摇杆的实现过程.虚拟摇杆一般分文四方向和八方向,也主要根据项目需求来决定.直接进入主题吧. 先上效果图: 方向的思路分析 看图,说先我们可以将8个方向在坐标系中画出 ...
- 手机游戏摇杆控制人物移动解决方案
手机游戏摇杆控制人物移动解决方案 https://zhuanlan.zhihu.com/p/358614239 完成之后的演示 一.摇杆的UI搭建 Panel里主要是一个摇杆的背景(圆环)和摇杆头(红 ...
- cocos2d-x 游戏 之 Tiled Map Editor(地图编辑)
转载于:http://blog.csdn.net/zhy_cheng/article/details/8308609 Tiled Map Editor是Cocos2d-x支持的地图编辑器,使用Tile ...
- 15款Cocos2d-x游戏源码
(1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现.新局面.悔棋.游戏音乐.胜利后会显示游戏结果. 源码下载:http://www ...
- 15款Cocos2d-x游戏源码 1
转自:http://blog.okbase.net/iphone/archive/4619.html (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象 ...
最新文章
- 每天一道LeetCode-----数独盘求解
- oracledatabase11gr2怎么打开_win10 安装oracle 11gR2_database(内附下载地址)
- monkey测试小结
- SAP License:SAP Business One系统功能
- 如何保养与维护笔记本硬盘
- Java中的ConcurrentModificationException
- jsp java 购物车,jsp简单购物车
- 在ideaIU上使用JDBC连接MySQL及简单操作
- 管理好项目——带好技术团队的秘籍
- 基于linux的软件测试,基于linux的Web服务器性能测试
- Apache-DBUtils实现CRUD操作
- 出方向链路负载均衡技术(原理部分)
- H3C S5560-EI系列交换机配置Web管理
- itext生成pdf文档时给文档添加背景图片
- 关于selenium调用firefox浏览器的调试
- 澳洲留学生论文写作必备好用软件or网站
- app互斥登录,只能登录一个.
- _.chunk的用法
- 56个国内常用快递公司网址
- Flex/FlashBuilder4.5破解