2013-06-23 174 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; 

時間過去了:在(nameOfYourChoice)函數

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

代碼:

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 * passedTime;'。這保證瞭如果fps改變,移動不會更快或更慢。

二,你問的是旋轉一個向量。這樣做的最普遍的方式是創建一個旋轉矩陣並將其與矢量相乘,只需要google旋轉矩陣。在你的簡單情況下,使用sin()和cos()計算極點的座標就足夠了。你也可以使用矩陣堆棧的OpenGL,看看glRotate(),glPushMatrix()等。

第三,你的問題是非常普遍的,代碼片斷不能被稱爲片段。保持您的問題精確,短片段。