簡體   English   中英

使用Cocos2d-x 3.x在Sprite上觸摸事件?

[英]Touch Event on Sprite with Cocos2d-x 3.x?

在我的場景中,我有一個帶有多個自定義精靈的矢量。 當我點擊其中一個時,我希望在場景中的另一個元素上觸發一個動作,該動作可以是矢量中的另一個精靈,也可以是另一個節點。 我一直在研究實現此目的的最佳方法,但是我不確定如何實現它。 選項包括:

  • 向場景中添加一個觸摸偵聽器,並使用rect. containsPoint(point)驗證它是否在精靈的邊界內被點擊rect. containsPoint(point) rect. containsPoint(point) 之后,我必須獲取被竊聽的精靈來執行我想要的動作。 對我來說,用這種方式做似乎不太干凈。 並且如果兩個子畫面重疊,則必須驗證該子畫面是在后面還是在前面,以便檢索所需的子畫面。 我遵循以下示例: 觸摸事件示例

  • 在Sprite(我的自定義Sprite)的子類中添加一個觸摸偵聽器。 並在其中添加onTouchBeganonTouchEnded 但是這樣,我不知道如何修改場景中另一個精靈或另一個元素的屬性(是否可以像Objective-C一樣使用Delegates?)。 我遵循以下示例: 子類Sprite示例

我的主要問題是我不太了解如何使節點與場景中的另一個節點交互。 我看過很多教程,但是在所有教程中,當您與一個節點交互時,它只會更改其屬性,而不會更改其他節點的屬性。

提前致謝。

我將提出“ 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()將對象掛到該對象。

現在,需要對事件做出反應的對象可以通過以下方式收聽事件

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

離開時刪除監聽器始終是一個好習慣,因此在某個地方,也許在onExit()中,您在其中刪除了觸摸監聽器的地方也刪除了該監聽器,因為

_eventDispatcher->removeEventListener(_myCustomListener);

需要說明的是,CC_CALLBACK_X有點棘手。 X表示編號。 目標函數將獲得args。 在這里,事件分派器會將1 arg即ptr傳遞給您交給它的EventCustom對象,因此我們使用CC_CALLBACK_1。 下一個arg(在此為“ this”)是將在其上調用方法的對象。 簡而言之,我們可以說此回調將導致調用this->onMyAwesomeEvent(e);的函數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());
}

希望能幫助到你 :)

使用setTagsetName設置元素標簽或名稱。 然后,如果觸摸了元素x,請使用getChildByTaggetChildByName使其獲取並執行所需的操作。

使用第二個選項,您將在上面列出。 要使一個節點與場景中的另一個節點進行交互,您可以向您的自定義精靈對象添加觸摸回調函數,如下所示: https : //github.com/Longpc/RTS/tree/master/Classes/base/dialogBase

在主場景中,您可以定義函數來處理此回調。 這樣您就可以將所有事情都整合到場景中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM