0

openGL C++ でボウリング ゲームを作成しています。

これまでに行ったことで、ボウルと 3 つの点 (障害物) を描画しました。

キーを押すとボウルが移動します。

ボウルがそれらの障害物にぶつかると、ドロップする必要があるという錯覚を起こしたい. これを行うには、ボールとそれらの障害物の 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();
}
4

2 に答える 2

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...
}

これらのすべての変更は、circ で行ったように、display 関数で渡します。

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

次に、それらをレンダリングします。

時間ステップのようなステップですべての「変更可能な」変数を変更することをお勧めします。そのようにして、穴の動きはその時間ステップに依存します。

于 2013-06-25T20:00:37.237 に答える