Cocos2d遊戲開發之(一)多觸點與觸屏事件詳解

2021-09-08 14:41:35 字數 3413 閱讀 5570

最近幾天一直在啃cocos2d,消化了不少東西,基本可以有些把握下手寫公司的遊戲了;那麼今天就把一些重點的拿出來分享下經驗,給新童鞋們作為參考;

這篇就來詳細介紹下cocos2d對使用者觸屏的監聽事件進行下分析(cocos2d有很多詳細的文章和教程,我這裡只是出於自己的理解來說)

進入正題:從整體cocos2d對觸屏的事件監聽可以分為兩種:

1.單一監聽,所謂單一監聽其實是跟cocos2d引擎框架有關,因為在cocos2d中每個遊戲介面都可以使用乙個cclayout完成,那麼當乙個cclayout在螢幕顯示出來後,想要監聽使用者的按鍵事件,一般都會使用以下形式來進行監聽:(注意:這裡是cclayout類進行監聽的方式)

首先開啟監聽:

oc** 

self.istouchenabled=yes; 

然後重寫監聽函式即可:

oc** 

//監聽首次觸發事件 

- (void)cctouchesbegan:(nsset *)touches withevent:(uievent *)event 

//觸控事件 - 當手指在螢幕上進行移動 

- (void)cctouchesmoved:(nsset *)touches withevent:(uievent *)event 

//觸控事件 - 當手指從螢幕抬起時呼叫的方法 

-(void) cctouchesended:(nsset *)touches withevent:(uievent *)event 

此種監聽狠eazy,但是要注意這裡是對cclayout類進行的監聽方式;

2.監聽分發; 剛才說了,遊戲的每個介面可能都是乙個cclayout,但是如果我想讓乙個ccsprite精靈主角單獨進行監聽,或者說在cclayout有很多個精靈我想單獨監聽其中的一種的時候,這時候就需要使用監聽分發的形式了;

假設我們自定義了乙個類xx繼承ccsprite,還有乙個yy類也繼承ccsprite,而且xx型別與yy類的例項都存在於乙個layout上,那麼我想對xx與yy型別分別單獨監聽的話;首先我們先讓當前繼承的ccsprite類的xx於yy類都使用 協議;

(ccsprite中沒有 self.istouchenabled=yes; 這個函式,別直接寫這個哦~)

**如下:

oc** 

@inte***ce xx : ccsprite  

然後在當前實現類中重寫乙個函式如下:

oc** 

-(void) registerwithtouchdispatcher 

(此函式是註冊監聽,如果裡面什麼都不寫,則當前不會相應任何觸屏事件;)

重寫觸控的各事件函式,如下:

oc** 

//監聽首次觸發事件 

- (bool)cctouchbegan:(uitouch *)touch withevent:(uievent *)event 

//監聽移動事件 

- (void)cctouchmoved:(uitouch *)touch withevent:(uievent *)event 

//監聽離開事件 

- (void)cctouchended:(uitouch *)touch withevent:(uievent *)event 

大家可以看到,此種監聽方式除了各種監聽函式與第一種類似之外,在 cctouchbegan的函式有個返回型別-布林值;那麼其作用下面詳細介紹;如果xx與yy類都實現了第二種監聽方式的話,那麼當使用者觸屏後,(當前使用者觸發的是xx與yy類例項所在的cclayout)首先會進入xx或者yy的其中的cctouchbegan函式中,這裡假設首先進入了xx類中,那麼xx類中的cctouchbegan將會被響應,如果return true;表示不再將使用者觸屏的訊息傳遞給yy類中進行響應,也就是說不再響應yy類中的cctouchbegan函式,那麼如果 return false;則會將當前觸屏資訊傳遞給其他註冊過的型別中;

一句話概括:return 的值,如果是真則表明使用者觸控事件已經被處理,其他不會再去進行監聽;如果為假,則會繼續交給其他註冊過的型別中進行處理;

那麼第二種監聽的方式比較常用,這樣便於處理,那麼至於註冊,一般都是放在 onenter函式中;onenter函式是每個ccscene之間切換會被響應的函式,相當於是ccscene的生命週期函式,具體呼叫順序如下:

oc** 

//使用[ccdirector replacescene:xx],替換場景時,會呼叫以下3個方法 

//呼叫順序依次為: 

的+(id)scene——> 

的init——> 

的onenter——> 

//4.執行過渡效果 

//5.當前scene的onexit函式——> 

的onentertransitiondidfinish() 

//7.當前scene的dealoc函式 

-(void) onenter 

-(void) onentertransitiondidfinish 

-(void)onexit 

那麼大概介紹了監聽事件後,那麼觸屏中最關心的就應該是多觸點啦;

oc** 

//-----獲取多點觸控 

nsset *alltouches = [event alltouches]; 

uitouch *touchone = [[alltouches allobjects]objectatindex:0]; 

uitouch *touchtwo = [[alltouches allobjects]objectatindex:1]; 

//...類推 

獲取多點狠簡單,那麼下面再將基本常用到的幾個判斷寫下:

1-判斷使用者單擊還是雙擊(針對乙個觸點)

oc** 

if([alltouches count]==1)  

} 1-判斷使用者兩個觸點之間是合攏還是分開(針對兩個觸點)

oc** 

if([alltouches count]==2) else 

} 這裡我就粗略的寫在一起,判定兩個觸點是否合攏其實就是使用者剛觸屏時記錄兩點之間的距離記做disfirst,然後在兩個觸點離開螢幕(或者移動事件中)的時候計算

當前的兩個觸點的距離disfinal,那麼最後根據disfirst與disfinal距離關係就能知道是合攏還是分開;

(cclog 是cocos2d封裝的列印方法,此種列印在編譯發布正式遊戲程式的時候是不會編譯到程式中的,但是nslog會一直存在!要注意!)

最後給出兩個函式,用於計算不同方式監聽的函式中獲取**換)座標的,因為cocos2d是opengl進行搭建的框架,所以需要座標轉換;

oc** 

+(cgpoint) locationfromtouches:(nsset*)touches 

+(cgpoint) locationfromtouch:(uitouch*)touch 

兩個方法一看就能看出區別,乙個是uitouch的,乙個是nsset,乙個是單一監聽,乙個是分發監聽;

Cocos2d開發系列 一

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!當前最新版本為1.0。本教程選用的是穩定版本0.99.5。install templates.sh檔案,這個就是cocos2d的安裝指令碼。你可以直接在終端裡執行這個指令碼進行安裝,但如果你的xcode沒有安裝在預設目錄 下,則你需要在命令中新增乙...

使用cocos2d開發iphone遊戲入門概念

簡介 cocos2d iphone是乙個開源框架,利用它可以非常容易的在iphone上開發2d遊戲。它提供了物理,精靈 sprites 時差卷軸 parallax scrolling 支援iphone touch和accelerator等很多功能。一點說明 這一系列文章,翻譯自cocos2d的wik...

使用cocos2d開發iphone遊戲入門概念

簡介 cocos2d iphone是乙個開源框架,利用它可以非常容易的在iphone上開發2d遊戲。它提供了物理,精靈 sprites 時差卷軸 parallax scrolling 支援iphone touch和accelerator等很多功能。一點說明 這一系列文章,翻譯自cocos2d的wik...