在OpenGL 2D中为敌人创建spawner



我有一个名为"生存射击者"的项目,我必须为敌人制作一个spawner。我不知道如何让多个敌人从随机位置产生,或者像从一个位置产生一样,但在5秒钟后。

void Tema1::SpawnEnemy(glm::mat3 visMatrix, float deltaTime, float* posX, float* posY, float speed)
{
enemyAngle = atan2(translateX - *posX, translateY - *posY);
*posX += speed * sin(enemyAngle) * deltaTime;
*posY += speed * cos(enemyAngle) * deltaTime;
//Body
modelMatrix = visMatrix;
modelMatrix *= transform2D::Translate(*posX, *posY);
modelMatrix *= transform2D::Scale(1, 1);
modelMatrix *= transform2D::Rotate(enemyAngle);
modelMatrix *= transform2D::Translate(-50, -50);
RenderMesh2D(meshes["border"], shaders["VertexColor"], modelMatrix);
//Eye1
modelMatrix = visMatrix;
modelMatrix *= transform2D::Translate(*posX, *posY);
modelMatrix *= transform2D::Scale(0.25f, 0.25f);
modelMatrix *= transform2D::Rotate(enemyAngle);
modelMatrix *= transform2D::Translate(150, 200);
modelMatrix *= transform2D::Rotate(0);
modelMatrix *= transform2D::Translate(-50, -50);
RenderMesh2D(meshes["square2"], shaders["VertexColor"], modelMatrix);
//Eye2
modelMatrix = visMatrix;
modelMatrix *= transform2D::Translate(*posX, *posY);
modelMatrix *= transform2D::Scale(0.25f, 0.25f);
modelMatrix *= transform2D::Rotate(enemyAngle);
modelMatrix *= transform2D::Translate(-150, 200);
modelMatrix *= transform2D::Rotate(0);
modelMatrix *= transform2D::Translate(-50, -50);
RenderMesh2D(meshes["square2"], shaders["VertexColor"], modelMatrix);
}

这是我想画一个新敌人时调用的方法,我在Update方法中调用它。

问题是,在一段时间后,我如何在不摧毁场景中现有敌人的情况下绘制新敌人?

您需要明确表示游戏状态中的敌人:

struct Enemy {
glm::vec2 pos;
glm::vec2 speed;
...
void update(float deltaTime); // Update position and/or speed
void draw(); // Actually draw
};
std::vector<Enemy> enemies;

生成敌人只是创建一个新的Enemy对象并将其添加到向量中。摧毁敌人就是从矢量中移除一个Enemy对象。不过,要注意从正在迭代的向量中删除项目的常见问题。

您的游戏循环应该首先对所有对象调用update(deltaTime),然后对它们调用draw()

首先,您需要选择一种存储敌人的方法。由于您正在使用C++,我建议您为玩家、项目、实体和将要渲染的任何其他对象定义一个基类entity。它将定义一个函数:update(float delta),其中delta是我们渲染前一帧所花费的时间。之后,您可以创建一个继承entity的类movableEntity,该类可以移动(可由玩家或AI控制(。该类将定义几个函数:jumpmoveBackmoveForwardattack等。它还将定义两个字段:float xfloat y。这实际上取决于你的敌人能做什么。现在,我们为我们的敌人定义了一个类,应该称为enemyEntity,它将继承movableEntity

现在,您需要一个世界上所有实体的列表。您将通过它进行迭代,并对其中的每一个调用render(delta)。对于敌人,你应该实现一个AI,它使用控制器来控制敌人(建议controllableEntity类定义移动功能,以便它们有某种冷却时间(。它应该包含在敌人的更新功能中。最好,你可以写下敌人的AI,这样你就可以指定一个目标。

下面是一个从侧面观看的2D游戏的敌人AI示例(就像大多数平台玩家一样(:

void update(float delta) {
float distanceX = x - target->x;
if (distanceX > 1) {
moveLeft();
}
else if (distanceX < -1) {
moveRight();
}
else {
attack();
}
}

当然,这是一个非常基本的人工智能,它不考虑途中的任何障碍,但movableEntity类确保玩家可以尽实体所能。如果你需要任何帮助,写在评论

最新更新