cocos2d-x游戏摇杆的实现方法
来源:互联网 发布:php ini 上传文件大小 编辑:程序博客网 时间:2024/05/01 20:35
出处:Himi http://www.himigame.com 对于想学移动游戏开发的同仁强烈推荐!!!
虚拟摇杆类起名为:HRocker
下面是 HRocker.h 文件:
#include <iostream>#include "cocos2d.h"using namespace cocos2d;//枚举型:用于标识摇杆与摇杆的背景typedef enum{ tag_rocker, tag_rockerBG, }tagForHRocker;class HRocker : public CCLayer{public: //创建摇杆,摇杆图片,摇杆背景图片,起始坐标 static HRocker* createHRocker(const char* rockerImageName, const char* rockerBGImageName, CCPoint position); //启动摇杆 void startRocker(bool _isStopOther); //停止摇杆 void stopRocker();private: void rockerInit(const char* rockerImageName, const char* rockerBGImageName, CCPoint position); //得到半径为r的圆周运动上一个角度应对应的x,y坐标 CCPoint getAnglePosition(float r, float angle); //是否可操作摇杆 bool isCanMove; //得到摇杆与用户触屏点的角度 float getRad(CCPoint pos1, CCPoint pos2); //摇杆背景的坐标 CCPoint rockerBGPosition; //摇杆背景的半径 float rockerBGR; //触屏事件 virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event); virtual void ccTouchMoved(CCTouch* touch, CCEvent* event); virtual void ccTouchEnded(CCTouch* touch, CCEvent* event); CREATE_FUNC(HRocker);};#endif
HRocker.cpp文件
#include "HRocker.h"HRocker* HRocker::createHRocker(const char *rockerImageName, const char *rockerBGImageName, cocos2d::CCPoint position){ HRocker* layer = HRocker::create(); if(layer) { layer->rockerInit(rockerImageName, rockerBGImageName, position); return layer; } CC_SAFE_DELETE(layer); return NULL; }void HRocker::rockerInit(const char *rockerImageName, const char *rockerBGImageName, cocos2d::CCPoint position){ //添加摇杆背景图 CCSprite* spRockerBG = CCSprite::create(rockerBGImageName); spRockerBG->setVisible(false); spRockerBG->setPosition(position); addChild(spRockerBG, 0, tag_rockerBG); //添加摇杆上方那个可移动的图 CCSprite* spRocker = CCSprite::create(rockerImageName); spRocker->setVisible(false); spRocker->setPosition(position); addChild(spRocker, 1, tag_rocker); //摇杆背景图坐标 rockerBGPosition = position; //摇杆背景图半径 rockerBGR = spRockerBG->getContentSize().width*0.5;}//启动摇杆void HRocker::startRocker(bool _isStopOther){ //精灵设置可见,设置监听 CCSprite* rocker = (CCSprite*) getChildByTag(tag_rocker); rocker->setVisible(true); CCSprite* rockerBG = (CCSprite*) getChildByTag(tag_rockerBG); rockerBG->setVisible(true); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -1, _isStopOther);}//停止摇杆void HRocker::stopRocker(){ //精灵设置不可见,取消监听 CCSprite* rocker = (CCSprite*)getChildByTag(tag_rocker); rocker->setVisible(false); CCSprite* rockerBG = (CCSprite*)getChildByTag(tag_rockerBG); rockerBG->setVisible(false); CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);}//得到两坐标的角度值float HRocker::getRad(cocos2d::CCPoint pos1, cocos2d::CCPoint pos2){ //得到两点的坐标x,y坐标值 float px1 = pos1.x; float py1 = pos1.y; float px2 = pos2.x; float py2 = pos2.y; //求出两边长度 float x = px2 - px1; float y = py1 - py2; //开方 与 几次方 公式 float xie = sqrt(pow(x, 2) + pow(y , 2)); float cos = x/xie; //反余弦定理,知道两边长求角度:cos = 邻边/斜边 float rad = acos(cos); //当触屏Y坐标 <摇杆的Y坐标时,取反值 if(py1 > py2) { rad = -rad; } return rad; } //得到与角度对应的半径为r的圆上一坐标点CCPoint HRocker::getAnglePosition(float r, float angle){ return ccp(r*cos(angle), r*sin(angle));}bool HRocker::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){ CCSprite* sp = (CCSprite*)getChildByTag(tag_rocker); //得到触屏点坐标 CCPoint point = touch->getLocation(); //判断是否点击到sp这个精灵:boundingBox()精灵大小之内的所有坐标 if(sp->boundingBox().containsPoint(point)) { isCanMove = true; } return true;}void HRocker::ccTouchMoved(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){ if(!isCanMove) { return; } CCSprite* sp = (CCSprite*)getChildByTag(tag_rocker); CCPoint point = touch->getLocation(); //判断两个圆心的距离是否大于摇杆背景的半径 if(sqrt(pow(point.x - rockerBGPosition.x, 2) + pow(point.y - rockerBGPosition.y, 2)) >= rockerBGR) { //得到触点与摇杆背景圆心形成的角度 float angle = getRad(rockerBGPosition, point); //确保小圆运动范围在背景圆内 sp->setPosition(ccpAdd(getAnglePosition(rockerBGR, angle), ccp(rockerBGPosition.x, rockerBGPosition.y))); } else { //触点在背景圆内则跟随触点运动 sp->setPosition(point); } }void HRocker::ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){ if(!isCanMove) { return; } CCSprite* rocker = (CCSprite*)getChildByTag(tag_rocker); CCSprite* rockerBG = (CCSprite*)getChildByTag(tag_rockerBG); rocker->stopAllActions(); rocker->runAction(CCMoveTo::create(0.08, rockerBG->getPosition())); isCanMove = false;}
示例项目代码:
HRocker* rocker = HRocker::createHRocker("rocker.png", "rockerBG.png", ccp(240, 160)); addChild(rocker); rocker->startRocker(true);
- cocos2d-x游戏摇杆的实现方法
- cocos2d-x游戏摇杆开发
- cocos2d-x下实现摇杆
- cocos2d-x 街机摇杆 实现
- 小小菜之Cocos2d-x游戏开发旅程——Lua之摇杆实现
- Cocos2d-X 摇杆的使用(Joystick)
- Unity3D中关于游戏摇杆的实现方法
- cocos2d-x摇杆JoyStick
- cocos2d-x游戏实例(13)-简易摇杆控制主角
- cocos2d-x-3.3-018-游戏摇杆joystick源码分享
- cocos2d-x游戏实例(13)-简易摇杆控制主角
- Cocos2d-js3.3 虚拟摇杆的实现
- Cocos2d-js3.3虚拟摇杆的实现
- quick Cocos2d-x lua 八方向摇杆代码实现
- cocos2d-x游戏技能CD的实现
- 【iOS-cocos2d-X 游戏开发之十二】自定义Cocos2dx摇杆(增强Joystick),增加摇杆跟随用户触点作为摇杆坐标,让摇杆不再死板!
- cocos2d-x模拟摇杆
- cocos2d-x的初步学习十二之虚拟摇杆Joystick
- 错排计数
- POj1003解题tip
- usb host
- 马拉松冠军的项目管理之道
- Java学习笔记(2013年03月23日)
- cocos2d-x游戏摇杆的实现方法
- cocos2d-x Touch事件处理机制
- 关于相等测试与继承+Hashcode+toString ,求指导!
- 百度之星2013年3月23号第一题
- C#实现WEB服务器
- 染色问题(n个格子,3种颜色)
- 百度之星2013年3月23号第二题
- 支持电子流的动态表单
- 数据结构练习--单向链表的实现