Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560

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

23.10.2013, 13:08. Показов 3958. Ответов 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,904
Записей в блоге: 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,904
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru