上一章讲解了怎么去开发一个游戏  是不是觉得游戏太简单呢??  那我们来添加个多血怪物  就是需要打两下才翘掉的怪物!

先把本章用到的图片素材下载下来 :点我下载

为了有趣,我们创建两种类型的鬼头靶子:一种脆弱但是移动速度快的,和一种强壮但是速度慢的,

现在让我们创建Monster类。有很多方法可以模型化Monster类,但这里我们使用最简单的,就是作为CCSprite的子类。我们还将会创建两个Monster的子类:一个代表脆弱快速的鬼头靶子,另一种则代表强壮慢速的。

 
  
  1. /* 
  2.  * Monster.h 
  3.  * 
  4.  *  Created on: 2012-9-28 
  5.  *      Author: Panda 
  6.  */ 
  7.  
  8. #ifndef MONSTER_H_ 
  9. #define MONSTER_H_ 
  10.  
  11. #include "cocos2d.h" 
  12. USING_NS_CC; 
  13.  
  14. class Monster: public CCSprite 
  15.  
  16. public
  17.     Monster(); 
  18.     virtual ~Monster(); 
  19.  
  20.     CC_SYNTHESIZE(int, _curHp, Hp); 
  21.     CC_SYNTHESIZE(int, _minMoveDuration, MinMoveDuration); 
  22.     CC_SYNTHESIZE(int, _maxMoveDuration, MaxMoveDuration); 
  23. }; 
  24.  
  25. class WeakAndFastMonster: public Monster { 
  26. public
  27.     static WeakAndFastMonster *monster(); 
  28. }; 
  29.  
  30. class StrongAndSlowMonster: public Monster { 
  31. public
  32.     static StrongAndSlowMonster *monster(); 
  33. }; 
  34.  
  35. #endif /* MONSTER_H_ */ 

 这里直截了当:我们让Monster继承自CCSprite并加了几个成员变量,用来记录鬼头靶子的状态,然后又从Monster派生了两个类,用来代表两种不同类型的鬼头靶子。

 
  
  1. /* 
  2.  * Monster.cpp 
  3.  * 
  4.  *  Created on: 2012-9-28 
  5.  *      Author: Panda 
  6.  */ 
  7.  
  8. #include "Monster.h" 
  9.  
  10. Monster::Monster() { 
  11.     // TODO Auto-generated constructor stub 
  12.  
  13.  
  14. Monster::~Monster() { 
  15.     // TODO Auto-generated destructor stub 
  16.  
  17. WeakAndFastMonster* WeakAndFastMonster::monster() { 
  18.     WeakAndFastMonster *monster = new WeakAndFastMonster; 
  19.     if (monster->initWithFile("Target.png") && monster->autorelease()) { 
  20.         monster->setHp(1); 
  21.         monster->setMinMoveDuration(3); 
  22.         monster->setMaxMoveDuration(5); 
  23.     } 
  24.     return monster; 
  25.  
  26. StrongAndSlowMonster *StrongAndSlowMonster::monster() { 
  27.     StrongAndSlowMonster *monster = new StrongAndSlowMonster; 
  28.         if (monster->initWithFile("Target2.png") && monster->autorelease()) { 
  29.             monster->setHp(3); 
  30.             monster->setMinMoveDuration(6); 
  31.             monster->setMaxMoveDuration(12); 
  32.         } 
  33.         return monster; 

这里实际有用的代码只是在两个类中分别添加了一个static方法,用来设置默认的HP和移动时间。

现在让我们把新的Monster类加入到除此之外的代码中去!首先导入新文件到MainScene.cpp的一开头

 
  
  1. #include "Monster.h" 

然后,修改addTarget 方法,替换掉以前直接创建sprite的方法,使其构造我们新的类。用以下内容替换掉CCSprite *pTarget = CCSprite::create("Target.png");这一行:

 
  
  1. Monster *pTarget = NULL; 
  2.     if (arc4random() % 2 == 0) { 
  3.         pTarget = WeakAndFastMonster::monster(); 
  4.     } else { 
  5.         pTarget = StrongAndSlowMonster::monster(); 
  6.     } 

 

这里会有50%的几率会出现两种鬼头靶子中的一种。另外,因为我们把靶子移动速度这个变量移到了类中,所以要如下修改min/max duration这一行:
 
  
  1. int minDuration = pTarget->getMinMoveDuration(); 
  2. int maxDuration = pTarget->getMaxMoveDuration(); 

最后一步,要对updateFrame方法做些修改。首先在targetsToDelete声明之前加入一个bool。

 
  
  1. bool monsterHit = false

然后,在intersectsRect判断块儿中,不要立刻就将对象加入到 array_targetsToDelete ,用以下内容替换之:

 
  
  1. if (Projectile->boundingBox().intersectsRect( 
  2.                     Target->boundingBox())) { 
  3.                 monsterHit = true
  4.                 Monster *monster = (Monster*) Target; 
  5.                 monster->setHp(monster->getHp() - 1); 
  6.                 if (monster->getHp() <= 0) { 
  7.                     array_targetsToDelete->addObject(Target); 
  8.                 } 
  9.                 break
  10.             } 

我们不再立刻杀掉鬼头靶子了,而是减少其一HP,当血量为0或比0小时,我们才摧毁它。另外注意一下,每当飞镖碰到一个鬼头靶子时我们就退出循环了,意味着飞镖每次只能打击一个鬼头靶子。

最后,如下修改array_projectilesToDelete判断块儿:

 
  
  1. if (monsterHit) { 
  2.             array_projectilesToDelete->addObject(Projectile); 
  3.         } 

编译并运行,如果一切顺利你会看到两种不同类型的鬼头靶子穿梭在屏幕中,我们的主角终于棋逢对手了!


本例子×××:  点我下载



接下来一章将讲解tmx地图,如有问题,请提出

本教程根据Cocos2d教程翻译过来

使用的cocos2d-x版本为2.02