射击子弹opengl

射击子弹opengl,opengl,graphics,3d,2d,glut,Opengl,Graphics,3d,2d,Glut,我有下面的代码,它画了一个“航天器”,我可以用我的箭头键控制它顺时针和逆时针旋转。我试图让飞船在按下另一个键(可以是任何键)时发射子弹。我对OpenGL是如此的陌生,以至于我对如何做感到困惑。我试过很多方法,但都不管用。下面是我画太空船的代码,以及我如何控制它。有人能帮我拿子弹吗 struct { float rotateSpaceCraft; } scene; void SpaceCraft (){ glBegin(GL_TRIANGLE_FAN); //spec

我有下面的代码,它画了一个“航天器”,我可以用我的箭头键控制它顺时针和逆时针旋转。我试图让飞船在按下另一个键(可以是任何键)时发射子弹。我对OpenGL是如此的陌生,以至于我对如何做感到困惑。我试过很多方法,但都不管用。下面是我画太空船的代码,以及我如何控制它。有人能帮我拿子弹吗

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个浮点数单位(位置)存储到一个简单的对象中,以便更好地处理。请将其写入我的代码中,看看它是否有效,因为我快疯了,我必须在星期一之前完成