Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560

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

23.10.2013, 13:08. Показов 3916. Ответов 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 то столько сердец и отображается, тут все нормально
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.10.2013, 13:08
Ответы с готовыми решениями:

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

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

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

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

я вижу только это - но тут нет геймовера о котором говорится ранее
Цитата Сообщение от dimakozyr Посмотреть сообщение
C++
1
2
if (o_DrawScene.getLivesOfPlayer() <= 0) // Если жизни закончились
o_DrawScene.setLivesOfPlayerToMax();
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:53
Цитата Сообщение от 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
Вообще кинул бы исходники полностью лучше) если не сверхсекретные
1
24.10.2013, 14:02

Не по теме:

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

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

Не по теме:

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

0
24.10.2013, 21:11

Не по теме:

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

Не по теме:

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

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

0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2551 / 2065 / 971
Регистрация: 09.10.2013
Сообщений: 4,867
Записей в блоге: 4
24.10.2013, 21:37

Не по теме:

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


под Ubuntu amd64 в цикл обработки кнопок совсем не попадает, совершенно нет реакции на клаву/мышку
Меню оно вообще не показывает(вернее показывает, но сразу начинается игра, задержка 0 сек)
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 22:25
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
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
25.10.2013, 00:52  [ТС]
Цитата Сообщение от 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
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2551 / 2065 / 971
Регистрация: 09.10.2013
Сообщений: 4,867
Записей в блоге: 4
25.10.2013, 01:02
Дело в привычке...
Я бы использовал массивы и циклы вместо кучи if и switch
но я нуб в программировании...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2013, 01:02

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Введение В современном почвоведении особую актуальность приобретает создание комплексных математических моделей, способных отразить всю. . .
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru