位置: 编程技术 - 正文

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标准
  • 食堂买菜怎么算
  • windows7中右键的作用
  • 五险二金的二金有什么好处
  • 备用金包括哪些大类
  • 预提费用年终有余额怎么办
  • 预付账款主要是
  • 保养费计入什么科目
  • PHP:ignore_user_abort()的用法_misc函数
  • 广告制作公司成本核算包含哪些
  • torch.save用法
  • win11大小核调度会优化吗
  • css鼠标移入移出切换事件
  • ts中如何定义一个数组
  • ai形成生成器工具怎么用
  • node-js
  • 党费返还怎么记账
  • 社保费用如何做账,社保费会计分录如何写
  • 帝国cms常见的英文
  • 最新外资企业法实施条例
  • sqlserver2008无法连接到local用户登录失败
  • 用友t3怎样查明细账
  • 中小企业会计科目
  • 结转本年利润的账务处理
  • 残保金计算公式及例题
  • 大家怎么看理想这个牌子
  • 暂估收入的会计分录怎么写
  • 企业给员工单独交社保
  • 公户转私户的钱会退回吗
  • 基本医疗保险费是医保吗
  • 未确认融资费用借贷方向
  • 工程未完工,费用怎么处理
  • 个税抵扣项目是什么
  • 增值税年末一定要结转吗
  • 如何对企业进行有效的控制
  • 生产环境如何对linux进行合理分区
  • netsh cmd
  • xp系统桌面图标怎么设置
  • hp是什么代码
  • linux下时间同步的两种方法分享
  • windows 10 周年更新
  • linux k
  • Linux VPN 出现 807 错误的解决办法
  • Access to the path "LibraryUnityAssembliesUnityEngine.xml" is denied.
  • js设置iframe隐藏
  • cocos2dx屏幕适配解决方案
  • unity3D游戏开发
  • html5+javascript实现简单上传的注意细节
  • nodejs webapp
  • es6新方法有哪些
  • shell脚本实现批量移动文件
  • noodoe如何使用
  • python爬虫教程推荐
  • 安卓接口回调例子
  • 公务员中了彩票怎么领取
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设