Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
#1

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

28.10.2013, 11:14. Просмотров 503. Ответов 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();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 11:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неправильно работает таймер SDL_AddTimer (C++):

Проверьте задачку по циклам, неправильно работает. [думаю что неправильно] - C++
Спасибо что решили зайти. Задание выгладит так: http://*******/PW95p А результат выплнения: http://*******/KwhuS #include...

Таймер не работает в Turbo C++ - C++
Реализовал таймер в Visual C++. #include "stdafx.h" #include <iostream.h> #include <conio.h> #include <time.h> #include...

Неправильно работает наследование - C++
1) Программа рисует параллельные линии, отстоящие друг от друга на случайный интервал (см. рисунок в приложении). 2) Каждая линия...

Программа работает неправильно - C++
Написал программу на C++, но она работала не правильно, начал разбираться, понемногу удаляя код нашел проблему. Проблема в строчке №12. ...

Цикло do while неправильно работает - C++
В общем, проблема в том, что с цикла начинает работать непонятно как, и я не понимаю почему. При чём, если в task_1() ответить...

Неправильно работает функция - C++
void FreeTop( Tree *&tree ) { if( tree->d == NULL )delete tree; else FreeTop( tree->d ); } это моя функция освобождения...

5
Max Dark
шКодер самоучка
1850 / 1650 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
28.10.2013, 11:30 #2
Таймер на время паузы надо останавливать или ввести переменную флаг идет игра или нет
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
28.10.2013, 11:38  [ТС] #3
Цитата Сообщение от Cra3y Посмотреть сообщение
Таймер на время паузы надо останавливать или ввести переменную флаг идет игра или нет
Да, но этот баг есть, даже если не использовать паузу
0
Max Dark
шКодер самоучка
1850 / 1650 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
28.10.2013, 13:11 #4
В общем у вас за проход цикла таймер создается минимум три раза, а уничтожается только 1 раз
Надо учитывать что каждый вызов SDL_AddTimer сщздает новый таймер, а не заменяет предыдущий
1
Max Dark
шКодер самоучка
1850 / 1650 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
28.10.2013, 13:49 #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
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
28.10.2013, 16:14  [ТС] #6
Работает, супер, спасибо
0
28.10.2013, 16:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 16:14
Привет! Вот еще темы с ответами:

программа работает неправильно - C++
Дана символьная матрица размера 13 на 18. Найти: номер первой по порядку строки, содержащий наибольшее число цифр; #include...

Прога работает неправильно - C++
Например вводим 123 45 new_str_ed=new_str_cop; ch=getchar();//здесь почему то просит ввести символы if (ch==32)//во входном потоке...

Неправильно работает функция - C++
Проблема заключается в том, что в случае, если пользователь вводит числа от 1 до 9 все работает правильно, а если от 10 и далее, то...

неправильно работает программа на с++. - C++
вычислить произведение и число отрицательных элементов матрицы А,находящихся под главной диагональю. #include <vcl.h> #pragma...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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