Отображение движущегося объекта в SDL

У меня проблема с моей программой 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 и взял большую часть кода из учебника. Узнать его точно было бы пустой тратой времени для меня, так как маловероятно, что я собираюсь использовать его снова в ближайшее время.

1 ответ

Решение

Во-первых, вы должны изменить свой offset в apply_surface что-то вроде этого:

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

SDL_Rect не имеет конструктора, чтобы установить ваши члены 0 по умолчанию, так что вы получите неинициализированную память для вашего width а также height,

Кроме того, вы должны проверить, что linefollower содержит, если это действительно SDL_Surface, Удаление кода чтения файла и ручное управление Linefollower позволит вам легко найти источник ошибки.

Используйте отладчик для проверки вашего x а также y координаты.

Кроме этого, ваш код должен работать, хотя ваше окно не будет отвечать, потому что вы не прокачиваете события через SDL_PollEvent,

Другие вопросы по тегам