关于cocos2dx 3.3的口袋空战3 敌人层
在今天的内容中,我们将深入学习Cocos2d-x 3.3框架下口袋空战游戏里敌人层的实现。在这个游戏中,敌人被定义为Sprite类,它们有自己的动作,并且需要进行碰撞检测,因此我们要为其设置物理属性。
敌人移动效果
敌人会不断地从屏幕右端移动到左端,这里我们使用MoveTo动作来实现这一效果。敌人的素材包含三种不同的图片,分别为e1.png、e2.png和e3.png。
代码实现
1. 头文件 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();
};
2. 实现文件 Enemy.cpp
#include "Enemy.h"
USING_NS_CC;
Enemy* Enemy::create(float positionY) {
Enemy *e = new Enemy();
e->init(positionY);
e->autorelease();
return e;
}
bool Enemy::init(float positionY) {
// 调用父类的初始化方法
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类:继承自Sprite类,用于表示游戏中的敌人。create方法:静态方法,用于创建Enemy对象,并自动释放内存。init方法:初始化敌人的位置、素材、物理属性和移动动作。rm方法:用于移除敌人精灵,避免内存泄漏。
通过以上代码,我们实现了敌人从屏幕右端移动到左端的效果,并且为敌人设置了物理属性,方便后续进行碰撞检测。