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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
#1

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

28.10.2013, 11:14. Просмотров 426. Ответов 5
Метки нет (Все метки)

Бобры появляются каждые 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();
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 11:14     Неправильно работает таймер SDL_AddTimer
Посмотрите здесь:

C++ Прога работает неправильно
неправильно работает программа на с++. C++
C++ Неправильно работает функция
C++ Movewindow работает неправильно..
C++ Неправильно работает код
Проверьте задачку по циклам, неправильно работает. [думаю что неправильно] C++
Неправильно работает программа C++
C++ Неправильно работает функция
C++ Неправильно работает функция gets( )
Условие работает неправильно C++
C++ Неправильно работает наследование
C++ Цикло do while неправильно работает

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1548 / 1401 / 501
Регистрация: 09.10.2013
Сообщений: 3,184
Записей в блоге: 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
1548 / 1401 / 501
Регистрация: 09.10.2013
Сообщений: 3,184
Записей в блоге: 8
Завершенные тесты: 2
28.10.2013, 13:11     Неправильно работает таймер SDL_AddTimer #4
В общем у вас за проход цикла таймер создается минимум три раза, а уничтожается только 1 раз
Надо учитывать что каждый вызов SDL_AddTimer сщздает новый таймер, а не заменяет предыдущий
Max Dark
В поиске работы
 Аватар для Max Dark
1548 / 1401 / 501
Регистрация: 09.10.2013
Сообщений: 3,184
Записей в блоге: 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
Ответ Создать тему
Опции темы

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