SFML c ++ 如何在包含文件中的游戏中发生事件时为具有铃声功能的游戏创建声音 class?
SFML c ++ How to create a sound class for my game with ringtone functions when events occur in my game inside on include file?
在我的示例中,我只能通过在主函数中设置所有内容来使其工作令人困惑 strange.I 希望知道是否可能创建一个新的 class 来组织新的 [=18] 中的所有函数=] gamesound 合一包括 file.if 可能的帮助
正在处理 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;
}
}
我给你编码了一个"proof of concept",你应该能够在它的基础上构建你需要的所有声音。
首先我们将创建一个 header 文件:
#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();
}
关于如何用它自己的 header 构建一个 class 有很多微妙之处,我不会对你说“101 class”,但要知道:
- Header 文件 (.h) 包含 "definitions",我的意思是 class 声明、原型等
- 实施文件 (.cpp) 包含与您放入 header 文件的 definitions/prototypes/etc 一起使用的代码。
现在,您可以将此行添加到您的 main.cpp:
#include "SoundManager.h" //or whatever you named it
现在,在 main.cpp
中,您过去常常声明一堆声音,现在您可以改为声明 SoundManager 的一个实例 class:
SoundManager gameSounds;
当您这样做时,计算机会创建我们刚刚编写的 class 的实例。然后,它运行构造函数,这是一个初始化 object 的函数。如果你阅读这个构造函数,你会看到我们设置了声音以便稍后播放。 object 会跟踪他自己的东西,所以我们不必加载已经加载的东西。
此外,我是那种喜欢跟踪我程序中的错误的人,所以我 ninja-ed 一行所以当你的声音没有正确加载时它会在你的控制台中这样说。
这就是说,现在在你的 main()
循环中,只要你想播放声音,你就可以
gameSounds.Fire();
然后会播放相关的声音。玩得开心!
(我已经有一段时间没有用 cpp 编写代码了,所以如果比我年轻的人发现了一些错误,请告诉我,以便我可以将它们编辑出来以供后代使用。)
在我的示例中,我只能通过在主函数中设置所有内容来使其工作令人困惑 strange.I 希望知道是否可能创建一个新的 class 来组织新的 [=18] 中的所有函数=] gamesound 合一包括 file.if 可能的帮助
正在处理 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;
}
}
我给你编码了一个"proof of concept",你应该能够在它的基础上构建你需要的所有声音。
首先我们将创建一个 header 文件:
#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();
}
关于如何用它自己的 header 构建一个 class 有很多微妙之处,我不会对你说“101 class”,但要知道:
- Header 文件 (.h) 包含 "definitions",我的意思是 class 声明、原型等
- 实施文件 (.cpp) 包含与您放入 header 文件的 definitions/prototypes/etc 一起使用的代码。
现在,您可以将此行添加到您的 main.cpp:
#include "SoundManager.h" //or whatever you named it
现在,在 main.cpp
中,您过去常常声明一堆声音,现在您可以改为声明 SoundManager 的一个实例 class:
SoundManager gameSounds;
当您这样做时,计算机会创建我们刚刚编写的 class 的实例。然后,它运行构造函数,这是一个初始化 object 的函数。如果你阅读这个构造函数,你会看到我们设置了声音以便稍后播放。 object 会跟踪他自己的东西,所以我们不必加载已经加载的东西。
此外,我是那种喜欢跟踪我程序中的错误的人,所以我 ninja-ed 一行所以当你的声音没有正确加载时它会在你的控制台中这样说。
这就是说,现在在你的 main()
循环中,只要你想播放声音,你就可以
gameSounds.Fire();
然后会播放相关的声音。玩得开心!
(我已经有一段时间没有用 cpp 编写代码了,所以如果比我年轻的人发现了一些错误,请告诉我,以便我可以将它们编辑出来以供后代使用。)