c++ - cocos2d-x CCControlSlider 不滑动

标签 c++ cocos2d-x

我尝试遵循 cocose2d-x 2.2 测试文件: cocos2d-x-2.2\samples\Cpp\TestCpp\Classes\SchedulerTest\SchedulerTest.h

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

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

}

最佳答案

就你的问题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

关于c++ - cocos2d-x CCControlSlider 不滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964959/

相关文章:

c++ - 从段落中提取句子

c++ - 在 C++ 中读取带空格的输入

c++ - 错误 : The imported project "C:\Program Files (x86)\MSBuild\Microsoft\WindowsXaml\v11.0\Microsoft.Windows.UI.Xaml.Cpp.targets" was not found

c++ - OpenGL、C++ -> 如何在屏幕上布置对象?

c++ - 以纹理/纯色绘制透明孔

c++ - 值类型在map中的地址

c# - 无法启动程序,Windows Web 服务框架中出现无法识别的错误

android - NDK 构建失败 cocos2d-x

c++ - c++变量名中的北欧字符?

c++ - 代码无法使用 Android NDK 编译