1

SDLプログラムに問題があります。私の目標は、ドットを線に沿って移動させることです。すべての座標をデータファイルに保存しています。そのため、ファイルからそれらを読み取り、正しい位置にドットを表示したかっただけです。ドットクラス(linefollowerという名前)は次のようになります。

class Linefollower
{
private:
    int x, y;
    char orientation;

public:
    //Initializes the variables
    Linefollower();

    void set(int m_x, int m_y, char m_orietnation);

    void show();

    char get_orientation();
};

Linefollower::Linefollower()
{
    x = 0;
    y = 0;
    orientation = 'E';
}

void Linefollower::set(int m_x, int m_y, char m_orientation)
{
    x = m_x;
    y = m_y;
    orientation = m_orientation;
}

void Linefollower::show()
{
    //Show the linefollower
    apply_surface(x, y, linefollower, screen );
}

char Linefollower::get_orientation()
{
    return orientation;
}

apply_surface関数。

void apply_surface( int x, int y, SDL_Surface * source, SDL_Surface* destination)
{
//Temporary rectangle to hold the offsets
SDL_Rect offset;

//Get the offsets
offset.x = x;
offset.y = y;

//Blit the surface
SDL_BlitSurface( source, NULL, destination, &offset);
}

アニメーションを表示するはずのループは次のようになります。

//While the user hasn't quit
    while( quit == false )
    {

        //Apply the surface to the screen
        apply_surface( 0, 0, image, screen );

        fin.read((char*) &my_linefollower, sizeof my_linefollower);
        if(my_linefollower.get_orientation() == 'Q')
            break;


        my_linefollower.show();

        //Upadate the screen
        if( SDL_Flip( screen ) == -1 )
        {
            return 1;
        }

        SDL_Delay(200);

    }

今、私は画面上に動くドットが表示されることを期待していましたが、私が取得したのは、それが真実になるまでの数秒間の背景(画像)だけif(my_linefollower.get_orientation() == 'Q') break;です。私は何を間違えますか?

PS:私はSDLの初心者であり、チュートリアルからほとんどのコードを取得したことに注意する価値があると思います。それを正確に学ぶことは私にとって時間の無駄です。なぜなら、私がすぐにそれを再び使うことはありそうもないからです。

4

1 に答える 1

0

まず、次のようなものにoffset変更する必要があります。apply_surface

SDL_Rect offset = { x, y, 0, 0 };

SDL_Rectには、メンバーをデフォルトで設定するコンストラクターがないため、および0の初期化されていないメモリを取得します。widthheight

また、linefollower有効な場合は、何が含まれているかを確認する必要がありますSDL_Surface。ファイル読み取りコードを削除して手動で制御するLinefollowerと、エラーの原因を簡単に見つけることができます。

デバッガーを使用してxy座標を検証します。

それ以外は、コードは機能するはずですが、イベントをポンピングしていないため、ウィンドウが応答しなくなりますSDL_PollEvent

于 2013-01-27T17:38:50.657 に答える