日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
cocos2d-x如何檢測碰撞

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

成都創(chuàng)新互聯(lián)服務(wù)項目包括寶塔網(wǎng)站建設(shè)、寶塔網(wǎng)站制作、寶塔網(wǎng)頁制作以及寶塔網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,寶塔網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到寶塔省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

在游戲中,我們?yōu)檫@兩種精靈加以不同的tag來區(qū)分它們。當(dāng)tag=1時,表示這是怪物,而tag=2時,則表示這為子彈。由于在CCNode里面有m_nTag這個成員變量,并且有setTag和getTag方法,因此CCSprite就繼承了這些方法,我們可以利用之。

在HelloWorldScene.h中,把以下兩個成員變量加入到HelloWorld下,這兩個成員變量用于緩存現(xiàn)有的怪物和子彈。

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相當(dāng)于iOS SDK中的NSMutableArray,該數(shù)組里的成員可以是NSObject或者他們的子類。但不同的是,你必須告訴它里面要放的是哪種具體的類型。

之后構(gòu)造函數(shù)中初始化這兩個變量,在init()中new 它們,并在析構(gòu)函數(shù)中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}

現(xiàn)在可以修改addTarget(),把新目標(biāo)添加到目標(biāo)數(shù)組中,并設(shè)置其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(),把新子彈加入到子彈數(shù)組中,并設(shè)置其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()。這里根據(jù)標(biāo)記的不同,在對應(yīng)的數(shù)組中移除精靈

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()函數(shù)用于檢測每幀的碰撞,并從游戲中刪除碰撞中的子彈和怪物。

請在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里讓它每幀都能被調(diào)用。

1// cpp with cocos2d-x

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

1// objc with cocos2d-iphone

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

編譯并運(yùn)行項目,盡情地發(fā)射子彈吧,這時:啊哈,怪物都一個接著一個地被干掉了。


本文名稱:cocos2d-x如何檢測碰撞
文章網(wǎng)址:http://www.dlmjj.cn/article/ccsdpij.html