【cocos2dx 3.3】口袋空战3 敌人层

2015年03月17日 16:48 0 点赞 0 评论 更新于 2017-05-01 04:49

分析

在游戏开发中,敌人作为游戏中的重要元素,通常具有独立的动作。在本项目里,敌人被定义为 Sprite 类。由于游戏需要进行碰撞检测,因此要为敌人设置物理属性。敌人的运动模式是不断地从屏幕右端移动到左端,这里使用 MoveTo 动作来实现。

敌人素材

本项目使用了 e1.pnge2.pnge3.png 这三种不同的敌人素材,在初始化敌人时会随机选择其中一种。

代码实现

Enemy.h

#include "cocos2d.h"
USING_NS_CC;

class Enemy : public Sprite {
public:
// 通过随机设定Y轴坐标,初始化精灵球位置
virtual bool init(float positionY);
static Enemy* create(float positionY);

// 精灵球精灵
Sprite *enemy;

// 记录初始化Y轴位置
float p;

// 记录屏幕大小
Size size;

// 移除精灵球精灵
void rm();
};

Enemy.cpp

#include "Enemy.h"
USING_NS_CC;

Enemy* Enemy::create(float positionY) {
// 创建Enemy对象
Enemy *e = new Enemy();
// 初始化Enemy对象
e->init(positionY);
// 自动释放内存
e->autorelease();
return e;
}

bool Enemy::init(float positionY) {
// 调用父类的init方法
Sprite::init();
// 获取屏幕的可见大小
size = Director::getInstance()->getVisibleSize();
// 记录初始化的Y轴位置
p = positionY;
// 初始化随机数种子
srand(time(NULL));
// 生成0到2之间的随机数
int i = rand() % 3;

// 根据随机数选择不同的敌人素材
switch (i) {
case 0: {
enemy = Sprite::create("e1.png");
break;
}
case 1: {
enemy = Sprite::create("e2.png");
break;
}
case 2: {
enemy = Sprite::create("e3.png");
break;
}
}

// 设置敌人的初始位置
enemy->setPosition(Point(size.width - 50, p));
// 为敌人创建物理体
enemy->setPhysicsBody(PhysicsBody::createBox(enemy->getContentSize()));
// 设置物理体的接触测试位掩码
enemy->getPhysicsBody()->setContactTestBitmask(1);
// 设置物理体的标签
enemy->getPhysicsBody()->setTag(3);

// 让敌人执行移动动作,移动到指定位置后调用rm方法移除自身
enemy->runAction(Sequence::create(
MoveTo::create(0.5f, Point(10, p)),
CallFuncN::create(CC_CALLBACK_0(Enemy::rm, this)),
NULL
));

// 将敌人添加到当前节点
addChild(enemy);
return true;
}

void Enemy::rm() {
// 从父节点中移除敌人
enemy->removeFromParent();
}

上述代码实现了敌人的初始化、随机素材选择、移动以及移除等功能。在 Enemy::init 方法中,首先调用父类的 init 方法,然后获取屏幕大小并记录初始的 Y 轴位置。接着,通过随机数选择不同的敌人素材,并为敌人设置初始位置和物理属性。最后,让敌人执行移动动作,当移动到指定位置后调用 rm 方法将其从父节点中移除。

作者信息

menghao

menghao

共发布了 332 篇文章