2016-01-25 54 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()); 
} 

希望它能幫助:)