Cocos2d開發系列(五)

2021-08-31 10:44:05 字數 4692 閱讀 1200

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

《learn iphone andipad cocos2d game delevopment》第6章(原文中部分無關緊要的內容沒有進行翻譯)。

一、 ccspritebatchnode

在螢幕上貼圖時,圖形硬體需要經過準備、渲染、清除等步驟。每次貼圖都會重複這個過程。如果圖形硬體能事先知道有一組擁有相同紋理的sprite需要渲染,則這個過程會被簡化。比如,一組sprite的準備和清除動作總共只需要執行一次。

下圖的例子使用了ccspritebacthnode。螢幕上同時有幾百顆子彈飛過。如果一次只渲染一顆,那麼幀率馬上降到85%。使用ccspritebatchnode,可以避免這種情況:

通常我們這樣建立乙個ccsprite:

ccsprite*sprite=[ccsprite spritewithfile:@」bullet.png」];

[selfaddchild:sprite];

而使用ccspritebatchnode則需要修改為:

ccspritebatchnode*batch=[ccspritebatchnode batchnodewithfile:@」bullet.png」];

[selfaddchild:batch];

for(inti=0;i<100;i++)

注意,ccspritebatchnode需要乙個檔名作為引數,哪怕它根本用不著這個(進行顯示)。可以把它看做是乙個layer,你可以用它來加入一些ccsprite節點。由於它使用了乙個檔案作為構造引數,所以在後面加入的ccsprite中必須使用相同的檔案作為構造引數,否則會導致如下錯誤:

當採用相同紋理的ccspite越多,則採用ccspritebatchnode的好處越明顯。

但這有乙個限制,所有的ccsprite節點都會位於同乙個z座標(深度)上。如果子彈是「擊穿」敵人並向後飛,你得使用兩個z軸不同的ccspritebatchnode。

另外乙個限制是,ccspritebatchnode和加入其中的ccsprite必須使用相同的貼圖。這一點在使用textureatlas時尤其顯得重要。乙個texture atlas可以畫多個不同的,並且這些使用同乙個ccspritebatchnode,以提高渲染速度。

z軸的問題可以通過指定ccspritebatchnode中單個ccsprite的z值來解決。如果你所有的都放到了乙個textureatlas(紋理集),則你完全可以只使用乙個ccspritebatchnode。

把ccspritebatchnode看成乙個簡單的cclayer,它只接受使用相同的ccsprite,這樣,你就知道怎麼用它了。

在下面**中,隱藏有乙個致命的陷阱:

-(id)init

return self;

} 由於-(id)init方法是預設的初始化方法,它會被其他初始化方法比如initwithfile呼叫。在-(id)init方法中呼叫了[super initwithfile…]方法,[super initwithfile…]會呼叫[super init], 該類覆蓋了-(id)init方法,於是又會呼叫-(id)init方法,無限迴圈。

解決辦法是修改方法名,比如修改為-(id)initwithshipimage。

這個教訓告訴我們,在預設初始化方法-(id)init中,除了[superinit]之外,永遠不要呼叫其他東西(其他的初始化方法)。如果你必須在初始化方法中呼叫[super initwith…]方法,你應當把方法名命名為initwith…。

二、示例**

1、ship類

#import

#import

"cocos2d.h"

@inte***ce

ship : ccsprite

+(id

) ship;

@end

#import

"ship.h"

#import

"bullet.h"

#import

"gamescene.h"

@inte***ce

ship (privatemethods)

-(id

) initwithshipimage;

@end

@implementation

ship

+(id) ship

-(id

) initwithshipimage

return

self; }

-(void

) dealloc

-(void

) update:(

cctime

)delta

@end

ship類很簡單,除了update方法。該方法呼叫了gamescene的shootbulletfromship方法外([gamescenesharegamescene]實際上只是獲取gamescene 的單例項)。

2、gamescene類

#import

#import

"cocos2d.h"

#import

"ship.h"

typedef

enum

gamescenenodetags;

@inte***ce

gamescene : cclayer

+(id

) scene;

+(gamescene

*) sharedgamescene;

-(void

) shootbulletfromship:(

ship

*)ship;

@property

(readonly

) ccspritebatchnode*bulletspritebatch;

@end

#import

"gamescene.h"

#import

"ship.h"

#import

"bullet.h"

@inte***ce

gamescene(privatemethods)

-(void

) countbullets:(

cctime

)delta;

@end

@implementation

gamescene

static

gamescene*instanceofgamescene;

+(gamescene

*) sharedgamescene

+(id

) scene

-(id

) init

[self

schedule

:@selector

(countbullets

:) interval:3

]; }

return

self; }

-(void

) dealloc

-(void

) countbullets:(

cctime

)delta

-(ccspritebatchnode

*) bulletspritebatch

-(void

) shootbulletfromship:(

ship

*)ship }

@end

現在你應該看到了,在init方法中使用ccspritebatchnode加入了400顆子彈(被設定為不可見了)。然後在接下來的shootbulletfromship方法(在ship的update方法中呼叫)中,依次呼叫每一顆子彈的shootbulletfromship方法。

3、bullet類

#import

#import

"cocos2d.h"

#import

"ship.h"

@inte***ce

bullet : ccsprite

@property

(readwrite

, nonatomic

) cgpoint velocity;

+(id) bullet;

-(void

) shootbulletfromship:(

ship

*)ship;

@end

#import

"bullet.h"

@inte***ce

bullet(privatemethods)

-(id

) initwithbulletimage;

@end

@implementation

bullet

@synthesize

velocity;

+(id) bullet

-(id

) initwithbulletimage

return

self; }

-(void

) dealloc

// re-uses the bullet

-(void

) shootbulletfromship:(

ship

*)ship

-(void

) update:(

cctime

)delta {

self

.position

=

Cocos2d開發系列 一

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

cocos2d實現語音 Cocos2d 聲音API

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

Cocos 2d開發文件

首先安裝python在安裝時有乙個直接新增到系統path的選項需要勾選,安裝完成在cmd中,輸入 python 出現如下圖代表成功。解壓cocos 2d壓縮包在如下路徑開啟cmd 輸入如下命令 python create project.py project game package game.10...