2016-01-25 21 views
1

在我的场景中,我有一个具有多个自定义小精灵的矢量。当我点击其中的一个时,我想要在场景中的另一个元素上触发一个动作,可以是向量中的另一个精灵或另一个节点。我一直在研究这样做的最佳方式,但我不太确定如何实现它。选项有:使用Cocos2d-x 3.x触摸Sprite上的事件?

  • 添加触摸监听到现场,并验证它是否被窃听精灵的范围内与rect. containsPoint(point)。在那之后,我必须得到被挖掘的精灵来做我想要的行动。对我来说,这样做似乎不是很干净。如果两个精灵重叠,我必须验证精灵是在后面还是在前面才能检索所需的精灵。我跟着这个例子:Touch Event example

  • 在精灵的子类(我的自定义精灵)中添加一个触摸侦听器。并在其中添加onTouchBeganonTouchEnded。但这样,我不知道如何修改另一个精灵的属性或场景中的其他元素(是否有可能像Objective-C一样使用委托?)。我跟着这个例子:Subclass Sprite Example

我的主要问题是,我不很了解如何使一个节点,在场景中的其他节点进行交互。我看过很多教程,但在所有这些教程中,当您与节点交互时,它只会更改其属性,而不会改变其他节点的属性。

在此先感谢。

+0

您可以发布代码的完整小例子? – Raptor

+0

@Raptor更新了我的问题。我使用与提供的链接相同的代码。 –

回答

0

setTagsetName设置您的元素标签或名称。然后,如果元素x被触摸,让他们与getChildByTaggetChildByName并做你需要做的。

1

我须提出“EventCustom”的方式:)

您可以在touchBegan/touchEnded方法增加(无论你把它们...你得到了点。 ..)传递一个EventCusto到_eventDispatcher额外的代码,并把它向全世界宣布;)

EventCustom *e = new EventCustom("MyAwesomeEvent"); 
e->setUserData(ptrMyFantasticData); //This function takes a void pointer. cheers :) 
_eventDispatcher->dispatchEvent(e); 

您可以继承的EventCustom类,但就是没有什么必要。您可以随时用setUserData()挂起一个对象。

现在,这就需要对事件作出反应的对象可以的OnExit通过

_myCustomListener = EventListenerCustom::create(
       "MyAwesomeEvent", 
       CC_CALLBACK_1(
        ListeningClass::onMyAwesomeEvent, 
        this 
       ) 
      ); 
_eventDispatcher->addEventListenerWithXXXXXPriority(_myCustomListener, XXX); 
//ScreenGraphPriority/FixedPriority depends on situation. Either should work. 

它总是一个很好的做法听它删除你的听众,当你去了,所以某个地方,也许是(),其中卸下触摸听众删除此监听器也一样,

_eventDispatcher->removeEventListener(_myCustomListener); 

去了一下滑出了赛道,澄清: CC_CALLBACK_X是有点棘手的名字。 X表示否。的目标函数将得到的参数。这里,事件调度器将通过1个参数,即你把它交给了EventCustom的对象,所以我们使用CC_CALLBACK_1。下一个参数 - 这里是“this” - 是该方法将被调用的对象。 简而言之,我们可以说这个回调会导致函数调用this->onMyAwesomeEvent(e);

对于CC_CALLBACK_2向前,我们可以指定其他参数,第3个参数。

手头再回到这个问题,ListeningClass :: onMyAwesomeEvent看起来像

void ListeningClass::onMyAwesomeEvent(EventCustom *e) 
{ 
    MyFantasticData *d = (MyFantasticData *) e->getUserData(); 
    CCLOG("[ListeningClass::onMyAwesomeEvent] %d", d->getMyPreciousInt()); 
} 

希望它能帮助:)