gpt4 book ai didi

c++ - 帮助理解一些 OpenGL 的东西

转载 作者:行者123 更新时间:2023-11-30 02:11:51 25 4
gpt4 key购买 nike

我正在使用一些代码来创建一个用箭头键移动的三角形。我想创建第二个独立移动的对象。这是我遇到麻烦的地方,我创建了第二个 Actor ,但无法让它移动。代码太多,无法全部发布,所以我只发布一点,看看是否有人可以提供帮助。

ogl_test.cpp

#include "platform.h"
#include "srt/scheduler.h"

#include "model.h"
#include "controller.h"

#include "model_module.h"
#include "graphics_module.h"

class blob : public actor {
public:
blob(float x, float y) : actor(math::vector2f(x, y)) { }

void render() {
transform();

glBegin(GL_TRIANGLES);
glVertex3f(0.25f, 0.0f, -5.0f);
glVertex3f(-.5f, 0.25f, -5.0f);
glVertex3f(-.5f, -0.25f, -5.0f);
glEnd();
end_transform();
}
void update(controller& c, float dt) {
if (c.left_key) {
rho += pi / 9.0f * dt;
c.left_key = false;
}
if (c.right_key) {
rho -= pi / 9.0f * dt;
c.right_key = false;
}
if (c.up_key) {
v += .1f * dt;
c.up_key = false;
}
if (c.down_key) {
v -= .1f * dt;
if (v < 0.0) { v = 0.0; }
c.down_key = false;
}
actor::update(c, dt);
}
};

class enemyOne : public actor {
public:
enemyOne(float x, float y) : actor(math::vector2f(x, y)) { }

void render() {
transform();

glBegin(GL_TRIANGLES);
glVertex3f(0.25f, 0.0f, -5.0f);
glVertex3f(-.5f, 0.25f, -5.0f);
glVertex3f(-.5f, -0.25f, -5.0f);
glEnd();
end_transform();
}
void update(controller& c, float dt) {
if (c.left_key) {
rho += pi / 9.0f * dt;
c.left_key = false;
}
if (c.right_key) {
rho -= pi / 9.0f * dt;
c.right_key = false;
}
if (c.up_key) {
v += .1f * dt;
c.up_key = false;
}
if (c.down_key) {
v -= .1f * dt;
if (v < 0.0) { v = 0.0; }
c.down_key = false;
}
actor::update(c, dt);
}
};

int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
char* lpCmdLine,
int nCmdShow
)
{

model m;
controller control(m);

srt::scheduler scheduler(33);
srt::frame* model_frame = new srt::frame(scheduler.timer(), 0, 1, 2);
srt::frame* render_frame = new srt::frame(scheduler.timer(), 1, 1, 2);
model_frame->add(new model_module(m, control));

render_frame->add(new graphics_module(m));

scheduler.add(model_frame);
scheduler.add(render_frame);

blob* prime = new blob(0.0f, 0.0f);
m.add(prime);
m.set_prime(prime);

enemyOne* primeTwo = new enemyOne(2.0f, 0.0f);
m.add(primeTwo);
m.set_prime(primeTwo);

scheduler.start();
control.start();

return 0;
}

模型.h

#include <vector>
#include "vec.h"

const double pi = 3.14159265358979323;

class controller;

using math::vector2f;

class actor {
public:
vector2f P;
float theta;
float v;
float rho;

actor(const vector2f& init_location) :
P(init_location),
rho(0.0),
v(0.0),
theta(0.0)
{ }
virtual void render() = 0;
virtual void update(controller&, float dt) {
float v1 = v;
float theta1 = theta + rho * dt;
vector2f P1 = P + v1 * vector2f(cos(theta1), sin(theta1));
if (P1.x < -4.5f || P1.x > 4.5f) { P1.x = -P1.x; }
if (P1.y < -4.5f || P1.y > 4.5f) { P1.y = -P1.y; }
v = v1;
theta = theta1;
P = P1;
}

protected:
void transform() {
glPushMatrix();
glTranslatef(P.x, P.y, 0.0f);
glRotatef(theta * 180.0f / pi, 0.0f, 0.0f, 1.0f); //Rotate about the z-axis
}
void end_transform() {
glPopMatrix();
}
};

class model {
private:
typedef std::vector<actor*> actor_vector;
actor_vector actors;
public:
actor* _prime;

model() { }

void add(actor* a) {
actors.push_back(a);
}
void set_prime(actor* a) {
_prime = a;
}
void update(controller& control, float dt) {
for (actor_vector::iterator i = actors.begin(); i != actors.end(); ++i) {
(*i)->update(control, dt);
}
}
void render() {
for (actor_vector::iterator i = actors.begin(); i != actors.end(); ++i) {
(*i)->render();
}
}
};

最佳答案

您的 blob 在第二个 Actor 看到它们之前删除按键:

if (c.left_key) {
rho += pi / 9.0f * dt;
c.left_key = false; // <-- HERE
}

在每一帧之后清除键盘状态不应该是任何单个参与者的关注点, Controller 本身应该这样做。

关于c++ - 帮助理解一些 OpenGL 的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2696012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com