0

ここでこのチュートリアルを達成するために非常に懸命に努力していますが、SDL は使用しません。すなわち。OpenGL のみを使用してグラフィックスを描画し、通常の C++ を使用して衝突をチェックします。

以下は私の試みですが、まだ正しく動作しません。私のロジックがチュートリアルとどこが違うのかわかりませんか?

どこが間違っているかを理解するのを手伝ってください。または、例を OpenGL/C++ に移植するのを手伝ってください。

void move(){
    sprite.x += x_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    { 
        sprite.x -= x_Vel;
    }

    sprite.y += y_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    {
        sprite.y -= y_Vel;
    }
}

void drawSprite (RECT rect) { ... }
void mySKeyboard(int key, int x, int y) { ... }
void main (int argc, char** argv){ ... }
4

2 に答える 2

2

キーが押されているときにのみ表示を更新しています。

その代わりに、 を呼び出す「アイドル」関数を作成しglutPostRedisplay()、 で設定しglutIdleFunc()ます。これにより、レンダリングが連続します。

また、シングルではなくダブル バッファリングを使用することをお勧めします。

move()また、関数はグローバルを更新しますspriteが、それを呼び出すレンダリング関数はsprite値で渡されたため、常に以前の値をレンダリングすることに注意してください。

衝突にどう反応するかはあなた次第です。物事を止めたいだけなら、速度をゼロに設定できます。跳ね返らせたい場合は、これを無効にすることができます。または、スプライトが障害物を通り過ぎても同じ方向に物事を続けたい場合は、そのままにしておくこともできます。

したがって、おそらく次の変更を加えます。

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    drawSprite(sprite);
    drawPlatform(platform1);
    drawPlatform(platform2);
    glutSwapBuffers();
//  glFlush();
}

void mySKeyboard(int key, int x, int y)
{
    switch(key){
    case GLUT_KEY_LEFT:
        x_Vel -= speed;
//      glutPostRedisplay();
        break;
etc...

void update()
{
    glutPostRedisplay();
}

void main (int argc, char** argv)
{
...
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);    // Set display mode.
    glutIdleFunc(update);
于 2013-03-20T20:03:49.837 に答える
1

move 関数では、衝突が発生したときの動きを防ぐために、速度もリセットする必要があります。

void move(){
    sprite.x += x_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    { 
        sprite.x -= x_Vel;
        x_Vel *= 0.9;//Decrease x_Vel
    }

    sprite.y += y_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    {
        sprite.y -= y_Vel;
        y_Vel *= 0.9;//Decrease y_Vel
    }
}

速度を 0 に設定するのではなく、浮動ボックスを避けるために速度を下げるだけであることに気付くでしょう。

于 2013-03-20T19:44:34.920 に答える