射击子弹opengl
我有下面的代码,它画了一个“航天器”,我可以用我的箭头键控制它顺时针和逆时针旋转。我试图让飞船在按下另一个键(可以是任何键)时发射子弹。我对OpenGL是如此的陌生,以至于我对如何做感到困惑。我试过很多方法,但都不管用。下面是我画太空船的代码,以及我如何控制它。有人能帮我拿子弹吗射击子弹opengl,opengl,graphics,3d,2d,glut,Opengl,Graphics,3d,2d,Glut,我有下面的代码,它画了一个“航天器”,我可以用我的箭头键控制它顺时针和逆时针旋转。我试图让飞船在按下另一个键(可以是任何键)时发射子弹。我对OpenGL是如此的陌生,以至于我对如何做感到困惑。我试过很多方法,但都不管用。下面是我画太空船的代码,以及我如何控制它。有人能帮我拿子弹吗 struct { float rotateSpaceCraft; } scene; void SpaceCraft (){ glBegin(GL_TRIANGLE_FAN); //spec
struct
{
float rotateSpaceCraft;
} scene;
void SpaceCraft (){
glBegin(GL_TRIANGLE_FAN);
//specify the vertices to draw Ship in 2d space
glColor3f(1.0, 0.0, 1.0);
glVertex2f( X_CENTRE + LENGTH * 0, Y_CENTRE + LENGTH * 12);
glColor3f(1.0, 1.0, 0.0);
glVertex2f( X_CENTRE - LENGTH * 8, Y_CENTRE - LENGTH * 8);
glColor3f(0.0, 1.0, 1.0);
glVertex2f( X_CENTRE - LENGTH * 0, Y_CENTRE - LENGTH * 0);
glColor3f(1.0, 0.0, 0.0);
glVertex2f( X_CENTRE + LENGTH * 8, Y_CENTRE - LENGTH * 8);
glEnd();
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT); /* clear window */
glColor3f(1.0, 1.0, 1.0); /* white drawing objects */
/* define object to be drawn as a square polygon */
glPushMatrix();
glRotatef(scene.rotateSpaceCraft, 0.0, 0.0, 1.0);
SpaceCraft();
glPopMatrix();
glutSwapBuffers();
glFlush(); /* execute drawing commands in buffer */
}
static void specialKey(int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_LEFT:
scene.rotateSpaceCraft = fmod(scene.rotateSpaceCraft + 7, 360);
break;
case GLUT_KEY_RIGHT:
scene.rotateSpaceCraft = fmod(scene.rotateSpaceCraft - 7, 360);
break;
default:
break;
}
glutPostRedisplay();
}
int main(int argc, char** argv)
{
/* window management code ... */
/* initialises GLUT and processes any command line arguments */
glutInit(&argc, argv);
/* use single-buffered window and RGBA colour model */
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
/* window width = 400 pixels, height = 400 pixels */
glutInitWindowSize (600, 600);
/* window upper left corner at (100, 100) */
glutInitWindowPosition (250, 50);
/* creates an OpenGL window with command argument in its title bar */
glutCreateWindow ("Asteroids");
glutKeyboardFunc(key);
glutSpecialFunc(specialKey);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
我还建议使用VBO,但是如果您想使用不推荐使用的集合,那么您需要的是渲染一个类似于您的Spaceport()函数的项目符号。子弹需要移动,所以你需要在每一帧平移它的位置
glTranslatef(x, 0.0f, 0.0f);
这将在x轴上平移项目符号x数量。因此,您需要一个每帧递增一定量的变量,并将其传递给新的Bullet()函数。您可以像使用struct一样存储转换X量
{
漂浮旋转太空船;
}场景代码>我也建议使用VBO,但是如果您想使用不推荐使用的集合,那么您需要的是呈现一个类似于您的航天器()函数的项目符号。子弹需要移动,所以你需要在每一帧平移它的位置
glTranslatef(x, 0.0f, 0.0f);
这将在x轴上平移项目符号x数量。因此,您需要一个每帧递增一定量的变量,并将其传递给新的Bullet()函数。您可以像使用struct一样存储转换X量
{
漂浮旋转太空船;
}场景代码>一步一步地,您可以这样做:
- 创建一个保持宇宙飞船旋转的宇宙飞船对象
- 创建一个bullet对象(struct或class),该对象包含bullet的向量、开始位置(以及发射bullet的时间,稍后您将需要它)
- 创建一个场景对象,其中包含已发射的所有子弹和宇宙飞船的列表
- 从Windows或您正在使用的任何其他平台捕获关键事件
- 发射子弹时,使用宇宙飞船的旋转和位置来确定新子弹的位置及其矢量
结构的一些伪代码:
struct Bullet {
Vector3 Position;
Vector3 Rotation;
}
struct {
struct {
Vector3 Position;
Vector3 Rotation;
} Ship;
Vector<Bullet*> Bullets;
} Scene;
一步一步地,你可以这样做:
- 创建一个保持宇宙飞船旋转的宇宙飞船对象
- 创建一个bullet对象(struct或class),该对象包含bullet的向量、开始位置(以及发射bullet的时间,稍后您将需要它)
- 创建一个场景对象,其中包含已发射的所有子弹和宇宙飞船的列表
- 从Windows或您正在使用的任何其他平台捕获关键事件
- 发射子弹时,使用宇宙飞船的旋转和位置来确定新子弹的位置及其矢量
结构的一些伪代码:
struct Bullet {
Vector3 Position;
Vector3 Rotation;
}
struct {
struct {
Vector3 Position;
Vector3 Rotation;
} Ship;
Vector<Bullet*> Bullets;
} Scene;
另外:您应该避免使用glVertex或glColor技术,它们很旧,应该使用VertexBuffers、顶点数组或至少在开始时使用显示列表来替换它们。@FelixK。感谢您提供的信息:)Felix提出了一个很好的观点,但没有解释:glVertex技术之所以不受欢迎,不仅仅是因为它不受欢迎,而是因为当您的几何体上升到每个场景10k~100k三角形时,它会变得非常非常慢。顶点缓冲区对象简单、舒适、快速!另外:您应该避免使用glVertex或glColor技术,它们很旧,应该使用VertexBuffers、顶点数组或至少在开始时使用显示列表来替换它们。@FelixK。感谢您提供的信息:)Felix提出了一个很好的观点,但没有解释:glVertex技术之所以不受欢迎,不仅仅是因为它不受欢迎,而是因为当您的几何体上升到每个场景10k~100k三角形时,它会变得非常非常慢。顶点缓冲区对象简单、舒适、快速!它告诉我向量3是未定义的,我如何定义它向量3是一个包含x,y和z的向量。所以它是:struct Vector3{float x;float y;float z;}
就是这个向量;与本标准相同:矢量项目符号;没有向量是C++类。在开始使用OpenGL之前,也许您应该学习更多的基础知识(尤其是3D和语言)。Vector3是一个自定义结构,允许您将3个浮点数单位(位置)存储到一个简单对象中,以便更好地处理。请将其写入我的代码中,看看它是否有效,因为我快疯了,我必须在周一之前完成它。请告诉我Vector3未定义。我如何定义它Vector3是一个包含x、y和z的向量。所以它是:struct Vector3{float x;float y;float z;}
就是这个向量;与本标准相同:矢量项目符号;没有向量是C++类。在开始使用OpenGL之前,也许您应该学习更多的基础知识(尤其是3D和语言)。Vector3是一个自定义结构,允许您将3个浮点数单位(位置)存储到一个简单的对象中,以便更好地处理。请将其写入我的代码中,看看它是否有效,因为我快疯了,我必须在星期一之前完成