位置: 编程技术 - 正文

cocos2dx触摸摇杆(coco触控)

编辑:rootadmin

推荐整理分享cocos2dx触摸摇杆(coco触控),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cocos creator摇杆,cocos creator触摸移动,coco触控,coco触控,cocos creator触摸移动,coco触控游戏官网,cocos creator摇杆,cocos creator摇杆,内容如对您有帮助,希望把文章链接给更多的朋友!

最近想做&#;斗游戏,那么就要有摇杆控件,不想去看别人的代码就自己写了个摇杆控件,实现起来很简单。

话不多说,看代码:

#ifndef __Joystick__#define __Joystick__ #include "cocos2d.h"USING_NS_CC; enum JoystickEnum{ DEFAULT, D_UP, D_DOWN, D_LEFT, D_RIGHT, D_LEFT_UP, D_LEFT_DOWN, D_RIGHT_UP, D_RIGHT_DOWN}; class Joystick : public Layer{ public: /** 启动搖杆器 */ void onRun(); /** 清除数据 */ void onDisable(); /** 设置死亡半径,即超出半径將摇杆器失效 */ void setDieRadius(float radius); /** 设置无效区域半径(如果在无效区域內,將重置) */ void setFailRadius(float radius); /** 是否显示底盘和触点 */ void setVisibleJoystick(bool visible); /** 是否自由变换摇杆器的位置,即在屏幕上每一次按下鼠标时的坐标将是摇杆器的坐标,移动时将不改变摇杆器坐标,直到下次按下鼠标 */ void setAutoPosition(bool value); /** 回调函数指针 */ std::function<void(JoystickEnum)> onDirection; /** 静态创建函数(需要传入底盘和触点图片路径) */ static Joystick* create(std::string chassisPath,std::string dotPath); /** 初始化摇杆器(需要传入底盘和触点图片路径) */ void initWithJoystick(std::string chassisPath,std::string dotPath); protected: /** 有效区域半径 */ float _radius; /** 失效区域半径 */ float _failradius; /** 是否移出有效区域 */ bool isMoveOut; /** 是否存在有效区域半径 */ bool isDieRadius; /** 是否自由变换摇杆器坐标 */ bool isAutoPosition; /** 方向 */ JoystickEnum _direction; /** 底盘 */ Sprite* _chassis; /** 触点 */ Sprite* _touchDot; EventListenerTouchOneByOne* listener; bool onTouchBegan(Touch* touch,Event* event); void onTouchMoved(Touch* touch,Event* event); void onTouchEnded(Touch* touch,Event* event); /** 1、设置触点,并判断是否在无效区域内(如果在无效区域内,将重置) 2、发送角度变化(如果不在无效区域内) */ void setTouchDotPosition(Vec2 vec1,Vec2 vec2); /** 1、计算摇杆器八方向 2、发送角度变化,回调弧度变化函数 */ void changeAngle( Vec2 position ); /** 回调注册的监听函数 */ void callDirectionFun(); /** 重置(当弧度不是 DEFAULT时才重置) */ void resetState(); }; #endif#include "Joystick.h" Joystick* Joystick::create(std::string chassisPath,std::string dotPath){ auto joystick = new Joystick(); joystick->initWithJoystick(chassisPath,dotPath); return joystick;} void Joystick::initWithJoystick(std::string chassisPath,std::string dotPath){ _chassis = Sprite::create(chassisPath); this->addChild(_chassis,0); _touchDot = Sprite::create(dotPath); this->addChild(_touchDot,1); isDieRadius = false; isAutoPosition = false; isMoveOut = false; _direction = DEFAULT;} void Joystick::onRun(){ listener = EventListenerTouchOneByOne::create(); listener->setSwallowTouches(false); listener->onTouchBegan = CC_CALLBACK_2(Joystick::onTouchBegan,this); listener->onTouchMoved = CC_CALLBACK_2(Joystick::onTouchMoved,this); listener->onTouchEnded = CC_CALLBACK_2(Joystick::onTouchEnded,this); this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);} bool Joystick::onTouchBegan(Touch* touch,Event* event){ Vec2 locationInNode = this->convertToNodeSpace(touch->getLocation()); if( isAutoPosition ) { this->setPosition(touch->getLocation()); return true; } if( isAutoPosition==false && isDieRadius ) { if( locationInNode.getLength() > _radius ) { return false; } } _touchDot->setPosition(locationInNode); if( locationInNode.getLength() > _failradius ) { changeAngle(locationInNode); } return true;}void Joystick::onTouchMoved(Touch* touch,Event* event){ Vec2 locationInNode = this->convertToNodeSpace(touch->getLocation()); if( isDieRadius ) { if( locationInNode.getLength() < _radius ) { if( isMoveOut ) { _touchDot->setPosition(locationInNode); isMoveOut = false; } setTouchDotPosition(locationInNode,_touchDot->getPosition() &#; touch->getDelta()); return; } } else { setTouchDotPosition(locationInNode,_touchDot->getPosition() &#; touch->getDelta()); return; } isMoveOut = true; _touchDot->setPosition(0,0); resetState();}void Joystick::onTouchEnded(Touch* touch,Event* event){ _touchDot->setPosition(0,0); isMoveOut = false; resetState();} void Joystick::setTouchDotPosition(Vec2 vec1,Vec2 vec2){ _touchDot->setPosition(vec2); if( _failradius>0 ) { if( vec1.getLength() < _failradius ) { resetState(); return; } } changeAngle(vec1);} void Joystick::setDieRadius(float radius){ _radius = radius; isDieRadius = true;} void Joystick::setAutoPosition(bool value){ isAutoPosition = value;} void Joystick::setFailRadius(float radius){ _failradius = radius;} void Joystick::onDisable(){ this->_eventDispatcher->removeEventListener(listener); isDieRadius = false; isAutoPosition = false; isMoveOut = false;} void Joystick::changeAngle( Vec2 position ){ auto angle = CC_RADIANS_TO_DEGREES(position.getAngle()); if(angle > -.5 && angle < .5) { _direction=D_RIGHT; } else if(angle > .5 && angle < .5) { _direction=D_RIGHT_UP; } else if(angle > .5 && angle < .5) { _direction=D_UP; } else if(angle > .5 && angle < .5) { _direction=D_LEFT_UP; } else if((angle > .5 && angle < )||(angle < -.5 && angle > -)) { _direction=D_LEFT; } else if(angle < -.5 && angle > -.5) { _direction=D_LEFT_DOWN; } else if(angle < -.5 && angle > -.5) { _direction=D_DOWN; } else if(angle < -.5 && angle > -.5) { _direction=D_RIGHT_DOWN; } callDirectionFun();} void Joystick::callDirectionFun(){ if( onDirection ) { onDirection(_direction); }} void Joystick::resetState(){ if(_direction != DEFAULT) { _direction = DEFAULT; callDirectionFun(); }} void Joystick::setVisibleJoystick(bool visible){ _chassis->setVisible(visible); _touchDot->setVisible(visible);}

当然,如果有用到的朋友可以自己修改。这只是最简单的实现。

下面有效果图,不过加载比较慢

普通模式:

auto joystick = Joystick::create("rocker.png","rocker_joy.png");//通过两张图片初始化控件this->addChild(joystick);joystick->setPosition(VisibleRect::leftBottom()&#;Vec2(,));//設置初始位置  joystick->onDirection=CC_CALLBACK_1(SceneMain::onDirection,this);//角度变化更新(onDirection(JoystickEnum enums))joystick->onRun();//启动

存在死亡半径模式:(超出死亡半径将触点重置初始位置,移动失效)

auto joystick = Joystick::create("rocker.png","rocker_joy.png");//通过两张图片初始化控件this->addChild(joystick);joystick->setPosition(VisibleRect::leftBottom()&#;Vec2(,));//设置初始位置joystick->setDieRadius();//设置死亡半径(外圈)joystick->onDirection=CC_CALLBACK_1(SceneMain::onDirection,this);//角度变化更新(onDirection(JoystickEnum enums))joystick->onRun();//启动cocos2dx触摸摇杆(coco触控)

设置失效半径:(在失效半径内将不会触发角度改变事件)

auto joystick = Joystick::create("rocker.png","rocker_joy.png");//通过两张图片初始化控件this->addChild(joystick);joystick->setPosition(VisibleRect::leftBottom()&#;Vec2(,));//设置初始位置joystick->setDieRadius();//设置死亡半径(外圈)joystick->setFailRadius();//设置失效半径(內圈) joystick->onDirection=CC_CALLBACK_1(SceneMain::onDirection,this);//角度变化更新(onDirection(JoystickEnum enums))joystick->onRun();//启动

设置自由变换位置:以鼠标按下的坐标为初始位置

auto joystick = Joystick::create("rocker.png","rocker_joy.png");//通过两张图片初始化控件this->addChild(joystick);joystick->setPosition(VisibleRect::leftBottom()&#;Vec2(,));//设置初始位置joystick->setAutoPosition(true);//是否自由改变坐标joystick->onDirection=CC_CALLBACK_1(SceneMain::onDirection,this);//角度变化更新joystick->onRun();//启动

设置隐藏摇杆:(不显示摇杆底盘和触点,一般会设置成自由改变位置)

auto joystick = Joystick::create("rocker.png","rocker_joy.png");//通过两张图片初始化控件this->addChild(joystick);joystick->setPosition(VisibleRect::leftBottom()&#;Vec2(,));//设置初始位置joystick->setAutoPosition(true);//是否自由改变坐标joystick->setVisibleJoystick(false);//是否显示joystick->onDirection=CC_CALLBACK_1(SceneMain::onDirection,this);//角度变化更新joystick->onRun();//启动

来源网址:

Bullet之了解Force Torque Impulse 在了解ForceImpulseTorque之前,先来看看setLinearVelocity,setAngularVelocity一个是线速度,一个是角速度理解起来是很简单的设置body的线速度和角速度//线速度con

cocos2dx文字描边问题解决 很久以前做过的事了,突然想到就拿出来分享下,也顺便复习复习。cocos2dx的文字描边一直有问题,ios和android的显示都不正确,后者是描边很黑,遇见

cocos2dx quicxk 3.3 导入Json文件布局 UI localmyUILoader=cc.uiloader.new()localnode,width,height=myUILoader:load(UIJsonExport/loginFrame.Json)node:addTo(self)spanstyle=white-space:pre/span--localloginButton=myUILoader:seekNodeByName(node,log

标签: coco触控

本文链接地址:https://www.jiuchutong.com/biancheng/372701.html 转载请保留说明!

上一篇:Cocos2d-x 各种诡异问题经验记录(cocos creator2.4)

下一篇:Bullet之了解Force Torque Impulse

  • 账簿印花税的计税方法
  • 研发设备定义
  • 专票待认证
  • 月初领票后还能作废申报吗
  • 劳务公司涉及的税收
  • 通行费发票怎么合并一张发票
  • 从银行提取现金用途
  • 汇总记账凭证长什么样
  • 出口退税进项发票
  • 月底结转应交税费怎么弄
  • 免抵退税应退税额
  • 建筑行业包含哪些项目
  • 一年过去了,特朗普减税效果如何?
  • 退税勾选后怎么申报
  • 新公司没有实收资本,他的钱从哪来
  • 应交税费属于什么费用科目
  • 出口退税率怎么算公式是什么
  • 研发样机转销售合法吗
  • 小规模纳税人附加税减半征收政策2023
  • 个人帮公司买东西怎么报销
  • 贸易型企业怎么做账
  • 预缴企业所得税怎么做账务处理
  • php中面向对象
  • deepin正式版
  • 资源税纳税申报流程
  • 城市赚钱项目
  • 关于扩展检索,下列说法正确的是
  • 赤狐,荷兰 (© Wim Weenink/Minden Pictures)
  • 中秋快乐图片大全
  • 开票一定要对公户嘛
  • php获取文件夹大小
  • php面向对象的三大特征
  • 【深度学习】模型过拟合的原因以及解决办法
  • 微信小程序获取地理位置
  • vscode的常用插件
  • vgrename命令 重命名卷组
  • series转换为dataframe
  • 融资租赁后续会计处理
  • 购买员工团体意外险肺炎能报销吗
  • 增值税 转出
  • 帝国cms真的很好用
  • 个体户税率征收
  • 电费已付,没有收到发票
  • 购买种子能抵扣进项吗
  • 预计净残值影响折旧吗
  • 一般纳税人销售旧货
  • 怎么盘存货
  • 小规模纳税人缴纳增值税怎么做账
  • 企业发行债券的优点有哪些
  • 水利基金和印花税的计税依据一样吗
  • 两个企业同一个法人
  • 以现金支付办公用品费440元
  • 税收奖励账务处理
  • 银行日记账年底是0第二年年初怎么写
  • 应收账款怎样记账
  • macos装mysql
  • 台式电脑NUM LOCK键还能亮,算不算死机了
  • win8破解密码开机密码
  • 如何使用xp
  • linux操作系统的发行版本有哪些
  • centos7搭建lamp 详细
  • win8打开运行的快捷键是什么
  • windows8输入法
  • android环境搭建实训心得
  • 怎样从零开始
  • unity怎么做触屏按键
  • unity如何避免碰撞穿透
  • websocket解决跨域
  • python socket编程步骤
  • unity yield
  • nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
  • python指令生成脚本
  • js实现多继承
  • js中eval函数是干嘛的
  • 侧边栏html
  • 国家税务局服务宗旨是什么
  • 湖南省低保电话是多少?
  • 湖南社保费申报测算管理系统登录不了
  • 广东省电子税务局app
  • 应交税金包含企业所得税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设