Я разрабатываю автомобильную 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, но я не могу найти, как добавить это к моей проблеме.
Мне не нужно обрабатывать прикосновения к экрану, мне нужно обрабатывать КАЖДОЕ нажатие кнопки.
Благодарю.
Итак, после нескольких часов исследований и попыток, а также получения помощи от форумов 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
,
Надеюсь, это поможет кому-то.