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

首先,您应该将您的offsetin更改apply_surface为以下内容:

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

SDL_Rect默认情况下没有将成员设置为的构造函数0,因此您将获得未初始化的内存widthheight.

此外,您应该检查linefollower包含的内容,如果它是有效的SDL_Surface. 删除文件读取代码并手动控制 aLinefollower将使您可以轻松找到错误的来源。

使用调试器来验证您的xy坐标。

除此之外,您的代码应该可以工作,尽管您的窗口将无响应,因为您没有通过SDL_PollEvent.

于 2013-01-27T17:38:50.657 回答