2013-06-23 2 views
0

Я создаю игру в боулинг в openGL C++.Нужна помощь в боулинг игре в OpenGL C++

Что я сделал до сих пор, что я нарисовал миску и три очка (препятствия).

Чаша перемещается при нажатии клавиши.

Я хочу сделать иллюзию, что , когда чаша попадает на эти препятствия, их следует отбросить. Для этого у меня есть код , когда координаты X и Y шара и тех препятствий одинаковы, тогда координаты X и Y препятствия увеличиваются, чтобы сделать иллюзию их падения.

Предложите некоторую логику.

Это мой код: -

#include <GL/glut.h> 
    #include <cmath> 
    #include <stdio.h> 
    float posX = 0.01, posY = -0.1, posZ = 0, 

    bx1 = 0.01, by1 = 0.1, 
    bx2 = 0.06, by2 = 0.1, 
    bx3 = 0.10, by3 = 0.1; 

    GLfloat rotation = 90.0; 
    double x, y, angle; 
    #define PI 3.1415926535898 
    GLint circle_points = 50; 

    void bottle() { 
     glColor3f(0.0, 0.0, 1.0); 
     glPointSize(9.0); 
     glBegin(GL_POINTS); 
     glVertex3f(bx1, by1, 0.0); 
     glEnd(); 

     glBegin(GL_POINTS); 
     glVertex3f(bx2, by2, 0.0); 

     glEnd(); 
     glBegin(GL_POINTS); 
     glVertex3f(bx3, by3, 0.0); 

     glEnd(); 

     glFlush(); 

    } 

    void circ() { 
     glColor3f(0.0, 0.0, 1.0); 
     glBegin(GL_TRIANGLE_FAN); 
     for (int i = 0; i <= 300; i++) { 
      angle = 2 * PI * i/300; 
      x = cos(angle)/20; 
      y = sin(angle)/20; 
      glVertex2d(x, y); 
     } 
     glEnd(); 
    } 

    void display() { 
     glClearColor(1.0, 1.0, 1.0, 0.0); 
     glClear(GL_COLOR_BUFFER_BIT); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluOrtho2D(-1.0, 1.0, -1.0, 1.0); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glPushMatrix(); 
     bottle(); 
     glPopMatrix(); 

     glPushMatrix(); 
     glTranslatef(posX, posY, posZ); 
     circ(); 
     glPopMatrix(); 
    glutSwapBuffers(); 
} 

float move_unit = 0.02f; 
void keyboardown(int key, int x, int y) { 
    switch (key) { 
    case GLUT_KEY_RIGHT: 
     posX += move_unit; 
     break; 
    case GLUT_KEY_LEFT: 
     posX -= move_unit; 
     break; 
    case GLUT_KEY_UP: 
     posY += move_unit; 
     break; 
    case GLUT_KEY_DOWN: 
     posY -= move_unit; 
     break; 
    default: 
     break; 
    } 
    if (posX == bx1 || posX == bx2 ) { 

     bx1 -= 0.02,by1 += 0.06; 
     bx2 = 0.02, 
     by2 += 0.08; 
     bx3 = 0.04, 
     by3 += 0.04; 

    } 

    glutPostRedisplay(); 
} 

int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(600, 500); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("Practice 1"); 
    glutDisplayFunc(display); 
    glutSpecialFunc(keyboardown); 
    glutMainLoop(); 
} 
+1

Вы запрашиваете готовый код для анимации ваших падений, или что? я никогда не искал этого, но я уверен, что есть некоторые базовые физические двигатели, которые можно использовать здесь, поэтому вам не нужно будет кодировать их собственный – Zaiborg

+0

@Zaiborg. Кроме того, было бы хорошо, если бы я мог сделать это автоматически и плавно скользит по препятствиям при нажатии клавиши «вверх». – Umair

ответ

0

вместо вызова функции CIRC() внутри дисплея можно назвать

glutIdleFunc(nameOfYourChoice); 

в основной функции после функции клавиатуры. Так что функция вызывает снова и снова. В приведенной выше функции (nameOfYourChoice) вы можете манипулировать любыми переменными, которые вы хотите для x и y. Таким образом, в этой функции вы можете проверить, произошло ли столкновение между объектами, и если возникли столкновения, вы можете «сбросить» вещи, в этом примере, через x и y в этой функции. В конце этой функции вы должны вызвать

glutPostRedisplay(); 

Теперь, если вы хотите, чтобы получить эти коробки снова вы можете использовать таймеры (также с временным шагом), а затем по истечении определенного периода времени, вы можете поместите эти коробки снова через x и y, очевидно. Для этого вам также понадобятся переменные bool, чтобы узнать, произошло ли столкновение.

Так столкновение происходит:

bool flagBox1 = true; 

времени прошло:

bool flagBox1 = false; 
//code to put back the dropped object 

код в функции (nameOfYourChoice):

if(flagBox1){ 
//proceed to your actions... 
} 

Все эти изменения вы будете передавать их в функции отображения как вы делали для круга с

glTranslatef(box1posX, box1posY, box1posZ); 
glTranslatef(box2posX, box2posY, box2posZ); 
glTranslatef(box3posX, box3posY, box3posZ); 

Затем визуализируйте их.

Хорошей практикой является изменение всех ваших «изменчивых» переменных с шагом, подобным временному шагу. Таким образом, движение отверстий будет зависеть от этого шага.

0

Во-первых, движущиеся объекты в дискретные интервалы (что-то вроде «PosX + = move_unit;») просто не так, как анимация делается в эти дни. Вместо этого вы должны измерить время, прошедшее с момента последнего обновления/фрейма, и переместить объект в соответствии с этим. Поэтому, если вы хотите переместить свой мяч на 50 единиц в секунду, вы должны написать 'posX + = 50.0 * прошедшее время'. Это гарантирует, что движение не будет быстрее или медленнее при изменении fps.

Во-вторых, то, о чем вы спрашиваете, является поворот вектора. Самый общий способ сделать это - создать матрицу поворота и умножить ее на вектор, только ротационную матрицу google. В вашем простом случае должно быть достаточно вычислить координаты полюса с помощью sin() и cos(). Вы также можете использовать Matrix-Stack OpenGL, посмотреть glRotate(), glPushMatrix() и т. Д.

В-третьих, ваш вопрос очень общий, и фрагмент кода не может быть назван фрагментом. Держите ваши вопросы точными и короткие фрагменты.

Смежные вопросы