关于cocos2dx 3.3的口袋空战3 敌人层

2015年03月17日 17:05 0 点赞 0 评论 更新于 2025-11-21 17:32

在今天的内容中,我们将深入学习Cocos2d-x 3.3框架下口袋空战游戏里敌人层的实现。在这个游戏中,敌人被定义为Sprite类,它们有自己的动作,并且需要进行碰撞检测,因此我们要为其设置物理属性。

敌人移动效果

敌人会不断地从屏幕右端移动到左端,这里我们使用MoveTo动作来实现这一效果。敌人的素材包含三种不同的图片,分别为e1.pnge2.pnge3.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方法:用于移除敌人精灵,避免内存泄漏。

通过以上代码,我们实现了敌人从屏幕右端移动到左端的效果,并且为敌人设置了物理属性,方便后续进行碰撞检测。

作者信息

feifeila

feifeila

共发布了 3994 篇文章