EventListener для кнопок

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

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, и все говорят об этом EventListeners, но я не могу найти, как добавить это к моей проблеме.

Мне не нужно обрабатывать прикосновения к экрану, мне нужно обрабатывать КАЖДОЕ нажатие кнопки.

Благодарю.

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,

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

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector