Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要(2)
来源:未知 责任编辑:责任编辑 发表时间:2015-09-09 15:29 点击:次
再建其相应的实现HRocker.cpp,这里要注意要把.cpp和.h都放到项目的class文件夹下,要不会提示找不到文件。代码如下:
#include "HRocker.h" const double PI=3.1415; HRocker::HRocker(void) { rocketRun=false; } HRocker::~HRocker(void) { } //创建摇杆(摇杆的操作题图片资源名,摇杆背景图片资源名,起始坐标) HRocker* HRocker::createHRocker(const char *rockerImageName,const char *rockerBGImageName,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,CCPoint position) { CCSprite *spRockerBG = CCSprite::create(rockerBGImageName); spRockerBG->setPosition(position); spRockerBG->setVisible(false); addChild(spRockerBG,0,tag_rockerBG); CCSprite *spRocker = CCSprite::create(rockerImageName); spRocker->setPosition(position); spRocker->setVisible(false); addChild(spRocker,1,tag_rocker); rockerBGPosition = position; rockerBGR = spRockerBG->getContentSize().width*0.5;// rocketDirection=-1;//表示摇杆方向不变 } //启动摇杆(显示摇杆、监听摇杆触屏事件) void HRocker::startRocker(bool _isStopOther) { CCSprite *rocker = (CCSprite*)this->getChildByTag(tag_rocker); rocker->setVisible(true); CCSprite *rockerBG = (CCSprite *)this->getChildByTag(tag_rockerBG); rockerBG->setVisible(true); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-1,_isStopOther); } //停止摇杆(隐藏摇杆,取消摇杆的触屏监听) void HRocker::stopRocker() { CCSprite *rocker = (CCSprite *)this->getChildByTag(tag_rocker); rocker->setVisible(false); CCSprite * rockerBG = (CCSprite *)this->getChildByTag(tag_rockerBG); rockerBG->setVisible(false); CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); } //获取当前摇杆与用户触屏点的角度 float HRocker::getRad(CCPoint pos1,CCPoint pos2) { float px1 = pos1.x; float py1 = pos1.y; float px2 = pos2.x; float py2 = pos2.y; //得到两点x的距离 float x = px2 - px1; //得到两点y的距离 float y = py1 - py2; //算出斜边长度 float xie = sqrt(pow(x,2) + pow(y,2)); //得到这个角度的余弦值(通过三角函数中的店里:角度余弦值=斜边/斜边) float cosAngle = x / xie; //通过反余弦定理获取到期角度的弧度 float rad = acos(cosAngle); //注意:当触屏的位置Y坐标<摇杆的Y坐标,我们要去反值-0~-180 if (py2 < py1) { rad = -rad; } return rad; } CCPoint getAngelePosition(float r,float angle){ return ccp(r*cos(angle),r*sin(angle)); } //抬起事件 bool HRocker::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CCPoint point = pTouch->getLocation(); CCSprite *rocker = (CCSprite *)this->getChildByTag(tag_rocker); if (rocker->boundingBox().containsPoint(point)) { isCanMove = true; CCLOG("begin"); } return true; } //移动事件 void HRocker::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) { if (!isCanMove) { return; } CCPoint point = pTouch->getLocation(); CCSprite *rocker = (CCSprite *)this->getChildByTag(tag_rocker); //得到摇杆与触屏点所形成的角度 float angle = getRad(rockerBGPosition,point); //判断两个圆的圆心距是否大于摇杆背景的半径 if (sqrt(pow((rockerBGPosition.x - point.x),2) + pow((rockerBGPosition.y - point.y),2)) >= rockerBGR) { //保证内部小圆运动的长度限制 rocker->setPosition(ccpAdd(getAngelePosition(rockerBGR,angle),ccp(rockerBGPosition.x,rockerBGPosition.y))); // CCLOG("touch"); } else { //当没有超过,让摇杆跟随用户触屏点移动即可 rocker->setPosition(point); //CCLOG("touch"); } //判断方向 if(angle>=-PI/4&&angle
相关新闻>>
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2
- Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3
- Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走
- 结合cocos2d-x开发配置sublime text
- cocos2d-x开发: 如何从项目中分离出接口范例
- cocos2d-x在iOS/Android双平台上嵌入WebView
- Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走
- cocos2d-x开发: 一切应该从配置文件读取开始
- 使用python创建cocos2d-x项目
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>