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

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

23.10.2013, 13:08. Показов 3531. Ответов 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
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
23.10.2013, 13:16
возможно ошибка в прорисовке, раз логика игры работает, нужен код рендеринга сердец
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
23.10.2013, 13:59  [ТС]
Цитата Сообщение от Raali Посмотреть сообщение
нужен код рендеринга сердец
// DrawScene.cpp - блиттинг
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void DrawScene::drawScene_2(InitSurfaces *p, LoadImages *pli) const {
if (livesOfPlayer == 3) {
        o_Blitting.blittingImage(
            10, 10, pli->img_heart, p->getScreen());
        o_Blitting.blittingImage(
            60, 10, pli->img_heart, p->getScreen());
        o_Blitting.blittingImage(
            110, 10, pli->img_heart, p->getScreen());
    }
 
    else if (livesOfPlayer == 2) {
        o_Blitting.blittingImage(
            10, 10, pli->img_heart, p->getScreen());
        o_Blitting.blittingImage(
            60, 10, pli->img_heart, p->getScreen());        
    }
 
    else if (livesOfPlayer == 1) {
        o_Blitting.blittingImage(
            10, 10, pli->img_heart, p->getScreen());
    }
}
// GameCicle.cpp - вызов метода drawScene_2
C++
1
2
3
void GameCicle::callFunctionsForScene_2() const {
    o_DrawScene.drawScene_2(&o_InitSurfaces, &o_LoadImages);
}
// Blitting.h
C++
1
2
3
4
5
6
7
8
9
10
struct Blitting {
      inline void blittingImage(int xCoordinate,
                      int yCoordinate,
                      SDL_Surface* source,
                      SDL_Surface* destination) {
        SDL_Rect SDLRect_Blitting;
        SDLRect_Blitting.x = xCoordinate;
        SDLRect_Blitting.y = yCoordinate;
        SDL_BlitSurface(source, NULL, destination, &SDLRect_Blitting); }
};
Прорисовка работает, но только если указывать вручную, какое необходимо число сердец
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
23.10.2013, 15:01
Цитата Сообщение от dimakozyr Посмотреть сообщение
else if (livesOfPlayer == 2) {
поставьте под это условие брейкпойнт, попадет или нет, интересно
1
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
23.10.2013, 15:24
А очищать место где выводятся "сердечки" пробовали?
Если перерисовка кадра не затрагивает это место, то они могут оставаться.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 15:34
Проверьте, есть ли заход в функцию someFunc2(), когда не нажата кнопка.
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
23.10.2013, 18:15  [ТС]
Цитата Сообщение от Raali Посмотреть сообщение
поставьте под это условие брейкпойнт, попадет или нет, интересно
Не попадает, до этого условия компилятор не доходит

Цитата Сообщение от Cra3y Посмотреть сообщение
А очищать место где выводятся "сердечки" пробовали?
Если перерисовка кадра не затрагивает это место, то они могут оставаться.
Каждый ход вся сцена перерисовывается полностью, поэтому, по идее, должно работать

Цитата Сообщение от alsav22 Посмотреть сообщение
Проверьте, есть ли заход в функцию someFunc2(), когда не нажата кнопка.
Есть. Если ничего не нажимать, то данная функция выполняется и отнимается одна жизнь
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 18:40
Цитата Сообщение от dimakozyr Посмотреть сообщение
Есть. Если ничего не нажимать, то данная функция выполняется и отнимается одна жизнь
Сколько раз происходит заход в эту функцию, если кнопка не нажата?

Добавлено через 1 минуту
Вывод на консоль в ней сделайте и посмотрите.
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
23.10.2013, 18:51  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
колько раз происходит заход в эту функцию, если кнопка не нажата?
Три раза, после чего появляется экран "Game Over"
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 19:18
Цитата Сообщение от dimakozyr Посмотреть сообщение
Три раза,
С какой частотой?
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
23.10.2013, 19:34  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
С какой частотой?
Раз в две секунды
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 20:01
Заход в функцию someFunc2() как связан с перерисовкой?
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
24.10.2013, 09:27  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Заход в функцию someFunc2() как связан с перерисовкой?
Вот метод, отвечающий за прорисовку второй сцены с сердцами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void GameCicle::callFunctionsForScene_2() const {
    for(;;) {
                // отрисовка сцены
        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
    }
}
Если на бобра не нажали, то значение жизней уменьшается и вся сцена перерисовывается, затем ожидается 2 секунды и цикл повторяется. После этого должно уже отображаться меньше сердец
0
28 / 28 / 3
Регистрация: 09.09.2012
Сообщений: 131
24.10.2013, 10:43
а пробывал передавать указатель на кол-во жизней???
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
24.10.2013, 11:15  [ТС]
Цитата Сообщение от scotty Посмотреть сообщение
а пробовал передавать указатель на кол-во жизней???
Сейчас попробовал, но немного запутался.
Как правильно инициализировать livesOfPlayer в конструкторе?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct DrawScene {
          // Как правильно инициализировать livesOfPlayer?
          // Сейчас для MAXIMUM_LIVES говорит, что так нельзя инициализировать
      DrawScene() : livesOfPlayer(MAXIMUM_LIVES) {}
 
    inline int* getLivesOfPlayer()
        { return livesOfPlayer; }
 
    inline void livesOfPlayerMinuse()
        { livesOfPlayer--; }
 
    inline void* setLivesOfPlayerToMax()
        { *livesOfPlayer = MAXIMUM_LIVES; }
  private:
      int* livesOfPlayer;
      enum { MAXIMUM_LIVES = 3 };
};
Проверка:
C++
1
if (*livesOfPlayer == 3)
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:16
Цитата Сообщение от dimakozyr Посмотреть сообщение
Вот метод, отвечающий за прорисовку второй сцены с сердцами:
Каким боком здесь участвует someFunc1()?
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
24.10.2013, 13:17  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Каким боком здесь участвует someFunc1()?
В ней идет проверка количества жизней.
Если жизней 3 - отрисовывается 3 сердца, если 2 - то 2 сердца
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:20
Цитата Сообщение от dimakozyr Посмотреть сообщение
В ней идет проверка количества жизней.
Это я вижу. Где она вызывается, по отношению к методу перерисовки и к другим функциям?
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
24.10.2013, 13:29  [ТС]
Цитата Сообщение от 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
    }
}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:43
Заход в someFunc2() вы проверяли, а заход оттуда в livesOfPlayerMinuse() проверяли?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.10.2013, 13:43
Помогаю со студенческими работами здесь

Почему не работает? запуск при наведении курсора и остановка при потере фокуса курсором
Почему не работает? &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; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru