Я решил это, создав собственный класс 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()
работает как обратный вызов каждый раз, когда время истекло.Однако при перемещении мяча следует перезапустить таймер.:]