You are on page 1of 31

Ct

li ca cocos2d

Chng ny s gii thiu cho chng ta nhng im quan trng cn phi nm khi s
dng engine cocos2d. Chng ta s s dng hu ht nhng class ny trong qu trnh
lm game, v vy hiu c cch chng lm vic s gip chng ta vit game tt hn.
Hng n mc tiu ny, chng ta s thy lm vic vi cocos2d d dng hn.

i km cng chng ny l mt project v d c tn Essentials cha y mi th
chng ta s tho lun y. Phn source code c cha y cc comments v vy
chng ta c th c li chng ging nh mt phn ph lc ca quyn sch.

Chng ta s bt u vi mt ci nhn mc cao hn ca engine cocos2d. Mi
game engine u c cch qun l v th hin cc i tng trong game mt cch
khc nhau. Hiu c nhng i tng c lp l g cch chng lin kt vi nhau
nh th no l cch tt nht bt u.

Lp CCScene

i khi cn c gi l h thng cc scene, mt s cc scene l mt h thng cy


ca tt c cc node hin ang hot ng.

Mt node l mt i tng c k tha t lp CCNode. Hu ht cc node nh
CCSprite v CCLabelTTF u c hin th trn mn hnh, tuy nhin c mt s khng
c hin th ra bao gm cc lp CCNode, CCScene v CCLayer. Nhng lp ny rt
quan trng v thng lm cho nhng ngi bt u hc cocos2d cm thy kh ln
xn.

Chng ta s ni v nhng lp v gii thch chng c s dng nh th no trong
nhng phn sau. By gi chng ta s ni v cc khi nim cp cao, v n cho
chng ta bit rng lp CCSprite th hin mt texture ln mn hnh, CCLabelTTF in
mt chui k t v CCNode, CCScene, CCLayer c s dng nhm cc node li
vi nhau.

Hnh 3-1 m t game shoot em up m chng ta s to trong phn u ca chng 6
v m t iu m khng gy ch ngay i vi ngi chi nhng li cc k quan
trng i vi nhng ngi lp trnh game.



Scene trong hnh 3-11 c to hon ton bi cc i tng CCSprite. t nht l
phn m chng ta c th thy. Cn phn m chng ta khng thy c l cch m
CCScene v CCLayer c s gom nhm v sp xp cc sprite vi nhau gm c :
Mt vi lp background, phi thuyn ca ngi chi, phi thuyn ca k th, cc vin
n v cc nt iu khin trong game. hiu r hn cch phn lp cc i tng
trong scene ny, chng ta xem hnh 3-2.

Trong hnh trn, chng ta thy c 3 layer gip chng ta x l vic v cc sprite theo
th t bng cch phn chia nhm cc i tng c lin quan vi nhau: layer
background, layer cc i tng trong game v layer cc phm iu khin. S dng
nhiu lp trong mt scene cng gip chng ta nu chng ta mun n i ton b cc
node trong mt layer no , di chuyn layer s di chuyn ton b cc node trong
n, hoc sp xp li cc layer cc node c v pha trc hoc pha sau cc
node ca mt layer khc. Thm ch chng ta c th xoay hoc thay i t l kch
thc ca mt layer, v cng s nh hng n ton b cc node cha trong layer
.

Game scene s dng cc layer cng ging nh chng ta s dng cc chng trnh
chnh sa nh nh Photoshop, Seashore hoc Gimp chnh hnh nh. Tuy nhin,
cc node trong mi layer khng phi lc no cng tnh v thay v duy tr cc i
tng ring l.

Mt i tng scene thc s ch cha cc layer, ging nh cc layer ch cha cc
node. Mi node c th x l logic, scene, layer, cc node ring l, sprite, label v hn
th na, da vo cch chng ta code.

Mi node u c th cha node khc, v mi node trong h thng cy ngoi tr i
tng scene u c mt i tng cha. Nu chng ta xo mt node khi s
scene hoc chng ta cha thm node vo, n s khng c s k tha trong ngn
ng lp trnh hng i tng. Hay ni cch khc, node cha khng phi lp super
ca node .

H thng cy cc node di y gi l s scene, v xuyn sut trong quyn sch
ny chng ta s thnh thong nhc n h thng cy cc node ny. i vi nhng
ngi lm quen vi lp trnh design pattern, chng ta s nhn ra cu trc cy nh
Composite design pattern. Hnh 3-3 s cho chng ta thy h thng cy cc node mt
cch n gin hn, n ging nh mt cu trc cy.


Lu rng cc scene/layer/node l khng bt buc s dng trong cocos2d, ngoi
tr vic lun lun c mt i tng thuc lp CCScene lm node gc. Chng ta cs
th s dng lp CCNode thay cho lp CCLayer to mt layer.

Trong thc t, cho n gin chng ta thng s dng lp CCNode hn l lp
CCLayer gom nhm cc objects; Trong hu ht trng hp, lp CCLayer cha cc
thuc tnh v phng thc khng cn thit v d nh n c th bt c cm ng
chm hoc cm ng gia tc. B qua nhng phn bt s kin input th lp CCLayer

cng ging nh lp CCNode. Tng t lp CCScene cng l mt lp tru tng c


dng lm mt node gc, ngoi ra n khng khc g lp CCNode.

Lu : To cc node trong cocos2d c lin quan n to cc node cha, cc
node con s k tha cc thuc tnh t node cha nh scale, rotation ngoi tr mu sc
v opacity (mc th hin v mt hnh nh ca mt i tng. Opacity nm trong
khong 0 > 255 tng ng vi alpha : 0 -> 1.0)/
V d , nu node cha ca mt CCLabelTTF l mt node khng th hin hnh nh nh
CCNode, CCScene hoc CCLayer v bn thn chng cng l nhng nhng node con
ca nhng node khng th hin hnh nh, lc gc to ca label s nm gc
di bn tri. Nhng nu chng ta to ra mt CCLabelTTF khc l con ca label va
ri th gc to ca label ny s l gc di bn tri ca label cha.

Di y l mt v d :

Lp CCNode

C th bn s thc mc nhng class no k th t lp CCNode. Hnh 3-5 cho chng ta


thy s lp CCNode. Nhng lp m chng ta thng hay s dng nht s c mu
xm.


Lp CCNode l lp c s ca tt c cc node. N l mt lp tru tng khng cha
bt k mt hm th hin no v nh ngha tt c cc thuc tnh v phng thc
chung nht cho tt c cc node.

Lp Ccnode cha tt c cc methods qun l (thm, xo, ly i tng) cc node


con. Di y l mt s v d :

Khi to mt node :

CCNode *childNode = [CCNode node];

Thm mt node mi vi tag :
[myNode addchild:childNode z:0 tag:123];

Ly mt node :
[myNode addchild:childNode z:0 tag:123];

Xo mt node bng tag; cleanup s dng ton b cc action ang chy :
[mynode removeChildByTag:123 cleanup:YES];

Xo mt node thng qua con tr ca n :
[myNode removeChild:retrievedNode];


Xo tt c cc node t node cha :
[myNode removeAllChildrenWithCleanup:YES];

Xo mt node khi node cha :
[mynode removeFromParentAndCleanup:YES];


Thuc tnh z hm addChild xc nh th t s v trn mt node. Mt node c z
cng nh s c v trc, node c z ln nht s c v sau cng. Nu c nhiu
node c cng mt gi tr ca z nh nhau, th chng s c v theo th t m chng
ta thm vo node. Khi game chng ta s dng nhiu sprite v c phn chia thnh
nhiu layer khc nhau th vic s dng z l rt quan trng.

Thuc tnh tag cho php chng ta nh ngha mt node cho thun tin trong vic
s dng sau ny.

Lu : Nu mt vi node c gi tr tag ging nhau, hm getChildTag s tr v node
u tin vi gi tr tag . Cc node cn li s khng th ly v c. V vy chng ta
nn to mi node c mt gi tr tag duy nht.

Lu rng mt action cng c thuc tnh tag. Cc tag ca Node v Action khng nh
hng n nhau, v vy mt node v mt action c th c cng mt gi tr tag.


ACTIONS

Mt node c th khi chy cc actions. phn ny chng ta ch bn v cc action di


chuyn, xoay v thay i kch thc cc node v mt s th khc :

Hm khi to mt node :
CCAction *action = [CCBlink actionWithDuration:10 blinks:20];
action.tag = 234;


Bt u thc hin action :
[myNode runAction:action];

Ly con tr ca action va c to :
CCAction *retrievedAction = [myNode getActionByTag:234];

Dng action bng tag :
[myNode stopActionByTag:234];

Dng action bng con tr :
[mynode stopAction:action];


Dng tt c cc action ca mt node :
[mynode stopAllActions];



SCHEDULED
Cc node c th schedule cc message, hay objective-C gi l thc thi cc hm. Trong
nhiu trng hp, chugns ta mun mt phng thc update c chy trn mt
node thc thi mt vic g , v d nh kim tra va chm. Cch n gin nht l
schedule mt phng thc method c th c gi mi frame mt ln :

-(void) scheduleUpdateMethod
{
[self scheduleUpdate];
}

-(void) update:(ccTime)dt
{
// Hm ny c gi ti a 60 ln trn giy (60FPS)
}

Lu rng hm update lun lun c khai bo c dng nh trn (bin ccTime c
th thay i c). Delta time (dt) l khong thi gian gia 2 ln hm update c

gi. Nu chng ta mun gi hm update khong ln mt giy hay 100ms chng ta c


th s dng hm sau :
-(void) scheduleUpdateMethod
{
[self schedule:@selector(updateTenTimesPerSecond:) interval:0.1f];
}

-(void) updateTenTimesPerSecond:(ccTime)delta
{
// Hm ny c gi 10 ln/s hay 100ms 1 ln.
}

Lu rng nu interval chng ta truyn vo bng 0 th chng ta nn s dng hm
scheduleUpdate. Tuy nhin s dng on code va ri cng c 1 li th l chng ta
c th dng vic gi mt hm update c th li bng cch unschedule selector .

Lu : C php @selector() l mt cch ch r mt hm bng cch truyn vo
tn ca hm . Nu chng ta c th thy cui tn hm c du :, c ngha l
hm ny s c 1 i s truyn vo. Nu chng ta khng truyn vo du : lc bin
dch vn bnh thng, nhng khi on code ny c thc thi th chng trnh s b
crash v bo li urecognized selector sent to instance
S lng du : pha sau tn hm lun lun bng vi s i s c truyn vo hm
. V d ta c hm sau :
-(void) example:(ccTime)delta sender:(id)sender flag:(bool)abool



lc @selector s c vit nh sau :
@selector(example:sender:flag:)


Nu tn hm bn truyn vo @selector khng ng, lc compile cng s khng ra
li. Ch khi no on code c thc thi th chng trnh s b crash. Tuy nhin
chng ta tu chnh cho compiler cnh bo iu ny bng cch enable thuc tnh
Undeclared Selector trong phn build settings nh hnh di y :


c th dng ton selector ca mt node ta dng hm sau :

[self unscheduleAllSelectors];

Hc chng ta c th dng mt selector c th :
[self unschedule:@selector(updateTenTimesPerSecond:)];



scheduling v unscheduling mt cch d dng hn, chng ta khng nht thit
phi unscheduling bng cch truyn vo @selector vi tn hm v cc i s tng
ng. Chng ta c th lm nh sau :
-(void) scheduleUpdates
{
[self schedule:@selector(tenMinutesElapsed:) interval:600];
}


-(void) tenMinutesElapsed:(ccTime)delta
{
// dng vic gi selector hin ti bng t kho _cmd
[self unschedule:_cmd];
}

T kho _cmd c th s dng trong tt c phng thc ca Objective-C. N l
selector ca phng thc hin ti. V d khi t t kho _cmd trong hm
tenMinutesElapsed th _cmd s tng ng vi selector ca hm ny.

Cui cng chng ta s bn n vic update theo mc u tin. Chng ta xem xt
on code sau :
// in node A
-(void) scheduleUpdates
{

[self scheduleUpdate];
}



// in node B
-(void) scheduleUpdates
{

[self scheduleUpdateWithPriority:1];
}

// in node C
-(void) scheduleUpdates
{

[self scheduleUpdateWithPriority:-1];
}

y tt c cc node u gi hm update. Tuy nhin hm update node C s thc
hin trc, tip n l node A v cui cng l node B. i vi hm scheduleUpdate

th mc nh mc u tin l 0. S u tin cng nh th mc u tin cng cao.


Trong
thc
t
chng
ta
t
khi
s
dng
hm
ny.

Director

Lp CCDirector, hoc gi tt l Director l phn quan trng nht ca engine cocos2d.


Nu chng ta xem li proj HelloWorld chng 2 chng ta s thy rt nhiu hm
khi to cocos2d c lin quan n Director.
Lp director l mt lp singleton, ngha l ch c duy nht mt th hin ca lp ny
mi thi im, v n c th c truy xut ton cc bng cch gi hm
sharedDirector.
Lp CCDirector cha cc thit lp ton cc cho cocos2d v qun l cc scenes trong
cocos2d. Mt s chc nng ca lp CCDirector :
- Truy xut vo scene hin ti trn mn hnh
- Running, replacing, pushing v popping mt scene
- Truy xut vo cc thit lp ca cocos2d
- Truy xut vo OpenGL view v window trong cocos2d
- H tr pause, resume v ending game
- Chuyn i h to UIKit sang OpenGL v ngc li
- Xc nh cch m trng thi game c update

C 4 loi Director, mi loi s c nh hng khc nhau n vic update game. iu
ny s nh hng ln n hiu xut v tnh tng thch vi UIKit views. Chng ta c
th thy nhng dng trong classs delegate nh sau :
// Try CADisplayLink director first.
// If CADisplayLink is not available (iOS < 3.1) fall back to NSTimer director.
If (![CCDirector setDirectorType:kCCDirectorTypeDisplayLink])
[CCDirector setDirectorType:kCCDirectorTypeDefault];


Chng ta c th thit lp 4 loi director :
- kCCDirectorTypeDisplayLink (nhanh nht, yu cu iOS 3.1 tr ln)
- kCCDirectorTypeNSTimer (chm nht)
- kCCDirectorTypeThreadMainLoop (nhanh nhng c vn vi UIKit views)
- kCCDirectorTypeMainLoop (nhanh nhng c vn vi UIKit views)

Loi Director thng c s dng nht l kCCDirectorTypeDisplayLink, chng s
dng lp CADisplayLink ca Apple. Lp CADisplayLink m bo rng vic update
mn hnh c ng b vi vic refresh mn hnh, n s lm cc tc v trt c
mn hn v kt hp tt vi UIKit views.

Hin nay hu ht cc device u c iOS 4.x tr ln v vy chng ta khng cn quan
tm qu nhiu v vn chn loi Director no ph hp cho project ca chng ta.

CCScene

Mt i tng scene lun l i tng u tin trong s scene. Trong cocos2d,


mt scene l mt i tng tru tng, v lp CCScene cha cc hm o ging nh

lp CCNode. Nhng CCDirector yu cna mt lp k tha t lp CCScene c th


thay i mt scene ang c running bng hm CCDirector runWithScene,
replaceScene v pushScene. Chng ta c th to mt i tng CCScene k tha t
lp CCSceneTransition to hiu ng chuyn ng gia scene ang chy v scene
mi.
Thng thng cc i tng con ca mt CCScene v cc lp c k tha t
CCLayer. Cc i tng scene trong hu ht cc trng hp khng cha bt c on
code game no v thng him khi phn chia class, n thng khi to mt phng
thc tnh (static metho) +(id) scene bn trong i tng CCLayer :

+(id) scene
{

CCScene *scene = [CCScene node];

CCLayer *layer = [HelloWorld node];

[scene addChild:layer];


return scene;
}



Ni u tin chng ta khi to mt scene l cui hm
applicationDidFinishLaunching trong app delegate. Chng ta dng Director bt
u scene ny vi hm runWithScene :

// only use this to run the very first scene
[[CCDirector sharedDirector] runWithScene:[HelloWorld scene]];



i vi cc scene cn li chng ta s dng hm replace thay th scene mi cho
scene hin ti :

// use replace scene to change all subsequen scenes
[[CCDirector sharedDirector] replaceScene:[HelloWorld scene]];



Chng ta c th s dng hiu ng khi chuyn i gia cac scene nh sau :
CCScene *scene = [HelloWorld scene];
CCSeneTransition *tran = [CCTransitionShrinkGrow transitionWithDuration:2
scene:scene];
[[CCDirector sharedDirector] replaceScene:tran];

Nu chng ta thc thi on code trn trong class HelloWorld, n s khi to mt i
tng HelloWorld mi v thay th i tng c, chng ta c th s dng chng
reload li game. Tuy nhin nu chng ta truyn vo i tng l self th game chng
ta s b ng.

SCENES v MEMORY

Khi chng ta thay th mt scene bng mt scene khc, scene mi s c load vo


b nh ram trc khi scene c c gii phng. Chuyn i gia cc scene rt d
dn n cc cnh bo v memory hoc crash lin quan n vic khng b nh
ram. Chng ta nn thng xuyn kim tra vic thay i gia cc scene khi game
chng ta cn s dng nhiu b nh.

Lu : Cocos2d thc hin rt tt vic dn dp b nh khi bn thay th mt scene.
N xo ton b cc node, dng ton b cc action v unschedule ton b cc
selector.

d dng kim tra vic leak memory do mt scene no cha c gii phng,
chng ta nn log li cc hm khi to v hm hu ca scene .

-(id) init {

if ((self = [super init])) {

CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self); }
}
-(void) dealloc {

CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);

// always call [super dealloc] in the dealloc method!

[super dealloc];
}



PUSHING v POPING SCENE
i vi hm pushScene v popScene ca Director, chng thay th scene c bng mt
scene mi m khng gii phng scene c ra khi b nh. u im ca vic ny l
vic chuyn sang mt scene mi s nhanh hn do khng phi khi to li vng nh
cho scene mi v gii phng vng nh scene c na, tuy nhin nhc im l khi cc
scene kh phc tp v chim mt lng ln dung lng ram th iu ny d dn n
vic chng trnh b crash.
Mt vn na khi thc hin pushScene v popScene l chng ta phi nh c bao
nhiu scene chng ta push vo khi pop li cho chnh xc.
PushScene v PopScene rt hu dng i vi chng ta trong nhiu trng hp. V d
i vi mn hnh setting, chng ta c th vo mn hnh setting t cc mn hnh khc
nh MainMenu, Playing lc chng ta s dng PushScene chuyn sang mn
hnh Setting v dng popScene chuyn v trng thi c m khng lm thay i
game. Tuy nhin chng ta nn lu phi m bo lun c b nh ch 2 scene
cng mt lc.

V d chng ta mun chuyn sang mn hnh setting :
[[CCDirector sharedDirector] pushScene:[Settings scene]];

Bn trong m nhnh setting chng ta gi popScene tr v scene ban u :

[[CCDirector sharedDirector] popScene];



CCTRANSITIONSCENE

Cocos2d gip vic chuyn i gia cc scene p hn v chuyn nghip hn nh cc


lp k tha t lp CCTransitionScene. ng vi mi lp k tha hnh di y s
c mt hiu ng chuyn scene tng ng.


Lu : Chng ta khng nn qu lm dng cc hiu ng trn y, i vi cc hiu
ng cn nhiu thi gian thc hin s lm ngi chi c cm gic kh chu.

thc hin chuyn i cc scene s dng transition chng ta sa li code nh sau :

CCSeneTransition *tran = [CCTransitionFade transitionWithDuration:2
scene:[HelloWorld scene] withColor:ccWhite];
[[CCDirector sharedDirector] replaceScene:tran];

Lu l chng ta c th s dng CCTransitionScene vi phng thc
replaceScene v pushScene nhng chng ta khng th thc hin c vi
popScene.

CCLayer
i khi chng ta mun s dng nhiu hn mt layer trong mt scene. Trong trng
hp , chng ta c th to thm cc i tng CCLayer v thm vo mt scene nh
sau :

+(id) scene
{

CCScene* scene = [CCScene node];

CCLayer* backgroundLayer = [HelloWorldBackground node];

[scene addChild: backgroundLayer];

CCLayer* layer = [HelloWorld node]; [scene addChild:layer];

CCLayer* userInterfaceLayer = [HelloWorldUserInterface node];

[scene addChild: userInterfaceLayer];

return scene;
}

Scene hin ti c 3 layer; layer cha background, layer cha cc i tng trong
game, v layer tng tc vi ngi chi. Bi v cc layer c thm vo scene theo
th t nn cc node khi c v ra cng s theo th t. Background layer c add
u tin v vy cc i tng thuc layer ny khi c v ln s nm di cc layer
khc.

Mt trng hp chng ta nn s dng nhiu layer trong cng mt scene l i vi
nhng game scrolling, s dng nhiu layer s gip chng ta d dng di chuyn
background trong khi cc i tng foreground vn gi nguyn v tr.

Ging nh lp mt scene, layer s dng chung h to ca OpenGL. i vi iOS,
cc layer thng c kch thc bng vi kch thc ca mn hnh, cn i vi Mac
OS X th kch thc ca n s bng vi kch thc ca s.

Layer ch yu c s dng nhm cc i tng trong game li. V d chng ta


c th thc hin mt action ln mt layer, n s nh hng n ton b cc i
tng trn layer . C ngha l chng ta c th thay i to , scale hoc xoay ton
b object trong mt layer cng lc.

Lu : Chng ta khng nn s dng qu nhiu layer trong mt scene. iu ny
thng d gy hiu lm. Chng ta c th s dng rt nhiu layer m khng lm nh
hng n hiu nng ca game so vi s dng cc node. Tuy nhin, nu layer ca
chng ta cho php nhn cc s kin touch v cm ng gia tc th s lm tn rt nhiu
x l. Ch nn thit lp mt layer m nhim x l vic ny.

X l s kin touch

Lp CCLayer c thit k nhn cc s kin touch nu chng ta thit lp chng.


bt cc s kin touch chng ta s thit lp thuc tnh isTouchEnable l YES;

self.isTouchEnable = YES;

on code trn s c t trong hm init, tuy nhin chng ta c th thay i n bt
c lc no. Khi thuc tnh isTouchEnable c thit lp, mt s phng thc cho
vic x l touch s bt u c gi. Mt s s kin c gi khi ngi dng va
chm tay vo mn hnh, khi ngi dng di chuyn tay trn mn hnh v cui cng
khi ngi dng nhc tay khi mn hnh.

- Phng thc khi chm tay vo mn hnh :
-(void) ccTouchedBegan:(NSSet*)touches withEvent(UIEvent*)event

- Phng thc khi di chuyn tay trn mn hnh :
-(void) ccTouchedBegan:(NSSet*)touches withEvent(UIEvent*)event

- Phng thc khi nhc tay khi mn hnh :
-(void) ccTouchedBegan:(NSSet*)touches withEvent(UIEvent*)event

Trong mt s trng hp chng ta mun bit c v tr m ngi dng touch ln
mn hnh, tuy nhin s kin touch c bt bi cc API ca Cocoa nn chng ta phi
chuyn i to sang h to ca OpenGL. Hm di y s m t iu :

-(CGPoint) locationFromTouches:(NSSet *)touches
{

UITouch *touch = [touches anyObject];

CGPoint touchLocation = [touch locationInView: [touch view]];

return [[CCDirector sharedDirector] convertToGL:touchLocation];
}

Mc nh, layer s bt cc s kin ging nh lp UIResponder ca Apple. Cocos2d


cng h tr chng ta qun l i tng touch. im khc bit l cc i tng c
touch ch nhn mt touch mt thi im, trong khi UIResponder s nhn mt
b cc s kin ca touch. thit lp chng, thm hm sau vo lp layer chng ta
cn bt s kin touch :

-(void) registerWithTouchDispatcher {
[[CCTouchDispatcher
sharedDispatcher]
addTargetedDelegate:self

priority:INT_MIN+1

swallowsTouches:YES];
}

Lu : nu hm registerWithTouchDispatcher trng th chng ta s khng nhn
c bt c touch no. Nu chng ta mun s dng handler default, chng ta phi
gi hm [super registerWithTouchDispatcher] trong phng thc ny.

Thay v s dng cc phng thc mc nh, chng ta s s dng mt s phng
thc khc. Cc phng thc ny gn nh l ging vi cc phng thc trc ngoi
tr chng nhn v mt i tng UITouch thay v mt NSSet.

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {}
-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {}
-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {}
-(void) ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event {}

im quan trng cn lu y l kiu tr v ca phng thc ccTouchBegan tr
v kiu BOOL. Nu chng ta return YES c ngha l chng ta khng mun s kin ny
truyn n cc i tng touch khc c u tin thp hn.

X l cm ng gia tc
Ging nh touch, bt cc s kin cm ng gia tc ta cn phi thit lp vic nhn
s kin :

self.isAccelerometerEnabled = YES;

Hm di y s c gi khi bt c s kin :

-(void)
accelerometer:(UIAccelerometer
*)accelerometer
didAccelerate:(UIAcceleration *)acceleration
{

CCLOG(@"acceleration: x:%f / y:%f / z:%f",





acceleration.x, acceleration.y, acceleration.z);
}

CCSprite

CCSprite l mt lp c s dng ph bin nht trong lp trnh game. N s dng


mt hnh nh v sprite ln mn hnh. Cch n gin nht to mt sprite l
t mt file c load thnh mt CCTexture2D. Chng ta phi thm hnh nh vo
th mc resources trong Xcode, nu khng n s khng tm ra file .

CCSprite* sprite = [CCSprite spriteWithFile:@Default.png];
[self addChild:sprite];

Mt sprite mc nh s c to l (0, 0) v to ca sprite c xc nh l tm
ca texture .

Anchor
Mi node u c mt im neo, s c mt cht khc bit nu node l mt texture
hay CCSprite hay CCLabelTTF. Mc nh, im neo (anchorPoint) l (0.5, 0.5), tc l
gia texture.
S dng anchorPoint khng lm nh hng n to ca mt node, chng ch thay
i cc m texture c v ln mn so vi to ca node . Tuy nhin chng ta
khng nn s dng anchorPoint nhiu tr nhng trng hp cn thit.
on code di y, mt sprite c thit lp anchorPoint l gc di bn tri
ca mn hnh bi v anchorPoint c thit lp l (0, 0) :

CCSprite* sprite = [CCSprite spriteWithFile:@Default.png];
sprite.anchorPoint = CGPointMake(0, 0);
[self addChild:sprite];

Texture dimensions (kch thc texture)

Cc thit b iOS ch c th lm vic vi cc texture c kch thc l m ca 2, v vy


chiu rng v chiu cao ca mt texture c th l 2, 4, 8, 16, 32, 128, 256, 512, 1024,
v vi th h thit b th ba c th ln n 2048 pixel.
V d chng ta to mt sprite t mt file nh. Chng ta hy kim tra trng hp xu
nht khi c mt bc nh 260x260 pixel vi 32-bit mu. Texture ny ng l ch s
dng 270KB b nh nhng thc t n chim n khong 1MB b nh.
Nguyn nhn gy ra hin tng ny l kch thc ca mt texture phi l bi s ca
2 , v vy iOS to mt texture vi kch thc nh nht vi bi s ca 2 m cha
hnh nh. Trong trng hp texture 260x260, iOS s to mt texture rng 512x512
trong b nh, v n chim 1MB.

CCLabelTTF

CCLabelTTF l mt lp h tr trong vic xut cc ch ln mn hnh. khi to mt


CCLabelTTF ta lm nh sau :
CCLabelTTF*
label
fontName:@"AppleGothic"

[CCLabelTTF

labelWithString:@"text"

fontSize:32];
[self addChild:label];
Mc nh CCLabelTTF s canh text l center-aligned bi v anchorPoint mc nh l
(0.5, 0.5). Chng ta c th thit lp li anchorPoint thng qua thuc tnh anchorPoint
c trong CCLabelTTF :

// align label to the right
label.anchorPoint = CGPointMake(1, 0.5f);

// align label to the left
label.anchorPoint = CGPointMake(0, 0.5f);

// align label to the top
label.anchorPoint = CGPointMake(0.5f, 1);

// align label to the bottom
label.anchorPoint = CGPointMake(0.5f, 0);

// use case: place label at top-right corner of the screen
// the label's text extends to the left and down and is always completely on screen
CGSize size = [[CCDirector sharedDirector] winSize];
label.position = CGPointMake(size.width, size.height);
label.anchorPoint = CGPointMake(1, 1);

Menu

Chng ta cn mt s loi button m ngi chi c th thao tc thc hin mt


action, v d nh n mt scene khc hoc bt/tt nhc. Lp CCMenu s gip chugns
ta lm vic ny. CCMenu l mt lp con ca CCLayer v ch nhn CCMenuItem lm
node con. Di y l s cc lp con ca CCMenuItem :


on code di y m t vic thit lp mt menu :



CGSize size = [[CCDirector sharedDirector] winSize];

// set CCMenuItemFont default properties
[CCMenuItemFont setFontName:@"Helvetica-BoldOblique"];
[CCMenuItemFont setFontSize:26];

// create a few labels with text and selector
CCMenuItemFont* item1 = [CCMenuItemFont itemFromString:@"Go Back!"

target:self

selector:@selector(menuItem1Touched:)];

// create a menu item using existing sprites
CCSprite* normal = [CCSprite spriteWithFile:@"Icon.png"];
normal.color = ccRED;
CCSprite* selected = [CCSprite spriteWithFile:@"Icon.png"];
selected.color = ccGREEN;

CCMenuItemSprite* item2 = [CCMenuItemSprite
itemFromNormalSprite:normal selectedSprite:selected
target:self selector:@selector(menuItem2Touched:)];

// create a toggle item using two other menu items (toggle works with images, too)
[CCMenuItemFont setFontName:@"STHeitiJ-Light"];
[CCMenuItemFont setFontSize:18];
CCMenuItemFont* toggleOn = [CCMenuItemFont itemFromString:@"I'm ON!"];
CCMenuItemFont* toggleOff = [CCMenuItemFont itemFromString:@"I'm OFF!"];
CCMenuItemToggle* item3 = [CCMenuItemToggle itemWithTarget:self

selector:@selector(menuItem3Touched:)

items:toggleOn, toggleOff, nil];

// create the menu using the items
CCMenu* menu = [CCMenu menuWithItems:item1, item2, item3, nil];
menu.position = CGPointMake(size.width / 2, size.height / 2);
[self addChild:menu];

// aligning is important, so the menu items dont occupy the same location
[menu alignItemsVerticallyWithPadding:40];

Lu : Danh sch cc MenuItem lun lun kt thc vi t kho nil. Nu chng ta
qun thm t kho ny vo th chng trnh s b crash khi thc thi on code ny.

Loi MenuItem th nht l CCMenuItemFont v n gin ch xut ra mt chui. Khi


menu item c touch, n s gi phng thc menuItem1Touched. Nu c sn mt
i tng CCLabel, chng ta c th s dng lp CCMenuItemLabel.

i vi hnh nh, chng ta c 2 lp s dng l CCMenuItemImage, n s to ra
mt hnh nh t mt file v s dng CCSprite bn trong v loi kia l
CCMenuItemSprite, lp ny s s dng sprite hin c.

CCMenuItemToggle ch chp nhn ng 2 i tng CCMenuItem v khi touch vo,
s i sang trng thi kia. Chng ta c th s dng c label hoc hnh nh cho
CCMenuItemToggle.

Cui cng, CCMenu c khi to v thit lp v tr. V tt c cc CCMenuItem l con
ca CCMenu nn to ca chng s lin quan n CCMenu. sp xp chng theo
th t cch u nhau, chng ta s dng phng thc

alignItemsVerticallyWithPadding.
V CCMenu l mt node cha tt c cc i tng CCMenuItem, chng ta c th s
dng cc action ln chng. Gip cho menu ca chng ta ng hn. Di y l kt
qu ca on code trn :

Action

Action l mt class c s dng thc hin cc thao tc di chuyn, thay i kch


thc, xoay, lm m i v nhiu hiu ng khc trn mt node. Bi v lp ny lm
vic vi mi node, nn chng ta c th s dng chng trn cc sprite, label v thm
ch l menu hoc ton b mt scene. Di y l s cc lp k tha t lp
CCAction



C 3 lp Action k tha trc tip t CCAction :
- CCFollow (cho php mt node theo sau mt node khc)
- CCRepeatForever (lp mt action n v tn)
- CCSpeed (thay i tn s update ca mt hnh ng khi n ang chy)

Vi CCFollow action, chng ta c th thit lp mt node c action ging mt node
khc. V d chng ta s thit lp action cho i tng label theo i tng player
nh sau :

[label runAction:[CCFollow actionWithTarget:playerSprite]];

Chng ta c th lp mt action hoc mt chui cc action vi CCRepeatForever.
Chng ta cng c th to mt vng lp animation v tn bng cch ny. V d chng
ta to ra mt node xoay my my ging nh mt bnh xe ang quay :

CCRotateBy* rotateBy = [CCRotateBy actionWithDuration:2 angle:360];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:rotateBy];
[myNode runAction:repeat];

Lp CCSpeed c dng thay i tc ca mt action khi n ang chy. Chng
ta s xt xem on code di y :

CCRotateBy* rotateBy = [CCRotateBy actionWithDuration:2 angle:360];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:rotateBy];
CCSpeed* speedAction = [CCSpeed actionWithAction:repeat speed:0.5f];
speedAction.tag = 1;
[myNode runAction:speedAction];

By gi node ny s mt thi gian gp i hon thnh mt vng quay bi v tc
ca action c chnh cn 0.5f. Chng ta c th thay i li thuc tnh speed
ca lp CCSpeed trong lc action ang chy.

Lu : chng ta khng th thm mt CCSpeed action vo mt CCSequence action,
ch c cc action k tha t lp CCFiniteTimeAction mi c th c s dng trong
CCSequence.

Interval Action

Khi hu ht cc action u din ra trong mt khong thi gian nht nh, v d mt


vt xoay trong 3 giy, chng ta thng phi vit mt hm update v cc bin lu
tr thi gian, CCActionInterval action s gip chng ta thc hin cng vic ny
n gin hn, v d :

// di chuyn mt node t to 100, 200 trong 3 giy
CCMoveTo* move = [CCMoveTo actionWithDuration:3 position: CGPointMake(100,
200)];
[myNode runAction:move];

y n gin chng ta ch truyn vo to bt u, to m i tng di
chuyn n v thi gian thc hin, vn tc di chuyn ca vt s thay i theo thi
gian chng ta truyn vo.

Ngoi ra, chng ta khng cn xo mt action. Khi action thc hin xong th chng s
t ng xo v gii phng khi b nh.

Action Sequences

Thng thng khi chng ta thm mt vi action vo mt node, chng s thc hin
ton b cc action ny cng mt lc. V d chng ta c mt i tng xoay v m i
cng mt lc. Nhng nu chng ta mun thc hin mt action sau khi mt action
khc hon tt ?

thc hin c vic ny, chng ta s dng lp CCSequence. Di y l mt v d


m t mt label i mu t sang xanh da tri v chuyn sang xanh l cy :

CCTintTo* tint1 = [CCTintTo actionWithDuration:4 red:255 green:0 blue:0];
CCTintTo* tint2 = [CCTintTo actionWithDuration:4 red:0 green:0 blue:255];
CCTintTo* tint3 = [CCTintTo actionWithDuration:4 red:0 green:255 blue:0];
CCSequence* sequence = [CCSequence actions:tint1, tint2, tint3, nil];
[label runAction:sequence];

Chng ta cng c th s dng mt CCRepeatForever vi mt chui cc action :

CCSequence* sequence = [CCSequence actions:tint1, tint2, tint3, nil];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:sequence];
[label runAction:repeat];

Ngoi ra chng ta cng c th thay i tc ca ton cc action :

CCSequence* sequence = [CCSequence actions:tint1, tint2, tint3, nil];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:sequence];
CCSpeed* speedAction = [CCSpeed actionWithAction:repeat speed:0.75f];
[label runAction:speedAction];

Lu : Ging nh menu item, mt danh sch cc action lun lun kt thc bng nil.
Nu chng ta khng thm t kho nil vo khi on code c thc thi chng trnh
s b crash.

Ease Action

Ease action cho php chng ta thay i hiu ng ca mt action mi lc. V d, nu


chng ta ang s dng CCMoveTo action trn mt node, node s di chuyn ton
b khong cch vi cng mt tc cho ti khi n n ni. Vi CCActionEase, chng
ta c th c mt node bt u chm v tng tc cho n ch. Hoc chng ta c th
cho n di chuyn qua ch mt cht v quay li. Ease action to ra cc chuyn ng
m thng thng tn rt nhiu thi gian vit cc on code thc thi. Thuc tnh
rate xc nh mc ca hiu ng v phi ln hn 1 mi thy hiu ng c.

// Di chuyn myNode n to 100, 200 trong 3 giy
CCMoveTo* move = [CCMoveTo actionWithDuration:3 position:CGPointMake(100,
200)];
// myNode s bt u vi tc chm, tng dn ln v khi n ch s chm li
CCEaseInOut* ease = [CCEaseInOut actionWithAction:move rate:4];
[myNode runAction:ease];

Di y l mt s lp con ca lp CCActionEase :

CCEaseBackIn, CCEaseBackInOut, CCEaseBackOut


CCEaseBounceIn,
CCEaseBounceInOut,
CCEaseBounceOut CCEaseElasticIn,
CCEaseElasticInOut,
CCEaseElasticOut CCEaseExponentialIn,
CCEaseExponentialInOut,
CCEaseExponentialOut
CCEaseIn,
CCEaseInOut,
CCEaseOut CCEaseSineIn, CCEaseSineInOut, CCEaseSineOut


Grid Action

Grid action l cc action k tha t lp CCGridAction v c 2 lp con l


CCGrid3Daction v CCTiledGrid3DAction. Di y l s ca chng :


iu c bit ca grid action l hiu ng 3D nh lt trang giy (CCPageTurn3D) hoc
m phng sng trn mt nc (CCWaves, CCLiquid). Mt khc ca hiu ng 3D s
khng thc hin c nu cha bt depth buffering, iu ny s lm tn b nh rt
nhiu v chi ph x l.

thit lp depth buffering, chng ta s thay i mt s on code trong lp
Delegate lc khi to EAGLView, mc nh thuc tnh DepthFormat l 0, thit lp
depth buffering chng ta thay truyn vo cc i s GL_DEPTH_COMPONENT16_OES
cho 16-bit depth buffer hoc GL_DEPTH_COMPONENT24_OES cho 24-bit depth
buffer.

EAGLView *glView = [EAGLView viewWithFrame:[window bounds]

pixelFormat:kEAGLColorFormatRGB565

depthFormat:GL_DEPTH_COMPONENT16_OES];


Instant actions


C th chng ta s thc mc ti sao li c nhiu instant action k tha t lp
CCInstantAction, trong khi chng ta c th n gin thay i mt s thuc tnh ca
node c c cng hiu ng.




Nguyn nhn chnh m cc instant action c to ra l bi v chng kh hu ch
trong cc chui action. i khi trong mt chui cc action chng ta phi thay i mt
thuc tnh ca node, nh to hoc thuc tnh opacity, sau tip tc vi cc
action khc. Hu ht cc lp trn rt t khi c s dng ngoi tr mt ngoi l :
CCCallFunc.

CCCallFunc* func = [CCCallFunc actionWithTarget:self

selector:@selector(onCallFunc)];

CCCallFuncN* funcN = [CCCallFuncN actionWithTarget:self

selector:@selector(onCallFuncN:)];

CCCallFuncND* funcND = [CCCallFuncND actionWithTarget:self

selector:@selector(onCallFuncND:data:)

data:(void*)self];

CCCallFuncO* funcO = [CCCallFuncO actionWithTarget:self

selector:@selector(onCallFuncO:)

object:(id)self];

CCSequence* seq = [CCSequence actions: tint1, func, tint2, funcN, tint3, funcND,
funcO, nil];

[label runAction:seq];

im khc bit gia cc lp trn l loi selector no s c gi v ng cnh no m
phng thc c gi. V d lp CCCallFunc s gi phng thc onCallFunc,
chng ta khng th bit c i tng no gi phng thc v ti sao.

-(void) onCallFunc
{

CCLOG(@"end of tint1!");
}

-(void) onCallFuncN:(id)sender
{

CCLOG(@"end of tint2! sender: %@", sender);
}

-(void) onCallFuncND:(id)sender data:(void*)data
{

// be careful when casting pointers like this!

// you have to be 100% sure the object is of this type!

CCSprite* sprite = (CCSprite*)data;

CCLOG(@"end of sequence! sender: %@ - data: %@", sender, sprite);
}

-(void) onCallFuncO:(id)object
{

// object is the object you passed to CCCallFuncO

CCLOG(@"call func with object %@", object);
}

Singleton trong cocos2d

Cocos2d s dng kh tt singleton pattern. Singleton l mt class bnh thng m


trong sut qu vng i ca chng trnh, ch c mt th hin ca class c to
ra. m bo iu ny, mt phng thc tnh c dng cho c hai vic khi to
v truy cp vo i tng. V vy, thay v alloc/init hoc autorelease initialize, chng
ta truy cp mt i tng singleton thng qua phng thc bt u bng shared.
Di y l mt s class singleton thng dng trong cocos2d :

CCActionManager* sharedManager = [CCActionManager sharedManager];
CCDirector* sharedDirector = [CCDirector sharedDirector];
CCSpriteFrameCache* sharedCache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCTextureCache* sharedTexCache = [CCTextureCache sharedTextureCache];
CCTouchDispatcher* sharedDispatcher = [CCTouchDispatcher sharedDispatcher];

CDAudioManager* sharedManager = [CDAudioManager sharedManager];


SimpleAudioEngine* sharedEngine = [SimpleAudioEngine sharedEngine];

Mt mt khc ca singleton l n c th c s dng bt k u bi bt k lp no.
N ging nh mt class ton cc hay bin ton cc. Tuy nhin chng ta nn cn nhc k
trc khi thit k mt class no l single. V d trong game chng ta ch c mt
player, ti sao chng ta khng thit k lp Player l singleton ? Mi vic u n cho n
khi chng ta nhn ra sau mi mn chi, singleton s lu li ton b im, frame
animation cui cng, mu v tt c cc th khc. Hoc thi gian sau ny pht sinh ra
cch chi dnh cho 2 ngi ?

on code di y m t cch to mt class l singleton. Phng thc sharedManager
dng truy cp vo th hin ca lp MyManager, nu i tng cha tn ti, th hin
s c cp pht v khi to, nu i tng tn ti th tr v i tng .

static MyManager *sharedManager = nil;
+(MyManager*) sharedManager
{

if (sharedManager == nil)

{

sharedManager = [[MyManager alloc] init];

}

return sharedManager;
}

You might also like