0

我刚刚开始在 Xcode 中使用 Cocos 2D-X。

我正在尝试制作一个气球爆破游戏,以学习 Cocos 2D-X 库。到目前为止,我能够展示精灵并让它们移动。至于触摸,我可以获得触摸坐标(并在控制台上打印出来)。

现在,我想做的是让气球(一个CCSprite对象)“弹出”(从图层中删除)。我正在四处寻找解决方案,其中之一是检查触摸位置是否在CCSprite矩形内。但是我发现的所有东西要么已经过时,要么是用 Objective C 编写的。

如何确定触摸位置是否在气球的矩形内?除了这个方法还有其他方法吗?

非常感谢。

编辑:我通过将气球放在一个数组中并检查触摸位置是否击中该数组中的一个气球来做到这一点。现在,我正在尝试制作一个 Balloon 类并从那里处理它。感谢所有回答的人。

4

2 回答 2

2

你很幸运,因为我有一个使用气球的游戏,下面是我的代码,你可以完成气球类,你可以像 CCSprite 一样使用它

例子:

Balloon* blueBalloon = Balloon::spriteWithFile("balloon_blue.png");
this->addChild(blueBalloon);

h 文件:

#include "cocos2d.h"
using namespace cocos2d;

class Balloon : public cocos2d::CCSprite, public CCTargetedTouchDelegate {
public:
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
}; 

cpp文件:

void Balloon::onEnter(){
    CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);
    CCSprite::onEnter();
}
void Balloon::onExit(){
    CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);
    CCSprite::onExit();
}

void Balloon::ccTouchMoved(CCTouch* touch, CCEvent* event){
    //do what you want
}
void Balloon::ccTouchEnded(CCTouch* touch, CCEvent* event){
    //do your job here
}

bool Balloon::ccTouchBegan(CCTouch* touch, CCEvent* event){
    CCPoint touchLocation = this->getParent()->convertTouchToNodeSpace(touch);
    if (CCRect::CCRectContainsPoint(this->boundingBox(), touchLocation)) {
        this->playBalloonSound();
        this->removeFromParentAndCleanup(true);
    }

    return true;
}

或者你可以参考我这篇文章cocos2d subclassing sprite 中的代码来处理触摸?

于 2012-08-01T23:02:08.547 回答
0

在 cocos2d-x 3.0 你可以试试这个:

auto listener = EventListenerTouchOneByOne::create();

listener->setSwallowTouches(true);

listener->onTouchBegan = [&](Touch* touch, Event* event){

    if (this->getBoundingBox().containsPoint(this->convertTouchToNodeSpace(touch))) {
        return true;
    }
    return false;

};

Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
于 2013-12-24T10:17:43.550 回答