位置: 编程技术 - 正文

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

  • 个税汇算清缴系统找不到扣缴义务人
  • 换了公司后个税还要申请申报吗
  • 开发成本需要结转到存货吗
  • 收到幼儿园园服费怎么做财务处理?
  • 增值税专票丢了能补开吗
  • 与收益相关的政府补助会计分录总额法
  • 股东投资属于什么会计要素
  • 印花税购销合同计税金额怎么算
  • 小规模纳税人收入超过500万怎么办
  • 增值税普通发票有什么用
  • 税务行政强制行为遵循的原则
  • 清算所得计算例题
  • 企业大中小型划分最新标准
  • 无票收入增值税申报表怎么填小规模纳税人
  • 销售方开具的红字信息表
  • 质量抽样检查
  • 哪些发票公司可以抵扣
  • 工资薪金所得税前扣除项目标准
  • 分期收款确认成功怎么办
  • 管理费用与税金的比例
  • 以前年度的其他应付款不用付怎么处理
  • 最新的会计规定出台时间
  • php怎么把图片存入mysql
  • 微博 照片水印
  • 劳务费要申报个税吗怎么申报
  • 错误代码:0x0000428
  • gnu/linux
  • 财务指标有哪四类
  • npm info: node: --openssl-legacy-provider is not allowed in NODE_OPTIONS
  • 最贵的十张照片
  • mysql.php
  • 威尔士黄水仙
  • 出口货物不退税进项可以开具普通发票吗
  • python制作chm
  • thinkphp d方法
  • php考试时间倒计时
  • php如何防止sql注入攻击
  • 刷题笔贴吧
  • 长期待摊费用装修款如何摊销
  • 抄税前要做什么
  • 工程运维预缴增值税税率
  • 被盗的固定资产如何处理
  • 工会经费发放奖励个税处理
  • 税收种类包括哪几种
  • 准则规定的内容是
  • sql 列数
  • SqlServer 2005 T-SQL Query 学习笔记(1)
  • 企业特殊工种不备案可以补报备吗
  • 投资性房地产转固定资产账务处理
  • 免征增值税和增值税区别
  • sql server获取字段长度
  • 货款发票如何入账
  • 材料估价入库发票收到如何记账
  • 投资收益算在营业利润里面吗
  • 专利年费 缴纳
  • 银行回单太多了
  • 房地产企业收到政府补助
  • 收回多发工资需要什么附件入账
  • 个体户一个月能赚多少钱
  • 外商投资企业开什么发票
  • 会计一般用什么软件
  • 如何调整bios
  • mac硬盘的常见问题及解决
  • win8 chkdsk
  • win7开机进入桌面黑屏但有鼠标
  • 统计动态分析
  • javascript中的this
  • Android之Android apk动态加载机制的研究
  • 微信小程序tabbar颜色
  • flask使用celery
  • unity-
  • shell脚本if用法
  • unity3d怎么做动画
  • python 数据结构 算法
  • jquery on()
  • jquery全局变量和局部变量
  • python字符串的用法
  • 法制建设包括哪三个方面
  • 广东国税局局长是谁
  • 退回的汽车保险入什么科目
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设