стрельба пулями opengl - PullRequest
1 голос
/ 05 ноября 2011

У меня есть следующий код, который рисует мне «космический корабль», которым я могу управлять с помощью клавиш со стрелками для вращения по часовой стрелке и против часовой стрелки. Я пытаюсь заставить космический корабль стрелять пулями при нажатии другой клавиши (это может быть любая клавиша). Я настолько новичок в 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;
}

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Шаг за шагом вы можете сделать это так:

  • Создание объекта космического корабля, который содержит вращение космического корабля
  • Создание объекта маркера (структура или класс), который содержит вектор маркера, начальную позицию (и время, когда пуля была запущена, вам понадобится позже) * Создание объекта сцены, который содержит список всех выпущенных пуль и космического корабля
  • Catch Key Events из Windows или любой другой платформы, которую вы используете
  • Когда пуля будет выпущена, используйте вращение и положение вашего космического корабля, чтобы определить положение новой пули и вектор ее.

Псевдокод для структуры:

struct Bullet {
    Vector3 Position;
    Vector3 Rotation;
}
struct {
    struct { 
        Vector3 Position;
        Vector3 Rotation;
    } Ship;
    Vector<Bullet*> Bullets;
} Scene;

....:

void Update(void) {
    if (Key.IsPressed(Space)) {
        CreateNewBullet();
    }
}

void UpdateBullets(void) {
    for (Bullet bullet in Scene.Bullets)
    {
        // Delete bullets here if not longer used
        // and move all others
    }
}
void Draw(void) {
    // Draw spaceship here
    ....
    // Draw bullets
    for (Bullet bullet in Scene.Bullets) {
        DrawBullet(bullet);
    }
}
0 голосов
/ 05 ноября 2011

Я также рекомендую использовать VBO, но если вы хотите сделать это с устаревшим набором, то вам нужно визуализировать пулю, аналогичную вашей функции SpaceCraft (). Пуля должна будет путешествовать, поэтому вам нужно будет переводить ее положение в каждом кадре.

glTranslatef(x, 0.0f, 0.0f);

Это переведет количество маркеров х на оси х. Поэтому вам понадобится переменная, которая увеличивает определенную величину на кадр и передает ее в новую функцию Bullet (). Вы можете сохранить сумму перевода X так же, как вы сделали с struct { float rotateSpaceCraft; } scene;

...