Cocos2d 過渡篇(三) 觸控機制

2021-07-23 22:49:46 字數 3156 閱讀 4141

本來在中午休息時間打算大展拳腳,好好寫一篇新觸控機制相關的博文,結果,等真正下手的時候才發現無從下手,很多地方自己都說不清,趕緊看了下testcpp,才發現原來是這樣,還可以這樣,哦?這樣都行?哎,我還是太年輕了。

咱也只能挑簡單的講了。

假設要實現拖動乙個精靈移動,那我們的步驟是:

1、 建立乙個精靈sprite;

2、乙個觸控事件 listener ,設定listener的ontouchbegan,ontouchmoved,ontouchended;

3、將sprite 和 listener關聯起來。

實現如下:

1、 建立精靈:

point origin = director::getinstance()->getvisibleorigin();

size size = director::getinstance()->getvisiblesize();

auto sprite = sprite::create("images/cyansquare.png");

sprite->setposition(origin+point(size.width/2, size.height/2) + point(-80, 80));

addchild(sprite, 1);

2、 建立 listener

auto listener1 = eventlistenertouchonebyone::create();//建立乙個觸控監聽

listener1->setswallowtouches(true);//設定是否想下傳遞觸控

後可以直接在touchbegan後新增它的實現**,而不用特意去寫乙個touchbegan的函式

listener1->ontouchbegan = (touch* touch, event* event);

//拖動精靈移動

listener1->ontouchmoved = (touch* touch, event* event);

listener1->ontouchended = [=](touch* touch, event* event);

//將觸控監聽新增到eventdispacher中去

_eventdispatcher->addeventlistenerwithscenegraphpriority(listener1 ,sprite);

}

以上就是移動乙個精靈的實現過程,這裡特意交代一些細節:

1)觸控監聽listener的建立方式有兩種,一種是:eventlistenertouchonebyone,另一種是:eventlistenertouchallatonce,顧名思義,eventlistenertouchonebyone的意思單點觸控,eventlistenertouchallatonce,是多點觸控,而不需要再用設定delegate的方式來做了。3.0觸控機制還有個不同的地方,只要是放在最上面的那個精靈,那它的觸控優先順序就最高。我們用的按鈕menu 就是用這種方式設定觸控優先順序的。而

2)將listener1新增到事件排程中,這裡用的是:

_eventdispatcher->addeventlistenerwithscenegraphpriority(listener1 sprite);

我們進入addeventlistenerwithscenegraphpriority的定義中看一下,有下面這一行**:

listener->setfixedpriority(0);

它將精靈的觸控優先順序設定成0,從這裡我們可以引申出兩個問題,乙個就是當我們要給精靈設定觸控優先順序時,

listener->setfixedpriority(0);
,因為0已經被「官府」徵用了,另乙個問題就是:如果自己想設定精靈的觸控優先順序,那應該怎麼做呢?下面是提供的另外一種新增listener的方法:

_eventdispatcher->addeventlistenerwithfixedpriority(listener1 ,fixedpriority);

在第二個引數裡設定觸控優先順序,這樣就可以了。

_eventdispatcher->addeventlistenerwithscenegraphpriority(listener1, sprite1);

_eventdispatcher->addeventlistenerwithscenegraphpriority(listener1->clone(), sprite2);

_eventdispatcher->addeventlistenerwithscenegraphpriority(listener1->clone(), sprite3);

其中sprite2和sprite3都是轉殖了listener1的,進入clone()的定義,我們看到以下**:

eventlistenertouchonebyone* eventlistenertouchonebyone::clone()

else

return ret;

}

以上**主要的目的也就是實現轉殖touchbegan,touchmoved,touchended。

3、刪除觸控監聽

如果想移除sprite的觸控移動,可以這麼做:

_eventdispatcher->removeeventlisteners(eventlistener::type::touch_one_by_one);

這樣就ok了。

3.0新的地方講的也差不多了,簡單的就不多說了,難的我也不懂。所以呢,就這樣吧。接下來應該是寫一些關於3.0的例子吧。恩。

有人問:3.0bate版本 的 繼承layer的layercolor,想停止layercolor的觸控呼叫而使用settouchenabled,編譯器提示宣告被否決,腫麼辦?有神馬替代函式能夠停止觸控

答:將settouchenable(),換成setenable();試試

cocos2d 紋理載入機制

cocos2d 紋理載入機制 cocos2d主要的渲染目標是vao vbo 屬性 紋理 主要看看紋理載入的相關 texture2d texturecache addimage const std string path 注意 image new image bool bret image initw...

cocos2d實現語音 Cocos2d 聲音API

param url 聲音路徑 cc.audioengine.playmusic url loop 停止背景 param releasedata 是否釋放聲音資料,預設為false cc.audioengine.stopmusic releasedata 暫停背景 cc.audioengine.pau...

Cocos2D研究院之初識Cocos2d(二)

在正式介紹cocos2d之前,我先囉嗦一下本人對這套引擎的看法。我認為coos2d最大的作用就是降低開發成本 貌似所有引擎都是這樣 對於研發部門來說,最大的成本就是時間,所以節省時間是降低成本最有效的方式,cocos2d幾乎封裝了所有開發ios遊戲需要的底層 使剛剛接觸oc的開發者也能很快的製作出效...