SDL_GetTicks () - основанное движение? - PullRequest
1 голос
/ 13 октября 2011

Я пишу игру в понг в OpenGL и SDL.У меня есть небольшие знания о том, как работает SDL_GetTicks (), но я изо всех сил пытаюсь найти способ реализовать, как заставить мой мяч двигаться, например, каждые 1000 миллисекунд, будучи новичком, которым я являюсь.

Короткие примеры, объяснения, помощь, что-либо вообще будут очень благодарны.

Ответы [ 2 ]

0 голосов
/ 16 мая 2016

Я решил это, создав собственный класс 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()

работает как обратный вызов каждый раз, когда время истекло.Однако при перемещении мяча следует перезапустить таймер.:]

0 голосов
/ 13 октября 2011

Олде Исправь свой временной шаг!

Вам не нужно использовать RK4, "интерполировать между двумя последними состояниями симов" является важной частью.

...