【cocos2dx 3.3】口袋空战3 敌人层
分析
在游戏开发中,敌人作为游戏中的重要元素,通常具有独立的动作。在本项目里,敌人被定义为 Sprite
类。由于游戏需要进行碰撞检测,因此要为敌人设置物理属性。敌人的运动模式是不断地从屏幕右端移动到左端,这里使用 MoveTo
动作来实现。
敌人素材
本项目使用了 e1.png
、e2.png
和 e3.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
方法将其从父节点中移除。