位置: 编程技术 - 正文

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

  • 什么是虚开增票
  • 增值税和城建税怎么算
  • 个体工商户月销售额超10万怎么报税
  • 机票的抵扣进项怎么抵扣
  • 本年利润每个月都转吗
  • 一次性支付一年房租怎么做账每月如何结转
  • 银行存款利息收入要交增值税吗
  • 房屋租赁收入还需要缴纳附加税吗
  • 酒店出租会议室增值税税率
  • 销售农业产品的税率
  • 购进原材料发生非正常损失,账面成本10万元 该原材料
  • 买了两个可以退一个吗
  • 租赁公司扣押金
  • 给分公司开发票由总公司付款怎么办?
  • 税局代开的法律顾问费能否抵扣
  • 因台风造成原材料毁损计入什么科目
  • 待摊费用按照入账金额还是合同金额摊销?
  • 所得税季度申报表营业成本怎么填
  • 为什么增值税发票综合服务平台进不去
  • 失控包括
  • 去年盈利今年亏损怎么表达
  • 固定资产加速折旧最新政策2023
  • 母公司开票给子公司有什么税务风险吗
  • 个人交社保可以交生育险吗
  • 1697510586
  • 关于房屋租赁备案的通知
  • 增值税贷方余额为负数怎么调整
  • 360se进程太多
  • 劳动法律法规包含哪些
  • js在web前端中的作用
  • 应收票据到期收款
  • 最早的手机是哪一年
  • php实现和工作原理
  • phpcgi远程代码执行漏洞
  • 电子发票有哪些版本
  • svc语法
  • 公司变更需要哪些资料~问华杰 财务
  • Vue 3 介绍
  • 层层剖析的近义词
  • passwd -s命令
  • 免征增值税账务怎么处理
  • 如何开发客户群体
  • 自然人独资可以变更为有限责任公司
  • python爬虫详细教程
  • 旅游费记入什么科目
  • 公司股东向银行货款,与私人财产有没有关系
  • 企业给员工报销的个人消费支出如何计税
  • 交强险和车船税在哪里买
  • 个税年终奖计算方法2022税率表
  • 暂估收入的会计分录怎么写
  • 库存现金日记账怎么填
  • 收到加盟费应该怎么做账
  • 研发样品是什么费用
  • 银行受理汇票贴现业务
  • 没有认证的进项发票可以做成本吗
  • 库存商品账务没做如何调增
  • mysql 5.6.26 winx64安装配置图文教程(一)
  • sql server 2005如何使用
  • windows自带截图软件
  • windows pe无法启动怎么办
  • 使用u盘安装win10
  • win7删除windows.old
  • CentOS ip_conntrack: table full, dropping packet 的解决方法
  • graphics.dll
  • shell 子函数
  • 在linux操作系统中
  • bootstrap框架怎么用
  • bat上传文件
  • 手把手教你学python
  • node.js快速入门
  • javascript小数四舍五入多种方法实现
  • android中handler机制
  • javascript getattribute
  • unity怎么做触屏按键
  • python中for循环写法
  • 河北省国家税务局长简介
  • 西安市港务区属于哪个街道办
  • a类棉b类棉c类的区别
  • 教育培训机构都交哪些税
  • 日本各界
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设