确定是否触摸/轻击了对象

时间:2012-08-01 08:30:50

标签: ios touch cocos2d-x

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

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

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

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

非常感谢。

修改: 我是通过将气球放在一个数组中并检查触摸位置是否击中该阵列中的一个气球来实现的。现在,我正在尝试创建一个Balloon类并从那里处理它。感谢所有回答的人。

2 个答案:

答案 0 :(得分:2)

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

示例:

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

h file:

#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 to handle touch?

中引用我的代码

答案 1 :(得分: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);