最新修改的,带示例,如果有毛病大家尽管提
代码已经打包了,老版的摇杆,看了半天感觉好复杂,没弄明白,昨夜突然顿悟,想到了这么一个方法,可能还有些地方不完善,大家多提意见,具体的用法,直接在移动里面关联精灵,然后做判断,如果摇杆往右移动,则精灵也往右移动,大概就是这样了,今天分享出来,希望能对大家有用,下面是代码
#include "GameTouch.h"
static GameTouch * oe;//单例
GameTouch * GameTouch::one()
{
if (!oe) {
oe = new GameTouch();
oe->init();
if (oe&&oe->init()) {
oe->autorelease();
return oe;
}else{
delete oe;
oe = nullptr;
return oe;
}
}else{
return oe;
}
}
Scene * GameTouch::createScene()
{
auto scene = Scene::create();
auto la = GameTouch::one();
scene->addChild(la);
return scene;
}
bool GameTouch::init()
{
if (!GameScene::init()) {
return false;
}
auto sp = Sprite::create("dizuo.png");//底座的部分
this->addChild(sp);
sp->setPosition(size.width/2,size.height/2);
Point m = sp->getPosition();
auto sp1 = Sprite::create("CloseSelected.png");//摇杆上面的移动块
sp1->setPosition(m);//移动快的位置等于底座的中心
this->addChild(sp1);
auto sp3 = Sprite::create("yuanhuan.png");//建一个精灵随着摇杆方向做出动作
sp3->setPosition(900,100);
this->addChild(sp3);
log("%f,%f",m.x,m.y);
int r =((569-m.x) *(569-m.x))+((549-m.y)*(549-m.y));//底座的半径
auto listen = EventListenerTouchOneByOne::create();
listen->onTouchBegan = =](Touch * tou , Event * eve )->bool{
Point s = tou->getLocation();
if (sp->getBoundingBox().containsPoint(s)) {
log("%f %f",s.x,s.y);//检测底座的坐标
}
return true;
};
listen->onTouchMoved = =](Touch * t ,Event * ev){
Point w = t->getLocation();
int sr = ((w.x-m.x)*(w.x-m.x))+((w.y-m.y)*(w.y-m.y));//从底座中心点移动到xx的距离
if (srsetPosition(w);//如果移动的距离小于底座的半径则让移动快跟着移动点移动
int numX = w.x-m.x;//移动快移动到的点的横坐标减去原点的横坐标,用来判断摇杆的方向
int numY = w.y-m.y;//移动快移动到的点的纵坐标减去原点的纵坐标
log("========%d,=========%d",numX,numY);
if (numX>0&&numY==0) {//如果移动快的横坐标减去原点的横坐标等于正的,说明它在x轴的右边,Y轴也是
//因为x轴从左往右是从小到大,Y轴从低到高也是从小到大
auto mov = MoveBy::create(3, Point(0,400));//让精灵做竖向动画
sp3->runAction(mov);
}else if(numX<0&&numY==0){//如果原点和移动点相减是负的,说明移动点在原点的左边
auto ju = JumpBy::create(3, Point(0,0), 50, 1);//让精灵做跳的动画
sp3->runAction(ju);
}else if (numY>0&&numX==0) {
auto ro = RotateBy::create(3, 360);//让精灵做旋转运动
sp3->runAction(ro);
}else if (numY<0&&numX==0){
auto bink = Blink::create(3, 10);
sp3->runAction(bink);
}
}
};
listen->onTouchEnded = =](Touch * q ,Event * o){
sp1->setPosition(m);//如果松手的话,移动块回到原点
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listen, this);
return true;
}
```
最新修改版.zip (3 KB)