cocos2dx3.0版自制摇杆(新增带示例)

最新修改的,带示例,如果有毛病大家尽管提
代码已经打包了,老版的摇杆,看了半天感觉好复杂,没弄明白,昨夜突然顿悟,想到了这么一个方法,可能还有些地方不完善,大家多提意见,具体的用法,直接在移动里面关联精灵,然后做判断,如果摇杆往右移动,则精灵也往右移动,大概就是这样了,今天分享出来,希望能对大家有用,下面是代码:7:

#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)

要是能用UI来做就更好了,就可以直接场景移动或者摄像机移动了。

请问可以给出GameScene吗。提示我createScene不是GameTouch的成员函数。。。