[英]Touch Event on Sprite with Cocos2d-x 3.x?
在我的場景中,我有一個帶有多個自定義精靈的矢量。 當我點擊其中一個時,我希望在場景中的另一個元素上觸發一個動作,該動作可以是矢量中的另一個精靈,也可以是另一個節點。 我一直在研究實現此目的的最佳方法,但是我不確定如何實現它。 選項包括:
向場景中添加一個觸摸偵聽器,並使用rect. containsPoint(point)
驗證它是否在精靈的邊界內被點擊rect. containsPoint(point)
rect. containsPoint(point)
。 之后,我必須獲取被竊聽的精靈來執行我想要的動作。 對我來說,用這種方式做似乎不太干凈。 並且如果兩個子畫面重疊,則必須驗證該子畫面是在后面還是在前面,以便檢索所需的子畫面。 我遵循以下示例: 觸摸事件示例
在Sprite(我的自定義Sprite)的子類中添加一個觸摸偵聽器。 並在其中添加onTouchBegan
和onTouchEnded
。 但是這樣,我不知道如何修改場景中另一個精靈或另一個元素的屬性(是否可以像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());
}
希望能幫助到你 :)
使用setTag
和setName
設置元素標簽或名稱。 然后,如果觸摸了元素x,請使用getChildByTag
或getChildByName
使其獲取並執行所需的操作。
使用第二個選項,您將在上面列出。 要使一個節點與場景中的另一個節點進行交互,您可以向您的自定義精靈對象添加觸摸回調函數,如下所示: https : //github.com/Longpc/RTS/tree/master/Classes/base/dialogBase
在主場景中,您可以定義函數來處理此回調。 這樣您就可以將所有事情都整合到場景中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.