Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.10.2013, 13:08     Не исчезают сердца при потере жизни в игре #1
В игре есть три жизни, соответственно, отображаются три сердца.
Если жизнь пропадает, то сердце должно пропадать.
Когда жизни заканчиваются, игра заканчивается, все нормально, но вот сердец все время отображается три

Структура со счетчиком жизни и методами для работы с ним
// 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 то столько сердец и отображается, тут все нормально
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
23.10.2013, 13:16     Не исчезают сердца при потере жизни в игре #2
возможно ошибка в прорисовке, раз логика игры работает, нужен код рендеринга сердец
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
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); }
};
Прорисовка работает, но только если указывать вручную, какое необходимо число сердец
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
23.10.2013, 15:01     Не исчезают сердца при потере жизни в игре #4
Цитата Сообщение от dimakozyr Посмотреть сообщение
else if (livesOfPlayer == 2) {
поставьте под это условие брейкпойнт, попадет или нет, интересно
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
23.10.2013, 15:24     Не исчезают сердца при потере жизни в игре #5
А очищать место где выводятся "сердечки" пробовали?
Если перерисовка кадра не затрагивает это место, то они могут оставаться.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 15:34     Не исчезают сердца при потере жизни в игре #6
Проверьте, есть ли заход в функцию someFunc2(), когда не нажата кнопка.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.10.2013, 18:15  [ТС]     Не исчезают сердца при потере жизни в игре #7
Цитата Сообщение от Raali Посмотреть сообщение
поставьте под это условие брейкпойнт, попадет или нет, интересно
Не попадает, до этого условия компилятор не доходит

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

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

Добавлено через 1 минуту
Вывод на консоль в ней сделайте и посмотрите.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.10.2013, 18:51  [ТС]     Не исчезают сердца при потере жизни в игре #9
Цитата Сообщение от alsav22 Посмотреть сообщение
колько раз происходит заход в эту функцию, если кнопка не нажата?
Три раза, после чего появляется экран "Game Over"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 19:18     Не исчезают сердца при потере жизни в игре #10
Цитата Сообщение от dimakozyr Посмотреть сообщение
Три раза,
С какой частотой?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.10.2013, 19:34  [ТС]     Не исчезают сердца при потере жизни в игре #11
Цитата Сообщение от alsav22 Посмотреть сообщение
С какой частотой?
Раз в две секунды
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 20:01     Не исчезают сердца при потере жизни в игре #12
Заход в функцию someFunc2() как связан с перерисовкой?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
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 секунды и цикл повторяется. После этого должно уже отображаться меньше сердец
scotty
28 / 28 / 1
Регистрация: 09.09.2012
Сообщений: 131
24.10.2013, 10:43     Не исчезают сердца при потере жизни в игре #14
а пробывал передавать указатель на кол-во жизней???
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
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)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:16     Не исчезают сердца при потере жизни в игре #16
Цитата Сообщение от dimakozyr Посмотреть сообщение
Вот метод, отвечающий за прорисовку второй сцены с сердцами:
Каким боком здесь участвует someFunc1()?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
24.10.2013, 13:17  [ТС]     Не исчезают сердца при потере жизни в игре #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Каким боком здесь участвует someFunc1()?
В ней идет проверка количества жизней.
Если жизней 3 - отрисовывается 3 сердца, если 2 - то 2 сердца
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:20     Не исчезают сердца при потере жизни в игре #18
Цитата Сообщение от dimakozyr Посмотреть сообщение
В ней идет проверка количества жизней.
Это я вижу. Где она вызывается, по отношению к методу перерисовки и к другим функциям?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
24.10.2013, 13:29  [ТС]     Не исчезают сердца при потере жизни в игре #19
Цитата Сообщение от 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
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 13:43     Не исчезают сердца при потере жизни в игре
Еще ссылки по теме:

C++ Программа, суммирующая штрафное время команд при игре в хоккей
Учет очков, набранных каждой командой при игре в баскетбол C++
Падает FPS в игре на Ubuntu при зажатии клавиши C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:43     Не исчезают сердца при потере жизни в игре #20
Заход в someFunc2() вы проверяли, а заход оттуда в livesOfPlayerMinuse() проверяли?
Yandex
Объявления
24.10.2013, 13:43     Не исчезают сердца при потере жизни в игре
Ответ Создать тему
Опции темы

Текущее время: 04:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru