【问题标题】:EventListener for buttons按钮的事件监听器
【发布时间】:2015-02-17 16:17:05
【问题描述】:

我正在使用 Cocos2d-x 开发 2D 汽车游戏,但遇到了问题。 我想使用 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 有一个像 cocos2d-swift 这样的 CCButton,你应该使用它,否则只使用触摸事件,检查触摸是哪个按钮(如果有的话)并采取相应的行动。
  • 我有 4 个不同的 MenuItemImage,每个按钮一个。关键是:我如何区分触摸是在一个按钮上还是另一个按钮上?我不知道如何从 EventListener 调用正确的函数。
  • 就像我说的,MenuItem* 不会真正适用于您尝试完成的任务。您需要定期的触摸事件。
  • 谢谢,但我已经知道了,我说过“我注意到这不是方法,因为我不能一次按下超过 1 个按钮,也不能根据时间改变速度按钮被按下。所以我用谷歌搜索并检查了 Cocos 文档,每个人都在谈论那个 EventListeners,但我不知道如何将它添加到我的问题中。无论如何,我在 Cocos 论坛的帮助下找到了解决方案。
  • 我正在开发一个类似的游戏。我正在做的是检查触摸位置并检查它是否与我作为精灵添加到屏幕上的按钮 rect 发生冲突。如果启用了多点触控,则屏幕必然会进行多点触控。

标签: c++ cocos2d-x box2d event-listener


【解决方案1】:

所以,经过几个小时的研究和尝试,以及从 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->onTouchBeganCC_CALLBACK_X 重定向到 bool 函数。当这个返回true时,onTouchEnd函数起作用,当这个返回false时不起作用。

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2014-08-04
    • 1970-01-01
    • 2014-04-11
    • 2012-10-10
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多