0

glutKeyboardFunc関数パラメーターとして使用される次の関数があります。

void handleKeypress(unsigned char key, //The key that was pressed
                    int x, int y) {    //The current mouse coordinates
    switch (key) {
        case 27: //Escape key
            exit(0); //Exit the program
    }

    if (key == 'a')
    {
        moveCircleLeft(0);
    }
    if (key == 'w')
    {
        moveCircleUp(0);
    }
    if (key == 's')
    {
        moveCircleDown(0);
    }
    if (key == 'd')
    {
        moveCircleRight(0);
    }
}

ここで、関数がmoveCircleLeftどのように記述されているかの例を示します。moveCircle

void moveCircleLeft(int x)
{
    characterX = characterX - 0.1;
    glutPostRedisplay();
    x++;
    if (x < 10)
    {
        glutTimerFunc(10, moveCircleLeft, x);
    }
}

他のmoveCircle関数は同様に機能し、4 つの関数の唯一の違いは、プラスがマイナス 0.1 であるか、または とはcharacterY対照的であるかcharacterXです。

さて、問題は次のとおりです。

すべての方向が正しい方向に動いていますが、キーを押しようとすると、キャラクターの動きに遅延/一時停止があります。したがって、d キー (moveCircleRight) だけを押すと、少し右に移動し、少しの間停止してから、一時停止することなく一定の速度で画面をその方向に移動します。次に、別のキーに変更すると、方向を変更する前に少し一時停止し、その方向に一定の速度で移動します。

これに関する提案をいただければ幸いです。

4

1 に答える 1

1

booleanキーごとに変数を作成します (できれば配列)。次に、KeyDown/KeyUpの代わりに使用しますKeyPress(GLUTはKeyboardUpFuncandKeyboardFuncのようなものだと思いますが、今は思い出せません)。KeyDownで、適切な変数を true に設定し、 onでKeyUp、それを false に設定します。今、あなたはおそらくIdle関数かそのようなものを持っています。ブール変数に基づいて「移動」関数を呼び出します。今は一時停止する必要はありません。ただし、フレーム間の経過時間を追跡し、移動距離を適切にスケーリングする必要がある場合があることに注意してください。

于 2010-06-30T21:18:07.493 に答える