Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 479
#1

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

23.10.2013, 13:08. Просмотров 1499. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 13:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не исчезают сердца при потере жизни в игре (C++):

Почему исчезают вкладки при нажатии на Esc? - C++
Здравствуйте! Создаю вкладки с использованием Tab Control'а в VC6. Все нормально, но вот только при нажатии на Esc (или Enter) ...

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

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

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

Событие при потере фокуса поля - C#
Есть ли такое событие при потере фокуса?? в visual studio s# ultimate 2012 не нашёл такого!

Действие при потере фокуса окна - C++ Builder
Всем привет. Пишу программу-тесты на С++. Для того, чтобы отвечали на вопросы честно, появилась идея сделать следующее: сделать форму...

46
Raali
639 / 343 / 42
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
23.10.2013, 13:16 #2
возможно ошибка в прорисовке, раз логика игры работает, нужен код рендеринга сердец
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 479
23.10.2013, 13:59  [ТС] #3
Цитата Сообщение от 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
Raali
639 / 343 / 42
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
23.10.2013, 15:01 #4
Цитата Сообщение от dimakozyr Посмотреть сообщение
else if (livesOfPlayer == 2) {
поставьте под это условие брейкпойнт, попадет или нет, интересно
1
Max Dark
шКодер самоучка
1866 / 1666 / 605
Регистрация: 09.10.2013
Сообщений: 3,707
Записей в блоге: 6
Завершенные тесты: 2
23.10.2013, 15:24 #5
А очищать место где выводятся "сердечки" пробовали?
Если перерисовка кадра не затрагивает это место, то они могут оставаться.
1
alsav22
5434 / 4829 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 15:34 #6
Проверьте, есть ли заход в функцию someFunc2(), когда не нажата кнопка.
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 479
23.10.2013, 18:15  [ТС] #7
Цитата Сообщение от Raali Посмотреть сообщение
поставьте под это условие брейкпойнт, попадет или нет, интересно
Не попадает, до этого условия компилятор не доходит

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

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

Добавлено через 1 минуту
Вывод на консоль в ней сделайте и посмотрите.
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 479
23.10.2013, 18:51  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
колько раз происходит заход в эту функцию, если кнопка не нажата?
Три раза, после чего появляется экран "Game Over"
0
alsav22
5434 / 4829 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 19:18 #10
Цитата Сообщение от dimakozyr Посмотреть сообщение
Три раза,
С какой частотой?
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 479
23.10.2013, 19:34  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
С какой частотой?
Раз в две секунды
0
alsav22
5434 / 4829 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 20:01 #12
Заход в функцию someFunc2() как связан с перерисовкой?
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 479
24.10.2013, 09:27  [ТС] #13
Цитата Сообщение от 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
scotty
28 / 28 / 1
Регистрация: 09.09.2012
Сообщений: 131
24.10.2013, 10:43 #14
а пробывал передавать указатель на кол-во жизней???
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 479
24.10.2013, 11:15  [ТС] #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
24.10.2013, 11:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 11:15
Привет! Вот еще темы с ответами:

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

Закрыть форму при потере фокуса - MS Access
Простое применение Private Sub Form_LostFocus() DoCmd.Close acForm, Me.Name End Sub выдаёт ошибку. Использование Deactivate тоже...

Переключение на 3G-модем при потере соединения - CMD/BAT
Доброго времени Помогите решить вопрос. Есть компьютер, который находится в локальной сети(интернет соединение через шлюз). Нужно...

Сменить цвет при потере фокуса - jQuery
При нажатии на инпут1 к границе инпута1 применяется красный цвет,но при нажатии на инпут2, инпут1 так и остается красным. Как сделать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru