Отображение движущегося объекта в 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
,