首先,跟蹤怪物和子彈是必需的。

在遊戲中,我們為這兩種精靈加以不同的tag來區分它們。當tag=1時,表示這是怪物,而tag=2時,則表示這為子彈。由於在CCNode裡面有m_nTag這個成員變數,並且有setTag和getTag方法,因此CCSprite就繼承了這些方法,我們可以利用之。

在HelloWorldScene.h中,把以下兩個成員變數加入到HelloWorld下,這兩個成員變數用於緩存現有的怪物和子彈。

1// cpp with cocos2d-x

2protected:

3 cocos2d::CCMutableArray *_targets;

4 cocos2d::CCMutableArray *_projectiles;

1// objc with cocos2d-iphone

2 NSMutableArray *_targets;

3 NSMutableArray *_projectiles;

在cocos2d-x裡,CCMutableArray相當於iOS SDK中的NSMutableArray,該陣列裡的成員可以是NSObject或者他們的子類。但不同的是,你必須告訴它裡面要放的是哪種具體的類型。

之後建構函式中初始化這兩個變數,在init()中new 它們,並在析構函數中release 它們。

1// cpp with cocos2d-x

2

3// in init()

4// Initialize arrays

5_targets = new CCMutableArray;

6_projectiles = new CCMutableArray;

7

8HelloWorld::~HelloWorld()

9{

10 if (_targets)

11 {

12 _targets->release();

13 _targets = Null;

14 }

15

16 if (_projectiles)

17 {

18 _projectiles->release();

19 _projectiles = Null;

20 }

21

22 // cpp don't need to call super dealloc

23 // virtual destructor will do this

24}

25

26HelloWorld::HelloWorld()

27:_targets(Null)

28,_projectiles(Null)

29{

30}

1// objc with cocos2d-iphone

2// in init()

3// Initialize arrays

4_targets = [[NSMutableArray alloc] init];

5_projectiles = [[NSMutableArray alloc] init];

6

7- (void) dealloc

8{

9 [_targets release];

10 _targets = nil;

11

12 [_projectiles release];

13 _projectiles = nil;

14

15 // don't forget to call "super dealloc"

16 [super dealloc];

17}

現在可以修改addTarget(),把新目標添加到目標陣列中,並設置其tag為1。

1// cpp with cocos2d-x

2// Add to targets array

3target->setTag(1);

4_targets->addObject(target);

1// objc with cocos2d-iphone

2// Add to targets array

3target.tag = 1;

4[_targets addObject:target];

修改ccTouchesEnded(),把新子彈加入到子彈陣列中,並設置其tag為2。

1// cpp with cocos2d-x

2// Add to projectiles array

3projectile->setTag(2);

4_projectiles->addObject(projectile);

1// objc with cocos2d-iphone

2// Add to projectiles array

3projectile.tag = 2;

4[_projectiles addObject: projectile];

之後,按下面修改spriteMoveFinished()。這裡根據標記的不同,在對應的陣列中移除精靈

1// cpp with cocos2d-x

2void HelloWorld::spriteMoveFinished(CCNode* sender)

3{

4 CCSprite *sprite = (CCSprite *)sender;

5 this->removeChild(sprite, true);

6

7 if (sprite->getTag() == 1) // target

8 {

9 _targets->removeObject(sprite);

10 }

11 else if (sprite->getTag() == 2) // projectile

12 {

13 _projectiles->removeObject(sprite);

14 }

15}

1// objc with cocos2d-iphone

2-(void)spriteMoveFinished:(id)sender

3{

4 CCSprite *sprite = (CCSprite *)sender;

5 [self removeChild:sprite cleanup:YES];

6

7 if (sprite.tag == 1) // target

8 {

9 [_targets removeObject:sprite];

10 }

11 else if (sprite.tag == 2) // projectile

12 {

13 [_projectiles removeObject:sprite];

14 }

15}

下面的update()函數用於檢測每幀的碰撞,並從遊戲中刪除碰撞中的子彈和怪物。

請在HelloWorldScene.h中聲明,在HelloWorldScene.cpp中定義。

1// cpp with cocos2d-x

2void HelloWorld::update(ccTime dt)

3{

4 CCMutableArray *projectilesToDelete =

5 new CCMutableArray;

6 CCMutableArray::CCMutableArrayIterator it, jt;

7

8 for (it = _projectiles->begin(); it != _projectiles->end(); it++)

9 {

10 CCSprite *projectile =*it;

11 CCRect projectileRect = CCRectMake(

12 projectile->getPosition().x

13 - (projectile->getContentSize().width/2),

14 projectile->getPosition().y

15 - (projectile->getContentSize().height/2),

16 projectile->getContentSize().width,

17 projectile->getContentSize().height);

18

19 CCMutableArray*targetsToDelete

20 = new CCMutableArray;

21

22 for (jt = _targets->begin(); jt != _targets->end(); jt++)

23 {

24 CCSprite *target =*jt;

25 CCRect targetRect = CCRectMake(

26 target->getPosition().x - (target->getContentSize().width/2),

27 target->getPosition().y - (target->getContentSize().height/2),

28 target->getContentSize().width,

29 target->getContentSize().height);

30

31 if (CCRect::CCRectIntersectsRect(projectileRect, targetRect))

32 {

33 targetsToDelete->addObject(target);

34 }

35 }

36

37 for (jt = targetsToDelete->begin();

38 jt != targetsToDelete->end();

39 jt++)

40 {

41 CCSprite *target =*jt;

42 _targets->removeObject(target);

43 this->removeChild(target, true);

44 }

45

46 if (targetsToDelete->count() >0)

47 {

48 projectilesToDelete->addObject(projectile);

49 }

50 targetsToDelete->release();

51 }

52

53 for (it = projectilesToDelete->begin();

54 it != projectilesToDelete->end();

55 it++)

56 {

57 CCSprite* projectile =*it;

58 _projectiles->removeObject(projectile);

59 this->removeChild(projectile, true);

60 }

61 projectilesToDelete->release();
 
62}

1// objc with cocos2d-iphone

2- (void)update:(ccTime)dt

3{

4 NSMutableArray *projectilesToDelete

5 = [[NSMutableArray alloc] init];

6

7 for (CCSprite *projectile in _projectiles)

8 {

9

10 CGRect projectileRect = CGRectMake(

11 projectile.position.x - (projectile.contentSize.width/2),

12 projectile.position.y - (projectile.contentSize.height/2),

13 projectile.contentSize.width,

14 projectile.contentSize.height);

15

16 NSMutableArray *targetsToDelete

17 = [[NSMutableArray alloc] init];

18

19 for (CCSprite *target in _targets)

20 {

21

22 CGRect targetRect = CGRectMake(

23 target.position.x - (target.contentSize.width/2),

24 target.position.y - (target.contentSize.height/2),

25 target.contentSize.width,

26 target.contentSize.height);

27

28 if (CGRectIntersectsRect(projectileRect, targetRect))

29 {

30 [targetsToDelete addObject:target];

31 }

32 }

33

34 for (CCSprite *target in targetsToDelete)

35 {

36

37 [_targets removeObject:target];

38 [self removeChild:target cleanup:YES];

39 }

40

41 if (targetsToDelete.count >0)

42 {

43 [projectilesToDelete addObject:projectile];

44 }

45 [targetsToDelete release];

46 }

47

48 for (CCSprite *projectile in projectilesToDelete)

49 {

50

51 [_projectiles removeObject:projectile];

52 [self removeChild:projectile cleanup:YES];

53 }

54 [projectilesToDelete release];

55}

好了,最後一件事,我們要把update()加入到schedule裡讓它每幀都能被調用。

1// cpp with cocos2d-x

2this->schedule( schedule_selector(HelloWorld::update) );

1// objc with cocos2d-iphone

2[self schedule:@selector(update:)];

編譯並運行專案,盡情地發射子彈吧,這時:啊哈,怪物都一個接著一個地被幹掉了。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()