cocos2dx-3.4虚拟摇杆的实现

本文参考网址:http://blog.csdn.net/kuloveyouwei/article/details/9102623

本篇文章是在cocos2dx-2.x的基础上改编而来,基本没有什么大的改变,只是让技术小白少走一些弯路。好了。下面就直接上代码了。

首先把虚拟摇杆封装成一个类,就要建立一个.cpp文件和.文件,这个文件就命名为HRocker.h文件。

其中HRocker.h的文件如下:

#ifndef HRocker_H
#define HRocker_H
#include "cocos2d.h"

using namespace cocos2d;

class HRocker :public Layer {
public:
    //初始化 aPoint是摇杆中心 aRadius是摇杆半径 aJsSprite是摇杆控制点 aJsBg是摇杆背景
    static HRocker*  HRockerWithCenter(Vec2 point, float Radius, Sprite* aJsSprite, Sprite* aJsBg, bool _isFollowRole);
    //启动摇杆
    void Active();
    //解除摇杆
    void Inactive();
    Vec2 getDirection();

private:
    EventListenerTouchOneByOne* touchListener;
    HRocker * initWithCenter(Vec2 point, float aRadius, Sprite* aJsSprite, Sprite* aJsBg, bool _isFollowRole);
    Vec2 centerPoint;//摇杆中心
    Vec2 currentPoint;//摇杆当前位置
    bool active;//是否激活摇杆
    float radius;//摇杆半径
    Sprite *jsSprite;
    bool isFollowRole;//是否跟随用户点击
    float getVelocity();
    void  updatePos(float dt);
    virtual bool onTouchBegan(Touch *pTouch, Event *pEvent);
    virtual void onTouchMoved(Touch *pTouch, Event *pEvent);
    virtual void onTouchEnded(Touch *pTouch, Event *pEvent);

    CREATE_FUNC(HRocker);
};

#endif



其下是HRockre.cpp中的内容

#include "HRocker.h"

using namespace cocos2d;

//定义一个计时器,随时检测鼠标点击的位置
void HRocker::updatePos(float dt){
    jsSprite->setPosition(ccpAdd(jsSprite->getPosition(), ccpMult(ccpSub(currentPoint, jsSprite->getPosition()), 0.5)));
}
//启动摇杆
void HRocker::Active()
{
    if (!active) {
        active = true;
        schedule(schedule_selector(HRocker::updatePos));//添加刷新函数
        //CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
        touchListener = EventListenerTouchOneByOne::create();
        touchListener->setSwallowTouches(true);

        touchListener->onTouchBegan = CC_CALLBACK_2(HRocker::onTouchBegan, this);
        touchListener->onTouchMoved = CC_CALLBACK_2(HRocker::onTouchMoved, this);
        touchListener->onTouchEnded = CC_CALLBACK_2(HRocker::onTouchEnded, this);
        // 注册事件监听机制
        _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
        
    }
    else {
    }
}
//解除摇杆
void   HRocker::Inactive()
{
    if (active) {
        active = false;
        this->unschedule(schedule_selector(HRocker::updatePos));//删除刷新
        _eventDispatcher->removeEventListener(touchListener);//删除委托
    }
    else {
    }
}
//摇杆方位
Vec2 HRocker::getDirection()
{

    return ccpNormalize(ccpSub(centerPoint, currentPoint));
}
//摇杆力度
float HRocker::getVelocity()
{
    return ccpDistance(centerPoint, currentPoint);
}
HRocker* HRocker::HRockerWithCenter(Vec2 point, float aRadius, Sprite* aJsSprite, Sprite* aJsBg, bool _isFollowRole){
    HRocker *jstick = HRocker::create();
    jstick->initWithCenter(point, aRadius, aJsSprite, aJsBg, _isFollowRole);
    return jstick;
}
bool HRocker::onTouchBegan(Touch* touch, Event* event)
{
    if (!active)
        return false;
    this->setVisible(true);
    Vec2 touchPoint = touch->getLocationInView();
    touchPoint = Director::sharedDirector()->convertToGL(touchPoint);
    if (!isFollowRole){
        if (ccpDistance(touchPoint, centerPoint) > radius){
            return false;
        }
    }
    currentPoint = touchPoint;
    if (isFollowRole){
        centerPoint = currentPoint;
        jsSprite->setPosition(currentPoint);
        this->getChildByTag(88)->setPosition(currentPoint);
    }
    return true;
}
void  HRocker::onTouchMoved(Touch* touch, Event* event)
{
    Vec2 touchPoint = touch->getLocationInView();
    touchPoint = Director::sharedDirector()->convertToGL(touchPoint);
    if (ccpDistance(touchPoint, centerPoint) > radius)
    {
        currentPoint = ccpAdd(centerPoint, ccpMult(ccpNormalize(ccpSub(touchPoint, centerPoint)), radius));
    }
    else {
        currentPoint = touchPoint;
    }
}
void  HRocker::onTouchEnded(Touch* touch, Event* event)
{
    currentPoint = centerPoint;
    if (isFollowRole){
        this->setVisible(false);
    }
}
HRocker* HRocker::initWithCenter(Vec2 aPoint, float aRadius, Sprite* aJsSprite, Sprite* aJsBg, bool _isFollowRole){
    isFollowRole = _isFollowRole;
    active = false;
    radius = aRadius;
    if (!_isFollowRole){
        centerPoint = aPoint;
    }
    else{
        centerPoint = ccp(0, 0);
    }
    currentPoint = centerPoint;
    jsSprite = aJsSprite;
    jsSprite->setPosition(centerPoint);
    aJsBg->setPosition(centerPoint);
    aJsBg->setTag(88);
    this->addChild(aJsBg);
    this->addChild(jsSprite);
    if (isFollowRole){
        this->setVisible(false);
    }
    this->Active();//激活摇杆
    return this;
}

好了,到这里一个虚拟摇杆的的类就完成了,接下来就是虚拟摇杆的精灵了

其中要看你把这个摇杆精灵放在哪个。cpp的文件当中了,我这个只是测试的例子,所以就放在

helloword.cpp文件当中。在init函数当中添加如下的代码就可以运行了。

其中要加上#include "HRocker.h"这个有文件

Sprite *spRocker2 = Sprite::create("rockerBar.png");//摇杆
    Sprite *spRockerBG2 = Sprite::create("rocker.png");//摇杆背景
    HRocker* rocker2 = HRocker::HRockerWithCenter(Vec2(210.0f, 130.0f), 50.0f, spRocker2, spRockerBG2, true);//创建摇杆
    this->addChild(rocker2);//摇杆添加到layer中

这就是我通过cocos2dx-2.x修改过来的了,


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值