Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
1

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

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

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

Структура со счетчиком жизни и методами для работы с ним
// 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 то столько сердец и отображается, тут все нормально
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2013, 13:08
Ответы с готовыми решениями:

Жизни в 2d игре
Всем привет, я новичок в Unity, и столкнулся с такой проблемой. При столкновении с вражеским...

Жизни в 2d игре
Здравствуйте я новичок в unity. вообщем написал я свою 2d игру (точнее пишу). Столкнулся с...

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

Почему не работает? запуск при наведении курсора и остановка при потере фокуса курсором
Почему не работает? &lt;script type=&quot;text/javascript&quot;&gt; window.onload = function(){ function...

46
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
24.10.2013, 13:44  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от alsav22 Посмотреть сообщение
Заход в someFunc2() вы проверяли, а заход оттуда в livesOfPlayerMinuse() проверяли?
Да, если три раза по бобру не попасть, то появляется экран окончания игры, то есть livesOfPlayerMinuse() отрабатывает три раза
0
28 / 28 / 3
Регистрация: 09.09.2012
Сообщений: 131
24.10.2013, 13:50 22
Ну смотри если игровая логика работает хорошо, значит проблема в отрисовке. Там тебе же писали по этому поводу
Цитата Сообщение от Cra3y Посмотреть сообщение
А очищать место где выводятся "сердечки" пробовали?
Если перерисовка кадра не затрагивает это место, то они могут оставаться.
Может реально глюк в том что ты рисуешь поверх и не очищаешь картинку?
1
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
24.10.2013, 13:50 23
каким образом проверяются жизни перед тем как игра проигрывается?(может там каким то боком другая переменная используется?)

я вижу только это - но тут нет геймовера о котором говорится ранее
Цитата Сообщение от dimakozyr Посмотреть сообщение
C++
1
2
if (o_DrawScene.getLivesOfPlayer() <= 0) // Если жизни закончились
o_DrawScene.setLivesOfPlayerToMax();
1
5498 / 4893 / 831
Регистрация: 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 пост, второй код.
1
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
24.10.2013, 13:57 25
Вообще кинул бы исходники полностью лучше) если не сверхсекретные
1
alsav22
24.10.2013, 14:02
  #26

Не по теме:

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

2
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
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 Мб, 8 просмотров)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 18:55 28
На вопрос не ответили:
Цитата Сообщение от alsav22 Посмотреть сообщение
Сам заход непосредственно проверяли (не по косвенным признакам, типа окончания игры)?
Из someFunc2() в livesOfPlayerMinuse().
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
24.10.2013, 19:04  [ТС] 29
Цитата Сообщение от alsav22 Посмотреть сообщение
Сам заход непосредственно проверяли (не по косвенным признакам, типа окончания игры)?
Да, таким образом:
C++
1
2
3
4
inline void livesOfPlayerMinuse() {
    SDL_WM_SetCaption("minuse", NULL);
        livesOfPlayer--;
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 19:30 30
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, таким образом:
Отладчиком пробовали пошагово код пройти?
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
24.10.2013, 19:36  [ТС] 31
Цитата Сообщение от alsav22 Посмотреть сообщение
Отладчиком пробовали пошагово код пройти?
А как это можно сделать?
Если F5 нажать, то появляется игровое окно, нажимаю play и игра работает сама по себе, не знаю, как пошагово пройти
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 19:47 32
Точку останова сделать в нужном месте. После F5, если программа дойдёт до этой точки, будет остановка. Дальше, шаг с обходом (функций и пр.) - F10, шаг с заходом - F11.
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
24.10.2013, 19:51  [ТС] 33
Получилось, в livesOfPlayerMinuse() зашло три раза, а потом отрисовалась сцена game over
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 20:30 34
В перерисовку, после livesOfPlayerMinuse(), заходы были?
1
Max Dark
24.10.2013, 20:50
  #35

Не по теме:

посмотрел исходники...
код ппс.
все мзги сломал

0
alsav22
24.10.2013, 21:11
  #36

Не по теме:

Цитата Сообщение от Cra3y Посмотреть сообщение

Не по теме:

посмотрел исходники...
код ппс.
все мзги сломал

Код не для слабонервных...:)

0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
24.10.2013, 21:37 37

Не по теме:

1й шаблон порван тем, что вместо классов исползованы структуры
2й шаблон порван тем, что вместо флага выхода из цикла использовано exit(1)


под Ubuntu amd64 в цикл обработки кнопок совсем не попадает, совершенно нет реакции на клаву/мышку
Меню оно вообще не показывает(вернее показывает, но сразу начинается игра, задержка 0 сек)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 22:25 38
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (isButtonPressed == false)
        //o_DrawScene.livesOfPlayerMinuse();
        draw ->livesOfPlayerMinuse();
 
if (draw ->getLivesOfPlayer() <= 0 /*o_DrawScene.getLivesOfPlayer() <= 0*/) 
{   
    //SDL_RemoveTimer(timer_id);
    timeToDisplayBeaverInSeconds = MAX_TIME_TO_DISPLAY_BEAVER;  
    draw ->setLivesOfPlayerToMax(); // o_DrawScene.setLivesOfPlayerToMax();
    isItTimeForScene_4 = true;      
    return 0;
}
0
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
25.10.2013, 00:52  [ТС] 39
Цитата Сообщение от Cra3y Посмотреть сообщение
1й шаблон порван тем, что вместо классов исползованы структуры
2й шаблон порван тем, что вместо флага выхода из цикла использовано exit(1)
да уж, нашли к чему придраться..

Добавлено через 6 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
if (isButtonPressed == false)
* * * * //o_DrawScene.livesOfPlayerMinuse();
* * * * draw ->livesOfPlayerMinuse();
if (draw ->getLivesOfPlayer() <= 0 /*o_DrawScene.getLivesOfPlayer() <= 0*/)
{ *
* * //SDL_RemoveTimer(timer_id);
* * timeToDisplayBeaverInSeconds = MAX_TIME_TO_DISPLAY_BEAVER;*
* * draw ->setLivesOfPlayerToMax(); // o_DrawScene.setLivesOfPlayerToMax();
* * isItTimeForScene_4 = true;* * *
* * return 0;
Спасибо, теперь заработало

Цитата Сообщение от Cra3y Посмотреть сообщение
посмотрел исходники...
код ппс.
все мзги сломал
Цитата Сообщение от alsav22 Посмотреть сообщение
Код не для слабонервных...
А что не так с кодом? Не считая двух вышеописанный замечаний.
Правда интересно, просто как по мне - это хороший код, но
может, я не замечаю чего-либо?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
25.10.2013, 01:02 40
Дело в привычке...
Я бы использовал массивы и циклы вместо кучи if и switch
но я нуб в программировании...
0
25.10.2013, 01:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2013, 01:02
Помогаю со студенческими работами здесь

Вычисления при потере фокуса
Как запрограммировать вычисление на потерю фокуса? Когда я нажимаю на закрытие или другие кнопки...

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru