上一章讲解了怎么去开发一个游戏 是不是觉得游戏太简单呢?? 那我们来添加个多血怪物 就是需要打两下才翘掉的怪物!
先把本章用到的图片素材下载下来 :点我下载
为了有趣,我们创建两种类型的鬼头靶子:一种脆弱但是移动速度快的,和一种强壮但是速度慢的,
现在让我们创建Monster类。有很多方法可以模型化Monster类,但这里我们使用最简单的,就是作为CCSprite的子类。我们还将会创建两个Monster的子类:一个代表脆弱快速的鬼头靶子,另一种则代表强壮慢速的。
- /*
- * Monster.h
- *
- * Created on: 2012-9-28
- * Author: Panda
- */
- #ifndef MONSTER_H_
- #define MONSTER_H_
- #include "cocos2d.h"
- USING_NS_CC;
- class Monster: public CCSprite
- {
- public:
- Monster();
- virtual ~Monster();
- CC_SYNTHESIZE(int, _curHp, Hp);
- CC_SYNTHESIZE(int, _minMoveDuration, MinMoveDuration);
- CC_SYNTHESIZE(int, _maxMoveDuration, MaxMoveDuration);
- };
- class WeakAndFastMonster: public Monster {
- public:
- static WeakAndFastMonster *monster();
- };
- class StrongAndSlowMonster: public Monster {
- public:
- static StrongAndSlowMonster *monster();
- };
- #endif /* MONSTER_H_ */
这里直截了当:我们让Monster继承自CCSprite并加了几个成员变量,用来记录鬼头靶子的状态,然后又从Monster派生了两个类,用来代表两种不同类型的鬼头靶子。
- /*
- * Monster.cpp
- *
- * Created on: 2012-9-28
- * Author: Panda
- */
- #include "Monster.h"
- Monster::Monster() {
- // TODO Auto-generated constructor stub
- }
- Monster::~Monster() {
- // TODO Auto-generated destructor stub
- }
- WeakAndFastMonster* WeakAndFastMonster::monster() {
- WeakAndFastMonster *monster = new WeakAndFastMonster;
- if (monster->initWithFile("Target.png") && monster->autorelease()) {
- monster->setHp(1);
- monster->setMinMoveDuration(3);
- monster->setMaxMoveDuration(5);
- }
- return monster;
- }
- StrongAndSlowMonster *StrongAndSlowMonster::monster() {
- StrongAndSlowMonster *monster = new StrongAndSlowMonster;
- if (monster->initWithFile("Target2.png") && monster->autorelease()) {
- monster->setHp(3);
- monster->setMinMoveDuration(6);
- monster->setMaxMoveDuration(12);
- }
- return monster;
- }
这里实际有用的代码只是在两个类中分别添加了一个static方法,用来设置默认的HP和移动时间。
现在让我们把新的Monster类加入到除此之外的代码中去!首先导入新文件到MainScene.cpp的一开头
- #include "Monster.h"
然后,修改addTarget 方法,替换掉以前直接创建sprite的方法,使其构造我们新的类。用以下内容替换掉CCSprite *pTarget = CCSprite::create("Target.png");这一行:
- Monster *pTarget = NULL;
- if (arc4random() % 2 == 0) {
- pTarget = WeakAndFastMonster::monster();
- } else {
- pTarget = StrongAndSlowMonster::monster();
- }
这里会有50%的几率会出现两种鬼头靶子中的一种。另外,因为我们把靶子移动速度这个变量移到了类中,所以要如下修改min/max duration这一行:
- int minDuration = pTarget->getMinMoveDuration();
- int maxDuration = pTarget->getMaxMoveDuration();
最后一步,要对updateFrame方法做些修改。首先在targetsToDelete声明之前加入一个bool。
- bool monsterHit = false;
然后,在intersectsRect判断块儿中,不要立刻就将对象加入到 array_targetsToDelete ,用以下内容替换之:
- if (Projectile->boundingBox().intersectsRect(
- Target->boundingBox())) {
- monsterHit = true;
- Monster *monster = (Monster*) Target;
- monster->setHp(monster->getHp() - 1);
- if (monster->getHp() <= 0) {
- array_targetsToDelete->addObject(Target);
- }
- break;
- }
我们不再立刻杀掉鬼头靶子了,而是减少其一HP,当血量为0或比0小时,我们才摧毁它。另外注意一下,每当飞镖碰到一个鬼头靶子时我们就退出循环了,意味着飞镖每次只能打击一个鬼头靶子。
最后,如下修改array_projectilesToDelete判断块儿:
- if (monsterHit) {
- array_projectilesToDelete->addObject(Projectile);
- }
编译并运行,如果一切顺利你会看到两种不同类型的鬼头靶子穿梭在屏幕中,我们的主角终于棋逢对手了!
本例子×××: 点我下载
接下来一章将讲解tmx地图,如有问题,请提出
本教程根据Cocos2d教程翻译过来
使用的cocos2d-x版本为2.02
转载于:https://blog.51cto.com/gejw0623/1008929