SFML c ++ Как создать звуковой класс для моей игры с функциями рингтона, когда в моей игре происходят события внутри включаемого файла? - PullRequest
1 голос
/ 14 октября 2019

В моем примере я мог только заставить его работать, установив, что все внутри основной функции сбивает с толку странно. Я хотел бы знать, если это возможно, создайте новый класс, чтобы организовать все функции в новом классе игры в одном включаемом файле. Если возможная помощь

Работа над основной функцией в файле cpp, но я хочу создать файл включения, я думаю, что лучше

      int main()
{
    //all inside main function not good confuse
    //sound play fire function
    sf::SoundBuffer fire;
    fire.loadFromFile("sounds/fire.wav");
    sf::Sound fired;
    fired.setBuffer(fire);

    // sound hit asteroid
    sf::SoundBuffer astHit;
    astHit.loadFromFile("sounds/explo_asteroid.wav");
    sf::Sound hited;
    hited.setBuffer(astHit);

    // sound Dead player
    sf::SoundBuffer pDead;
    pDead.loadFromFile("sounds/dead_player.wav");
    sf::Sound dead;
    dead.setBuffer(pDead);

    // sound Thrust Ship
    sf::SoundBuffer thrust;
    thrust.loadFromFile("sounds/thrust.wav");
    sf::Sound sthrust;
    sthrust.setBuffer(thrust);
    sthrust.setVolume(30);

     while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            if (event.type == Event::Closed)
                app.close();

            if (event.type == Event::KeyPressed)
             if (event.key.code == Keyboard::Space)
              {
                bullet *b = new bullet();
                b->settings(sBullet,p->x,p->y,p->angle,10);
                entities.push_back(b);
                fired.play();//fire play Sound
              }
        }

    if (Keyboard::isKeyPressed(Keyboard::Right)) p->angle+=3;
    if (Keyboard::isKeyPressed(Keyboard::Left))  p->angle-=3;
    if (Keyboard::isKeyPressed(Keyboard::Up)) p->thrust=true;
    else p->thrust=false;

    for(auto a:entities)
     for(auto b:entities)
     {
      if (a->name=="asteroid" && b->name=="bullet")
       if ( isCollide(a,b) )
           {
            hited.play();//Hited asteroid Sound
            a->life=false;
            b->life=false;

            Entity *e = new Entity();
            e->settings(sExplosion,a->x,a->y);
            e->name="explosion";
            entities.push_back(e);


            for(int i=0;i<2;i++)
            {
             if (a->R==15) continue;
             Entity *e = new asteroid();
             e->settings(sRock_small,a->x,a->y,rand()%360,15);
             entities.push_back(e);
            }

           }

      if (a->name=="player" && b->name=="asteroid")
       if ( isCollide(a,b) )
           {
            dead.play();//Dead Player Sound
            b->life=false;

            Entity *e = new Entity();
            e->settings(sExplosion_ship,a->x,a->y);
            e->name="explosion";
            entities.push_back(e);

            p->settings(sPlayer,W/2,H/2,0,20);
            p->dx=0; p->dy=0;
           }
     }


    if (p->thrust){   
        p->anim = sPlayer_go;
        sthrust.play();
    }   
    else   p->anim = sPlayer;
 }

}

1 Ответ

1 голос
/ 15 октября 2019

Я закодировал вам «доказательство концепции», которое вы сможете использовать со всеми необходимыми звуками.

Сначала мы создадим заголовочный файл:

#ifndef SOUNDMANAGER
#define SOUNDMANAGER

#include <iostream>
#include <SFML/Audio.hpp>

class SoundManager {
public:
    SoundManager();

    void Fire();
    void AstHit();

private:
    sf::SoundBuffer sb_fire;
    sf::Sound s_fire;
    sf::SoundBuffer sb_astHit;
    sf::Sound s_astHit;
};

#endif

и файл cpp:

#include "SoundManager.h"

using namespace sf;

// Constructor
SoundManager::SoundManager() {
    if (!sb_fire.loadFromFile("sounds/fire.wav")) {
        std::cout << "ERROR: sounds/fire.wav didn't load" << endl;
    } else {
        s_fire.setBuffer(sb_fire);
    }

    if (!sb_astHit.loadFromFile("sounds/explo_asteroid.wav")) {
        std::cout << "ERROR: sounds/explo_asteroid.wav didn't load" << endl;
    } else {
        s_astHit.setBuffer(sb_astHit);
    }
}

//Functions
void SoundManager::Fire() {
    s_fire.play();
}

void SoundManager::AstHit() {
    s_astHit.play();
}

Есть много тонкостей о том, как создать класс с собственным заголовком, и я не собираюсь рассказывать вам весь «101 класс», нознать это:

  • Заголовочные файлы (.h) содержат «определения», под которыми я имею в виду объявления классов, прототипы и т. д.
  • Файлы реализации (.cpp) содержат код, которыйидет с определениями / прототипами / и т.д., которые вы помещаете в файл заголовка.

Теперь вы можете добавить эту строку в ваш main.cpp:

#include "SoundManager.h" //or whatever you named it

Теперь, вmain.cpp, где вы использовали для объявления группы звуков, вы можете вместо этого объявить ОДИН экземпляр класса SoundManager:

SoundManager gameSounds;

Когда вы это сделаете, компьютер создаст экземпляр класса, который мытолько что написано. Затем он запускает конструктор, который является функцией, которая инициализирует объект. Если вы прочитаете этот конструктор, вы увидите, что мы настроили звуки, чтобы они могли воспроизводиться позже. Объект будет отслеживать его собственные вещи, поэтому нам не нужно загружать что-то, что уже загружено.

Кроме того, я из тех парней, которые любят отслеживать ошибки в моих программах, поэтомуЯ добавил строку, чтобы, когда ваши звуки не загружались должным образом, это говорилось в вашей консоли.

Это говорит, что теперь в вашем цикле main(), когда вы хотите воспроизвести звук, вы можете простоперейти

gameSounds.Fire();

и соответствующий звук будет играть. Веселитесь!

(Я давно не кодировал cpp, поэтому, если кто-то более свежий, чем я, обнаружит какую-то ошибку, дайте мне знать, чтобы я мог отредактировать их для потомков.)

...