在 OpenGL 2D 中为敌人制作生成器
Posted
技术标签:
【中文标题】在 OpenGL 2D 中为敌人制作生成器【英文标题】:Make a spawner for enemies in OpenGL 2D 【发布时间】:2021-11-15 11:24:09 【问题描述】:我有一个名为 Survival Shooter 的项目,我必须在其中为敌人制作生成器。 我不知道如何让多个敌人从随机位置产生或从一个位置产生,但例如在 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方法中调用它。
问题是,我如何在一段时间后绘制一个新的敌人而不摧毁我在场景中的当前敌人?
【问题讨论】:
【参考方案1】:您需要在游戏状态中明确表示敌人:
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()
。
【讨论】:
【参考方案2】:首先,您需要选择一种存储敌人的方法。由于您在C++
工作,我建议您为播放器、项目、实体和任何其他将被渲染的东西定义一个基类entity
。它将定义一个函数:update(float delta)
,其中 delta 是我们渲染前一帧所花费的时间。之后,您可以创建一个类movableEntity
,继承entity
,可以移动(可由玩家或人工智能控制)。该类将定义一些函数:jump
、moveBack
、moveForward
、attack
等......它还将定义两个字段:float x
和 float 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();
当然,这是一个非常基本的 AI,它不会考虑任何障碍物,但 movableEntity
类确保玩家可以做实体可以做的事情。如果您需要任何帮助,请写在 cmets
【讨论】:
以上是关于在 OpenGL 2D 中为敌人制作生成器的主要内容,如果未能解决你的问题,请参考以下文章