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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
#1

Не исчезают сердца при потере жизни в игре - C++

23.10.2013, 13:08. Просмотров 1416. Ответов 46
Метки нет (Все метки)

В игре есть три жизни, соответственно, отображаются три сердца.
Если жизнь пропадает, то сердце должно пропадать.
Когда жизни заканчиваются, игра заканчивается, все нормально, но вот сердец все время отображается три

Структура со счетчиком жизни и методами для работы с ним
// file1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct DrawScene {    
      DrawScene() : livesOfPlayer(MAXIMUM_LIVES) {}
 
        int getLivesOfPlayer()
        { return livesOfPlayer; }
 
    void livesOfPlayerMinuse()
        { livesOfPlayer--; }
 
    void setLivesOfPlayerToMax()
        { livesOfPlayer = MAXIMUM_LIVES; }
  private:
      int livesOfPlayer;
          enum { MAXIMUM_LIVES = 3 };
}
Проверка количесова жизней и отрисовка сердец
// file1.cpp
C++
1
2
3
4
5
6
7
8
9
10
someFunc1() {
        if (livesOfPlayer == 3)  // Выполняется только это условие
        // Отображение трех сердец
 
    else if (livesOfPlayer == 2)  // До сюда компилятор не доходит
        // Отображение двух сердец
 
    else if (livesOfPlayer == 1)
        // Отображение одного сердца
}
// file2.cpp
C++
1
2
3
4
5
6
7
void someFunc2() {
        if (isButtonPressed == false)  // Если на кнопку не нажали, одна жизнь пропадает
        o_DrawScene.livesOfPlayerMinuse();
 
    if (o_DrawScene.getLivesOfPlayer() <= 0)    // Если жизни закончились
        o_DrawScene.setLivesOfPlayerToMax();
}
Если в констукторе вручную задать 1,2,3 то столько сердец и отображается, тут все нормально
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 13:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не исчезают сердца при потере жизни в игре (C++):

Почему исчезают вкладки при нажатии на Esc? - C++
Здравствуйте! Создаю вкладки с использованием Tab Control'а в VC6. Все нормально, но вот только при нажатии на Esc (или Enter) ...

Зависание формы при потере фокуса при выполнении в ней фоновых операций - Visual Basic .NET
Здравствуйте, коллеги. Возник следующий вопрос, который не получается решить самостоятельно. Информации по нему найти не удалось,...

Ошибка 0x000000101 , при игре 10 минутной игре в Dota 2, CS:GO - BSOD
Имя события проблемы: BlueScreen Версия ОС: 6.1.7600.2.0.0.256.48 Код языка: 1049 Дополнительные сведения об этой проблеме: ...

Переход на страницу при потере фокуса - PHP
Привет всем. Подскажите пожалуйста следующее. Вот код: &lt;form class=&quot;forma&quot; method=&quot;post&quot; action=&quot;xxx&quot;&gt; &lt;select name=&quot;tip&quot;...

Событие при потере фокуса поля - C#
Есть ли такое событие при потере фокуса?? в visual studio s# ultimate 2012 не нашёл такого!

Действие при потере фокуса окна - C++ Builder
Всем привет. Пишу программу-тесты на С++. Для того, чтобы отвечали на вопросы честно, появилась идея сделать следующее: сделать форму...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:16 #16
Цитата Сообщение от dimakozyr Посмотреть сообщение
Вот метод, отвечающий за прорисовку второй сцены с сердцами:
Каким боком здесь участвует someFunc1()?
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
24.10.2013, 13:17  [ТС] #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Каким боком здесь участвует someFunc1()?
В ней идет проверка количества жизней.
Если жизней 3 - отрисовывается 3 сердца, если 2 - то 2 сердца
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:20 #18
Цитата Сообщение от dimakozyr Посмотреть сообщение
В ней идет проверка количества жизней.
Это я вижу. Где она вызывается, по отношению к методу перерисовки и к другим функциям?
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
24.10.2013, 13:29  [ТС] #19
Цитата Сообщение от alsav22 Посмотреть сообщение
Где она вызывается, по отношению к методу перерисовки и к другим функциям?
Это и есть метод перерисовки: fomeFunc1() = drawScene_2():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void GameCicle::callFunctionsForScene_2() const {
    for(;;) {
        // обработка сцены, это fomeFunc1()
        o_DrawScene.drawScene_2(&o_InitSurfaces, &o_LoadImages);
 
        SDL_Flip(o_InitSurfaces.getScreen());
 
        // обработка событий сцены, это fomeFunc2()
        o_SceneElements.scene_2_events(&o_InitSurfaces, &o_LoadImages, &o_DrawScene);
 
        if(o_SceneElements.getIsItTimeForScene_3() == true)
            callFunctionsForScene_3(); // условие выхода из цикла for
    }
}
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:43 #20
Заход в someFunc2() вы проверяли, а заход оттуда в livesOfPlayerMinuse() проверяли?
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
24.10.2013, 13:44  [ТС] #21
Цитата Сообщение от alsav22 Посмотреть сообщение
Заход в someFunc2() вы проверяли, а заход оттуда в livesOfPlayerMinuse() проверяли?
Да, если три раза по бобру не попасть, то появляется экран окончания игры, то есть livesOfPlayerMinuse() отрабатывает три раза
scotty
28 / 28 / 1
Регистрация: 09.09.2012
Сообщений: 131
24.10.2013, 13:50 #22
Ну смотри если игровая логика работает хорошо, значит проблема в отрисовке. Там тебе же писали по этому поводу
Цитата Сообщение от Cra3y Посмотреть сообщение
А очищать место где выводятся "сердечки" пробовали?
Если перерисовка кадра не затрагивает это место, то они могут оставаться.
Может реально глюк в том что ты рисуешь поверх и не очищаешь картинку?
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
24.10.2013, 13:50 #23
каким образом проверяются жизни перед тем как игра проигрывается?(может там каким то боком другая переменная используется?)

я вижу только это - но тут нет геймовера о котором говорится ранее
Цитата Сообщение от dimakozyr Посмотреть сообщение
C++
1
2
if (o_DrawScene.getLivesOfPlayer() <= 0) // Если жизни закончились
o_DrawScene.setLivesOfPlayerToMax();
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:53 #24
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, если три раза по бобру не попасть, то появляется экран окончания игры, то есть livesOfPlayerMinuse() отрабатывает три раза
Сам заход непосредственно проверяли (не по косвенным признакам, типа окончания игры)?
Как тогда у вас это сочетается с окнчанием игры?
C++
1
2
    if (o_DrawScene.getLivesOfPlayer() <= 0)    // Если жизни закончились
        o_DrawScene.setLivesOfPlayerToMax();
При третьем заходе количество жизней опять три.

Добавлено через 1 минуту
Цитата Сообщение от Raali Посмотреть сообщение
каким образом проверяются жизни перед тем как игра проигрывается?
1 пост, второй код.
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
24.10.2013, 13:57 #25
Вообще кинул бы исходники полностью лучше) если не сверхсекретные
alsav22
24.10.2013, 14:02
  #26

Не по теме:

Цитата Сообщение от Raali Посмотреть сообщение
Вообще кинул бы исходники полностью лучше) если не сверхсекретные
Не сверхсекретные. Для меня, Бобры, уже как родные...

dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
24.10.2013, 18:44  [ТС] #27
Цитата Сообщение от scotty Посмотреть сообщение
Может реально глюк в том что ты рисуешь поверх и не очищаешь картинку?
Может быть, но это делается с SDL_Lock/SDL_Unlock, а мне способ заново отрисовывать всю сцену полностью показался проще. Но надо будет посмотреть

Цитата Сообщение от alsav22 Посмотреть сообщение
Как тогда у вас это сочетается с окончанием игры?
Код C++
if (o_DrawScene.getLivesOfPlayer() <= 0) * *// Если жизни закончились
* * * * o_DrawScene.setLivesOfPlayerToMax();
При третьем заходе количество жизней опять три.
Когда жизней ноль, появляется сцена GameOver, после чего вызывается данный метод.
И после нажатия на кнопку новой игры получается, что жизней опять три

Цитата Сообщение от Raali Посмотреть сообщение
Вообще кинул бы исходники полностью лучше) если не сверхсекретные
Не, кидаю самую свежую версию

Цитата Сообщение от alsav22 Посмотреть сообщение
Не сверхсекретные. Для меня, Бобры, уже как родные...
Да уж, тут не поспоришь
Вложения
Тип файла: 7z Beaver.7z (4.59 Мб, 6 просмотров)
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 18:55 #28
На вопрос не ответили:
Цитата Сообщение от alsav22 Посмотреть сообщение
Сам заход непосредственно проверяли (не по косвенным признакам, типа окончания игры)?
Из someFunc2() в livesOfPlayerMinuse().
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
24.10.2013, 19:04  [ТС] #29
Цитата Сообщение от alsav22 Посмотреть сообщение
Сам заход непосредственно проверяли (не по косвенным признакам, типа окончания игры)?
Да, таким образом:
C++
1
2
3
4
inline void livesOfPlayerMinuse() {
    SDL_WM_SetCaption("minuse", NULL);
        livesOfPlayer--;
}
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 19:30 #30
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, таким образом:
Отладчиком пробовали пошагово код пройти?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 19:30
Привет! Вот еще темы с ответами:

Обработка ошибки при потере COM порта - Visual Basic .NET
Добрый день! Пока не приходилось сталкиваться с обработкой ошибок, поэтому обращаюсь к вам. Есть программа, которая работает с COM...

Закрыть форму при потере фокуса - MS Access
Простое применение Private Sub Form_LostFocus() DoCmd.Close acForm, Me.Name End Sub выдаёт ошибку. Использование Deactivate тоже...

Переключение на 3G-модем при потере соединения - CMD/BAT
Доброго времени Помогите решить вопрос. Есть компьютер, который находится в локальной сети(интернет соединение через шлюз). Нужно...

Сменить цвет при потере фокуса - jQuery
При нажатии на инпут1 к границе инпута1 применяется красный цвет,но при нажатии на инпут2, инпут1 так и остается красным. Как сделать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.10.2013, 19:30
Ответ Создать тему
Опции темы

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