Форум программистов, компьютерный форум CyberForum.ru

Неправильно работает таймер SDL_AddTimer - C++

Восстановить пароль Регистрация
 
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
28.10.2013, 11:14     Неправильно работает таймер SDL_AddTimer #1
Бобры появляются каждые 2 секунды.
Через 6 секунд срабатывает таймер и они появляются в 2 раза быстрее.
Если все жизни вышли, таймер должен удаляться, а время отображения становиться опять 2 секунды.
Но почему-то если сыграть одну игру, проиграть, нажать play, бобры сразу появляются с большой скоростью.

// SceneElements.h
C++
1
2
3
4
class SceneElements {
    double& getTimeToDisplayBeaverInSeconds()
    { return timeToDisplayBeaverInSeconds; } // По умолчанию 2
};
// SceneElements.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Uint32 callback(Uint32 interval, void *param) {
    SceneElements* p = (SceneElements*)param;
 
        // Уменьшение времени отображения бобров в 2 раза
    p -> setTimeToDisplayBeaverInSeconds(
        p -> getTimeToDisplayBeaverInSeconds() /= 2;
    return interval;
}
 
void SceneElements::scene_2_events() {
    // Запуск таймера. 6000 - время (мс), через которое вызовется callback()
    SDL_TimerID timer_id = SDL_AddTimer(6000, callback, this);
 
    // Некоторый код
 
    if ( /* Если жизней ноль */ ) {
    SDL_RemoveTimer(timer_id);  // Удаление таймера
 
        // Время отображения бобров устанавливается в 2 секунды
    timeToDisplayBeaverInSeconds = MAX_TIME_TO_DISPLAY_BEAVER;  
 
        // Количество жизней устанавливаем в максимум
    pDrawScene -> setLivesOfPlayerToMax();
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
28.10.2013, 11:30     Неправильно работает таймер SDL_AddTimer #2
Таймер на время паузы надо останавливать или ввести переменную флаг идет игра или нет
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
28.10.2013, 11:38  [ТС]     Неправильно работает таймер SDL_AddTimer #3
Цитата Сообщение от Cra3y Посмотреть сообщение
Таймер на время паузы надо останавливать или ввести переменную флаг идет игра или нет
Да, но этот баг есть, даже если не использовать паузу
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
28.10.2013, 13:11     Неправильно работает таймер SDL_AddTimer #4
В общем у вас за проход цикла таймер создается минимум три раза, а уничтожается только 1 раз
Надо учитывать что каждый вызов SDL_AddTimer сщздает новый таймер, а не заменяет предыдущий
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
28.10.2013, 13:49     Неправильно работает таймер SDL_AddTimer #5
Набросал класс оболочку для SDL-таймера
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class SDLTimer {
private:
    SDL_TimerID m_id;
public:
    SDLTimer(): m_id(NULL) {}
    bool start(Uint32 interval,
            SDL_NewTimerCallback proc,
            void* param) {
        if(m_id == NULL)
            m_id = SDL_AddTimer(interval, proc, param);
        return m_id!=NULL;
    }
    void stop() {
        if(m_id != NULL)
            SDL_RemoveTimer(m_id);
        m_id = NULL;
    }
    ~SDLTimer() {
        stop();
    }
};
в аттаче изменения с использованием этого класса
changes.7z
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
28.10.2013, 16:14  [ТС]     Неправильно работает таймер SDL_AddTimer #6
Работает, супер, спасибо
Yandex
Объявления
28.10.2013, 16:14     Неправильно работает таймер SDL_AddTimer
Ответ Создать тему
Опции темы

Текущее время: 02:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru