C++ SFML c++;当我的游戏在include文件中发生事件时,如何使用铃声功能为我的游戏创建声音类?

C++ SFML c++;当我的游戏在include文件中发生事件时,如何使用铃声功能为我的游戏创建声音类?,c++,audio,sfml,C++,Audio,Sfml,在我的例子中,我只能通过设置主函数中的所有内容来实现。我希望知道如果可能的话,创建一个新类来组织新类gamesound中的所有函数。如果可能,请提供帮助 正在处理cpp文件的主要功能,但我希望创建一个包含文件,我认为这样更好 int main() { //all inside main function not good confuse //sound play fire function sf::SoundBuffer fire; fire.load

在我的例子中,我只能通过设置主函数中的所有内容来实现。我希望知道如果可能的话,创建一个新类来组织新类gamesound中的所有函数。如果可能,请提供帮助

正在处理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;
 }

}
intmain()
{
//所有内主要功能不好混淆
//音响放火功能
sf::声音缓冲火灾;
fire.loadFromFile(“sounds/fire.wav”);
sf::声发射;
被解雇的,被解雇的;
//声音击中小行星
sf::声音缓冲区;
ashit.loadFromFile(“sounds/expo_asteroid.wav”);
sf::声音被击中;
hited.setBuffer(Ashit);
//声音死机
sf::声音缓冲器pDead;
pDead.loadFromFile(“sounds/dead_player.wav”);
sf::声音死了;
死了。塞布弗(pDead);
//声推力船
sf:声音缓冲推力;
stress.loadFromFile(“sounds/stress.wav”);
sf::声音推力;
止推轴承(推力);
strust.setVolume(30);
while(app.isOpen())
{
事件;
while(app.pollEvent(事件))
{
if(event.type==event::Closed)
app.close();
如果(event.type==event::KeyPressed)
if(event.key.code==键盘::空格)
{
bullet*b=新的bullet();
b->设置(sBullet,p->x,p->y,p->角度,10);
实体。推回(b);
fired.play();//fire play声音
}
}
如果(键盘::isKeyPressed(键盘::Right))p->角度+=3;
如果(键盘::isKeyPressed(键盘::Left))p->角度-=3;
如果(键盘::isKeyPressed(键盘::Up))p->推力=真;
否则p->推力=假;
用于(自动a:实体)
用于(自动b:实体)
{
如果(a->name==“小行星”&&b->name==“子弹”)
if(isCollide(a,b))
{
hited.play();//hited小行星声音
a->life=false;
生命=虚假;
实体*e=新实体();
e->设置(六分之一,a->x,a->y);
e->name=“爆炸”;
实体。推回(e);
对于(int i=0;iR==15)继续;
实体*e=新小行星();
e->设置(sRock_small,a->x,a->y,rand()%360,15);
实体。推回(e);
}
}
如果(a->name==“player”&&b->name==“asteroid”)
if(isCollide(a,b))
{
dead.play();//播放器声音无效
生命=虚假;
实体*e=新实体();
e->设置(六分位,a->x,a->y);
e->name=“爆炸”;
实体。推回(e);
p->设置(sPlayer,W/2,H/2,0,20);
p->dx=0;p->dy=0;
}
}
如果(p->推力){
p->anim=sPlayer\u go;
strust.play();
}   
否则p->anim=sPlayer;
}
}
我为您编写了一个“概念证明”,您应该能够在它的基础上使用所需的所有声音

首先,我们将创建一个头文件:

#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
现在,您可以在
main.cpp
中声明一组声音,而不是声明SoundManager类的一个实例:

SoundManager gameSounds;
当您这样做时,计算机将创建我们刚刚编写的类的一个实例。然后,它运行构造函数,这是一个初始化对象的函数。如果你阅读这个构造器,你会发现我们设置了声音以便以后可以播放。对象将跟踪其自己的内容,因此我们不必加载已加载的内容

另外,我是那种喜欢跟踪我程序中错误的人,所以我在忍者中添加了一行代码,这样当你的声音无法正常加载时,它会在你的控制台中显示

这就是说,现在在
main()
循环中,只要你想播放一个声音,你就可以去

gameSounds.Fire();
并播放相关的声音。玩得开心


(我已经有一段时间没有在cpp中编码了,所以如果比我更新鲜的人发现了一些错误,请告诉我,以便我可以为后代编辑它们。)

您对以下方面有多熟悉:创建一个类,使用指针,轻量级设计模式?laancelot在SFML中包含其hpp默认值,我希望创建一个.h文件,该文件的类名为gameSounds with public void fire();无效推力();无效死亡();空洞爆炸();我的问题是如何在main.cpp文件中创建和放置main函数()?最好的方法是在类中加载所有这些声音。当您在
main()
中实例化该类时,该类将加载声音并使其可用。如果你愿意,我可以写得更详细一些,但你听起来好像知道我的意思。请告诉我,因为我正在尝试创建void gameSound::fire(){sf::SoundBuffer fire;fire.loadFromFile(“sounds/fire.wav”);sf::声音触发;fired.setBuffer(fire);fired.play();}然后在main()中打开{gameSound gfired;gfired.fire()。但是使用此方法不工作不播放声音您的代码看起来很好,但我在main.cpp未定义对SoundManager::SoundManager()的引用-未定义对SoundManager::Fire()的引用-未定义对SoundManager::Ashit()的引用main.cpp文件中有int main()的任何内容函数?你是如何命名你的新头文件的?你必须包含它,以便主“知道”它。我发现了什么问题,构造函数在SoundManager.cpp中,我从main.cpp中创建了一个cpp,然后这篇文章救了我;)你的代码很好,谢谢你解决了很多问题!太棒了!出于好奇,你使用的是什么IDE?MinGW+visual studio代码(用C++扩展编译器和SnTaleTe)
SoundManager gameSounds;
gameSounds.Fire();