2015-02-17 3 views
0

Я разрабатываю двумерную автомобильную игру с использованием Cocos2d-x, и у меня есть проблема. Я хочу использовать Box2D, чтобы упростить коллизии и управление движением, но до этого я хочу, чтобы мои 4 кнопки работали. Дело в том, что у меня есть что-то вроде этогоEventListener для кнопок

RaceScene.cpp

bool Race::init() { 
    //... 
    auto forwardArrow = MenuItemImage::create("forward_arrow.png", "forward_arrow.png", CC_CALLBACK_1(Race::forward, this)); 
    forwardArrow->setAnchorPoint(Vec2(0,0)); 

    forwardArrow->setPosition(Vec2(origin.x + visibleSize.width - forwardArrow->getContentSize().width*1.2 , 
          origin.y + forwardArrow->getContentSize().height)); 
    //... 
} 

void Race::forward(Ref* pSender) 
{ 
    /*MessageBox("YOU PRESSED THE FORWARD BUTTON","Alert");*/ 
} 

Но я заметил, что это не так, потому что я не могу ни пресса более 1 кнопки в то время, или изменить скорость в зависимости от времени нажатия кнопки.

Итак, я просмотрел документацию Cocos и проверял документацию по Cocos, и все говорят об этом EventListeners, но я не могу найти, как добавить его к моей проблеме.

Мне не нужно обращаться с экранами экрана, мне нужно обращаться с каждым нажатием кнопки.

Спасибо.

+0

Для виртуального dpad вы не можете использовать встроенную систему меню. Если у cocos2d-x есть CCButton, такой как cocos2d-swift, вы должны его использовать, иначе просто используйте события касания, проверьте, на какой кнопке прикосновение (если есть) и действуют соответственно. – LearnCocos2D

+0

У меня есть 4 разных MenuItemImage, по одному для каждой кнопки. Дело в том, как я могу отличить, когда касание было на одной или другой кнопке? Я не знаю, как вызвать правильную функцию из EventListener. – jjimenezg93

+0

Как я уже сказал, MenuItem * не будет работать на то, что вы пытаетесь выполнить. Регулярные события касания - это то, что вам нужно. – LearnCocos2D

ответ

0

Итак, после нескольких часов исследований и попыток, а также получения помощи от форумов Cocos2d-x, я получил решение.


RaceScene.cpp

bool Race::init() { 
    ... 
    forwardArrow = Sprite::create("forward_arrow.png"); 
    forwardArrow->setAnchorPoint(Vec2(0,0)); 

    forwardArrow->setPosition(Vec2(origin.x + visibleSize.width - forwardArrow->getContentSize().width*1.2 , 
          origin.y + forwardArrow->getContentSize().height)); 
    this->addChild(forwardArrow); 

    ... 

    auto listenerForwardButton = EventListenerTouchOneByOne::create(); 
    listenerForwardButton->setEnabled(true); 
    listenerForwardButton->setSwallowTouches(true); 

    listenerForwardButton->onTouchBegan = CC_CALLBACK_2(Race::onTouchesForwardBegan, this); 
    // trigger when you let up 
    listenerForwardButton->onTouchEnded = CC_CALLBACK_2(Race::onTouchesForwardEnded, this); 

    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, forwardArrow); 
} 

bool Race::onTouchesForwardBegan(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 
    Vec2 touchPoint = touch->getLocation(); 
    Rect boundingBoxArrow = this->forwardArrow->getBoundingBox(); 

    if (boundingBoxArrow.containsPoint(touchPoint)){ 
     return true; 
    } 
    return false; 
} 

void Race::onTouchesForwardEnded(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 
    cocos2d::log("You touched %f, %f", touch->getLocationInView().x, touch->getLocationInView().y); 
    MessageBox("YOU PRESSED THE FORWARD BUTTON","Alert"); 
    auto forward = MoveBy::create(1,Vec2(-5,0)); 
    mainSprite->runAction(forward); 
} 

RaceScene.h

class Race : public cocos2d::Layer { 
    public: 
     virtual bool init(); 
     cocos2d::Sprite* forwardArrow; 
     ... 
    private: 
     bool onTouchesForwardBegan(cocos2d::Touch* touch, cocos2d::Event* event); 
     void onTouchesForwardEnded(cocos2d::Touch* touch, cocos2d::Event* event); 
     ... 
}; 

Пожалуйста, обратите внимание, что вам нужно listener->onTouchBegan который CC_CALLBACK_X перенаправляет на bool функция. Когда этот возвращает true, тогда работает функция onTouchEnd, это не происходит, когда этот возвращает false.

Надеюсь, это поможет кому-то.

Смежные вопросы