我正在尝试游戏编程,我正在寻找有关我的c ++ iphone opengl代码的一些反馈。我将展示适合我的代码,并讨论我想如何改变它。我正在尝试做的是使用oop为子弹渲染我的所有英雄子弹用一个绘制调用。下面使用了一个绘制调用,但是没有子弹用于子弹。
这是我的渲染引擎定义:
class RenderingEngine {
public:
void Initialize(int width, int height);
void Render();
void UpdateAnimation(float timeStep);
void OnFingerDown(ivec2 location);
private:
std::vector<Vertex> vertices;
};
以下是渲染引擎方法:
void RenderingEngine::Initialize(int width, int height) {
...
glViewport(0, 0, 320, 480);
glMatrixMode(GL_PROJECTION);
const float maxX = 2;
const float maxY = 3;
glOrthof(-maxX, +maxX, -maxY, +maxY, -1, 1);
glMatrixMode(GL_MODELVIEW);
}
//here you can see the single draw call
void RenderingEngine::Render() {
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, m_texture);
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].Position.x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].TexCoord.x);
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
/*since all the vertices are only for bullets at this
point, all we need to do is move each vertex up by the
same amount*/
void RenderingEngine::UpdateAnimation(float timeStep) {
for (int i = 0; i < vertices.size(); ++i) {
vertices[i].Position.y += timeStep*4.4f;
}
}
/*I'm using GL_TRIANGLES, so when the user fingers
down I am pushing two triangles(six vertices) onto
the vertices vector. This only happens when the user
taps on the bottom 60 pixels of the screen.*/
void RenderingEngine::OnFingerDown(ivec2 location) {
if (location.y >= 420) {
vertices.push_back(Vertex(vec2(location.x*0.0125f - 2.0f - 32*0.0125f,
-2.4f + 32*0.0125f), vec2(0, 1)));
vertices.push_back(Vertex(vec2(location.x*0.0125f - 2.0f - 32*0.0125f,
-2.4f - 32*0.0125f), vec2(0, 0)));
vertices.push_back(Vertex(vec2(location.x*0.0125f - 2.0f + 32*0.0125f,
-2.4f + 32*0.0125f), vec2(1, 1)));
vertices.push_back(Vertex(vec2(location.x*0.0125f - 2.0f - 32*0.0125f,
-2.4f - 32*0.0125f), vec2(0, 0)));
vertices.push_back(Vertex(vec2(location.x*0.0125f - 2.0f + 32*0.0125f,
-2.4f + 32*0.0125f), vec2(1, 1)));
vertices.push_back(Vertex(vec2(location.x*0.0125f - 2.0f + 32*0.0125f,
-2.4f - 32*0.0125f), vec2(1, 0)));
}
}
Vertex看起来像这样:
struct Vertex {
Vertex() {}
Vertex(vec2 position, vec2 texCoord) : Position(position), TexCoord(texCoord) {}
vec2 Position;
vec2 TexCoord;
};
这是简化的ivec2和vec2:
template <typename T>
struct Vector2 {
Vector2() {}
Vector2(T x, T y) : x(x), y(y) {}
}
typedef Vector2<int> ivec2;
typedef Vector2<float> vec2;
所以以上所有这些对我来说都是有效的,当用户点击屏幕底部时,我会从屏幕底部向顶部拍摄子弹。我想要做的是将它添加到渲染引擎:
std::vector<HeroBullet> heroBullets;
然后我想将更新动画方法更改为:
void RenderingEngine1::UpdateAnimation(float timeStep) {
for (int i = 0; i < heroBullets.size(); ++i) {
heroBullets[i].UpdateAnimation(timeStep);
}
}
我认为这是一个好主意,因为我不希望在这个单一的UpdateAnimation()方法中更新和管理所有原始顶点数据。但是我希望这个UpdateAnimation()方法在我的每个对象上调用UpdateAnimation()(现在它只是英雄子弹,但将来它将是敌人,敌人子弹等等。)
所以我的主要问题是我应该如何实例化我的HeroBullet对象,以便这些实例能够访问和修改渲染引擎顶点向量中的顶点数据?
而且,我是这样做的吗?这似乎是游戏需要的常见设置。
答案 0 :(得分:0)
看起来没问题,我个人会为所有这些硬编码的浮点数添加一些变量,以便在以后更清晰的代码和更容易调整(如果您的目标是不同的显示尺寸等,那么就可以进行缩放)。
至于更新,据我所知,你可以通过与原始数据分开执行所有操作来增加额外的开销,但是这可能是不可避免的,在这种情况下,您可以将子项子类化为子类的各个子类实现各种差异,所有差异都继承了公共draw() - 函数或覆盖getVertices() - 函数(可能还有getTexVertices())以允许不同的实现。 (这意味着在各自的子类中有各种顶点而不是渲染引擎,无论如何,如果他们对它们进行独立更新,恕我直言会更清洁。)