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

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

23.10.2013, 13:08. Показов 3452. Ответов 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru