#c #sdl
#c #sdl
Вопрос:
Я пишу игру в понг на OpenGL и SDL. У меня есть небольшие знания о том, как работает SDL_GetTicks(), но я изо всех сил пытаюсь придумать способ реализовать, как заставить мой шар двигаться, например, каждые 1000 миллисекунд, будучи новичком.
Короткие примеры, объяснения, помощь, все, что угодно, было бы очень оценено.
Комментарии:
1. Вы хотите, чтобы он перемещался на одну ступеньку каждые 1000 мс или перемещался куда-то со скоростью X единиц в секунду?
Ответ №1:
Я решил это, создав свой собственный класс Timer. Технически, что вы делаете, так это то, что в конструкторе вы присваиваете начальное значение в миллисекундах с помощью GetTicks()
Timer::Timer(uint32_t ToWait, void (*call_back)(void*), void* context) : Callback(call_back), Context(context), Running(true), ToWait_private(ToWait)
{
StartTicks = SDL_GetTicks();
}
Теперь вы реализуете функцию update (), в которой вы сохраняете текущие тики каждый раз
void Timer::Update()
{
if(!Running)
return;
CurrentTicks = SDL_GetTicks(); //get the current ticks
if(CurrentTicks - ToWait > StartTicks) //if the ticks are more than how much to wait
{
Running = false;
Callback(Context); //call my callback or whatever
}
}
Это не весь код, но он должен дать вам представление о том, как его реализовать. Поскольку SDL_ticks считает миллисекунды, вы также можете реализовать некоторую функцию преобразования для установки времени в секундах или около того.
В вашем игровом механизме, когда вам снова нужно подождать, создайте экземпляр. Затем вызовите Update() таймера. Хорошо то, что его не нужно вызывать регулярно, так как SDL_getTicks каждый раз выдает вам значение.
Дело в том, чтобы установить обратный вызов для функции, зависит от того, является ли она функцией-членом, тогда вам следует использовать какую-то оболочку. В случае статической функции нечего бояться и просто используйте классический указатель на функцию. Лямбда и многое другое, остановка, таймер паузы также могут быть реализованы, просто проявите творческий подход :]
Чтобы, наконец, ответить на ваш вопрос о ТОМ, КАК заставить мяч двигаться, вы можете вызвать некоторые
Move()
функция как обратный вызов каждый раз, когда истекает время. Однако при перемещении шара вам следует перезапустить таймер. :]
Ответ №2:
Вы, старина, исправили свой временной интервал!
Вам не обязательно использовать RK4, важной частью является «интерполяция между двумя последними состояниями sim-карты».
Комментарии:
1. Выглядит хорошо, я думаю, что смогу с этим поработать, попробую. Спасибо
2. Блестяще, теперь я могу регулировать с помощью SDL_GetTicks ()!