0

我尝试按照 cocos2d-x 2.2 测试文件:cocos2d-x-2.2\samples\Cpp\TestCpp\Classes\SchedulerTest\SchedulerTest.h

我实现了滑块控件,我看到了它和:

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);

当我尝试滑动时,功能被触发,但它根本不滑动这就是我所拥有的:默认关闭菜单正在工作查找:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback));

    pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
                                origin.y + pCloseItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu, 1);





    bSliderCtlTouched = false;
    this->setTouchEnabled(true);


    this->schedule(schedule_selector(HelloWorld::tick));  

    return true;
}


void HelloWorld::tick(float  dt)
{

    ;


}

void HelloWorld::onEnter()
{
    CCLayer::onEnter();
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    m_pSliderCtl = sliderCtl();
    m_pSliderCtl->retain();
    m_pSliderCtl->setPosition(ccp(s.width / 2.0f, s.height - (m_pSliderCtl->getContentSize().height*2)));

    this->addChild(m_pSliderCtl,1);
}

CCControlSlider* HelloWorld::sliderCtl()
{
    CCControlSlider * slider = CCControlSlider::create("extensions/sliderTrack2.png","extensions/sliderProgress2.png" ,"extensions/sliderThumb.png");

    slider->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::sliderAction), CCControlEventValueChanged);

    slider->setMinimumValue(-3.0f);
    slider->setMaximumValue(3.0f);
    slider->setValue(1.0f);

    return slider;
}


void HelloWorld::sliderAction(CCObject* pSender, CCControlEvent controlEvent)
{
    bSliderCtlTouched =true;
    CCControlSlider* pSliderCtl = (CCControlSlider*)pSender;
    float scale;
    scale = pSliderCtl->getValue();


}



void HelloWorld::registerWithTouchDispatcher()
{
    // higher priority than dragging
    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getTouchDispatcher()->addTargetedDelegate(this,0, true);
}


bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
    if(bSliderCtlTouched)
        CCLOGWARN("bSliderCtlTouched is true");

    CCPoint touchLocation = touch->getLocation();    

    CCPoint location  = convertToNodeSpace( touchLocation );
    CCSize screenSize = CCDirector::sharedDirector()->getWinSize();
    float screenSizeW = screenSize.width;
    //CCLOGWARN("pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, location .x, location .y);
    b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

    float halfScreen = screenSize.width/2;
    if(location.x <= halfScreen)
    {
        left = true;
        right = false;
    }
    else
    {
        left = false;
        right = true;
    }

#ifdef MOUSEJOINT
    return isNodeTouched(locationWorld); 
#else
    return true;
#endif
}


void HelloWorld::ccTouchMoved(CCTouch* touch, CCEvent* event)
{

    if (!bSliderCtlTouched) 
    {
        return;
    }

    CCPoint touchLocation = touch->getLocation();    
    CCPoint location = convertToNodeSpace( touchLocation );
    b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);


}

void HelloWorld::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
    if(bSliderCtlTouched)
    {
        bSliderCtlTouched = false;
    }
    CCPoint touchLocation = touch->getLocation();    
    CCPoint nodePosition = convertToNodeSpace( touchLocation );

}
4

1 回答 1

2

至于你的问题7个月左右没有回答,我会为新版本的cocos2d-x回答你的问题。此代码适用于 cocos2d-x 3.0:

cocos2d::extension::ControlSlider* slider = cocos2d::extension::ControlSlider::create(
    "images/buttons/container.png", "images/buttons/progress.png", "images/buttons/knob.png");
slider->setPosition(200, 200);
slider->setMinimumValue(0);
slider->setMaximumValue(10);
slider->setValue(3);
slider->addTargetWithActionForControlEvents(this, cccontrol_selector(IntroView::valueChangedCallback), cocos2d::extension::Control::EventType::VALUE_CHANGED);
addChild(slider);


void IntroView::valueChangedCallback(Ref* sender, cocos2d::extension::Control::EventType evnt)
{
    float value = static_cast<cocos2d::extension::ControlSlider*>(sender)->getValue();
    CCLOG(std::to_string(value).c_str());
}

不要忘记#include "GUI/CCControlExtension/CCControlExtensions.h"libExtensions在您的项目中使用。

于 2014-05-24T01:27:36.220 回答