位置: 编程技术 - 正文

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

  • 小规模纳税人销售自建不动产
  • 一般纳税人是否可以开普票
  • 收取违约金是否交税
  • 房产税税源信息采集错误已到申报期怎么办
  • 进口商品需要缴纳VAT税吗
  • 预收账款借方和贷方表示什么
  • 股东个人向公司借款会计分录
  • 外贸企业出口货物
  • 政策信息咨询服务要到哪个部门办理资质
  • 计提成本会计分录
  • 材料验收入库并结转差异记账凭证
  • 出口货物退回需要进口税吗
  • 已认证发票退回的会计分录
  • 建筑资质挂靠费用怎么写会计分录?
  • 朋友挂靠公司社保
  • 增值税税收返还资料
  • 集团公司向子公司收取管理费的法律规定
  • 增值税抵扣进项税额交税账务处理
  • 自产自销的产品怎么做账
  • 回迁房怎么交税
  • 统一信用社会代码怎么填
  • 收入和成本都是真实发生的但是不匹配
  • 会计准则规定
  • 小规模纳税人取得专票如何处理
  • 建设银行对公转账限额
  • 增值税收入和所得税收入不一致怎么办
  • 腾讯手游助手卡顿严重
  • 销售返点怎么做分录
  • win10自动关机方法
  • 手动ghost还原硬盘
  • php的类
  • 自由职业者如何交五险一金
  • 收到债劵利息会减少吗
  • 员工购买住房公积金申请
  • php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
  • 安装tensorflow1
  • 进销项抵扣规则
  • 媒体查询是什么
  • chattr i
  • jsp标签大全
  • 工业企业成本核算会计分录
  • 织梦自定义字段
  • 织梦专题页模板
  • 固定资产清理借方表示什么意思
  • 发票替票该怎么做账
  • 资产负债表怎么看盈利或亏损
  • 合同履约成本如何设置明细科目
  • 外地预缴怎么算
  • 会计利润调增调减项目
  • 成本法核算的投资收益缴纳企业所得税
  • 微信扣款手续费
  • 委托加工物资加工费的增值税计入成本吗
  • 商品预计退回会扣钱吗
  • 原告起诉被告承担诉讼费
  • 固定资产有尾款怎么入账
  • 请问购买
  • win10玩魔兽争霸卡顿
  • centos安装ntfs 3g
  • Solaris 远程磁带备份步骤
  • win2016 ntp
  • mac的icloud
  • 如何手动修改VID与PID
  • win10更新中途怎么取消
  • win7右键没有
  • Ubuntu 14.04 LTS中安装fcitx中文输入法的教程
  • 优化太差
  • opengl教程48讲
  • 如何自定义控件
  • nodejs run
  • angular创建项目命令
  • 基于javaweb的物流管理系统
  • 细说javascript
  • Unity C#用WWW操作数据库
  • 使用权资产
  • shell 1>&2 2>&1 &>filename重定向的含义和区别
  • 可扩展的敏捷方法有哪两种观点,并作以简单阐述?
  • js需要学到什么程度
  • python图片验证码输入错误不能点登陆
  • 企业自建自用房产税如何缴纳
  • 税务稽查证据问题
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设