如何在C++中正确组织和实现 SFML 音频
How do I properly organize and implement SFML audio in C++?
对于我的一个高中独立学习项目,我必须使用Visual C++中的SFML制作一个简单的游戏(特别是游戏"Snake"((是的,我是C++和SFML的新手(。我已经编写了游戏的核心和图形,现在我正在研究音频和声音效果。我已经在SFML书中阅读了一些关于音频的内容,但仍然对如何正确地将其实现到我的代码中感到困惑。我知道我必须创建一个sf:Sound和一个sf::SoundBuffer对象,分别使用loadFromFile和openFromFile加载声音和音乐,并使用sound.play((和sound.stop((分别播放和停止。然而,这就是问题所在。我是否在main方法中加载这些对象,是否将它们设置为全局对象以便可以在整个代码中使用,是否加载到发生sfx的函数中,是否创建一个包含所有声音的对象?...通常,如何在代码中正确组织和实现这些音频文件。这是我到目前为止所拥有的:
主要方法
/*Main method*///
int main(){
/*Initialize the objects*/
Snake snake = Snake();
sf::Text textCount;
Apple apple(0, 0);
apple.locateApple();
sf::RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "SFML Application" );
/*Load the audio*/
sf::Music backgroundMusic;
sf::Sound eating;
sf::SoundBuffer sb_eating;
sf::Sound moving;
sf::SoundBuffer sb_moving;
sf::Sound losing;
sf::SoundBuffer sb_losing;
sf::Sound begin;
sf::SoundBuffer sb_begin;
if (!backgroundMusic.openFromFile("backgroundmusic.wav"))
std::cerr << "Error opening "backgroundmusic.wav"" << std::endl;
if (!sb_eating.loadFromFile("eatingsfx.wav"))
std::cerr << "Error opening "eatingsfx.wav"" << std::endl;
if (!sb_moving.loadFromFile("movingsfx.wav"))
std::cerr << "Error opening "movingsfx.wav"" << std::endl;
if (!sb_losing.loadFromFile("losingsfx.wav"))
std::cerr << "Error opening "losingsfx.wav"" << std::endl;
if (!sb_begin.loadFromFile("beginsfx.wav"))
std::cerr << "Error opening "beginsfx.wav"" << std::endl;
eating.setBuffer(sb_eating);
moving.setBuffer(sb_moving);
losing.setBuffer(sb_losing);
begin.setBuffer(sb_begin);
moving.setVolume(50);
backgroundMusic.setLoop(true);
backgroundMusic.play();
/*Load the font*/
sf::Font font;
if (!(font.loadFromFile("arial.ttf")))
std::cout << "Error loading fonts" << std::endl;
/*Create the text*/
textCount.setFont(font);
textCount.setString(std::string("points: ") + std::to_string(points));
textCount.setColor(sf::Color::Red);
textCount.setCharacterSize(20);
textCount.setPosition(windowWidth / 2 - (textCount.getString().getSize()*(textCount.getCharacterSize() / 5)), textCount.getCharacterSize() - 5);
textCount.setStyle(sf::Text::Bold);
window.draw(textCount);
/*Set Framerate fps*/
window.setFramerateLimit(15);
/*MAIN GAME LOOP*/
counterTick = 1;
while (inGame)
{
std::string counter = std::to_string(counterTick);
std::cout << "Tick: " + counter << std::endl;
window.clear(sf::Color::Black);
sf::Event event;
while (window.pollEvent(event)){
if (event.type == sf::Event::Closed)
window.close();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Escape)) break;
/*Call Updates*/
snake.input();
snake.checkReals();
snake.moveUpdate();
moving.play();
/*Call Collisions*/
std::cout << " Outside Collision Loop " << std::endl;
checkApple(snake, apple);
checkBoundary(snake);
/*Call Draw*/
std::vector<sf::RectangleShape> shapearray = snake.draw();
for (int i = shapearray.size() - 1; i >= 0; i--){
window.draw(shapearray[i]);
}
window.draw(textCount);
window.draw(apple.draw());
window.display();
counterTick++;
}
losing.play();
backgroundMusic.stop();
std::system("PAUSE");//bad practice, debuggin purposes
return 0;
}
例如,当蛇与苹果碰撞时,我如何能够玩"吃"sfx?这是我的 checkApple(( 方法:
检查苹果方法
void checkApple(Snake mA, Apple& mB){
if ((mA.x[0] == mB.x()) && (mA.y[0] == mB.y())){
dots += dotInterval;
std::cout << "In Collision Method" << std::endl;
points++;
textCount.setString(std::string("points: ") + std::to_string(dots - 3));
mB.locateApple();
}
}
我也是这些论坛的新手,所以如果有任何问题,请问。
首先,我对C++和SFML相当陌生。我相信有比我得到的更好的解决方案来解决你的问题,但在这里。
我有一个名为loadAudio(std::string source(的方法和一个存储音频的向量。
class Audio {
private:
sf::SoundBuffer buffer;
sf::Sound sound;
std::string _src;
public:
void init(std::string src) { //Initialize audio
_src = src;
buffer.loadFromFile(src);
sound.setBuffer(buffer);
}
void play(){
sound.play(); // Play queued audio
}
void stop(){
sound.stop();
}
//void setVolume(), void setPitch() ....
};
std::vector<Audio*> audio;
void loadAudio(std::vector<std::string> src) {
audio.push_back(new Audio());
audio.back()->init(src[i]);
}
所以基本上在游戏开始时,我宣布的声音是这样的:
loadAudio("sound/foo.wav");
loadAudio("sound/bar.wav");
然后,我可以使用audio[0]->play()
访问存储在矢量中的声音
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- SFML纹理像播放器
- 如何使用AngelScript注册SFML Vector2运算符
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何修复sfml c++代码编译错误
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 无法从 SFML 实现纯虚函数
- 我正试图在我的SFML Platformer中实现双跳,但它并没有按预期的方式工作
- 如何在C++中正确组织和实现 SFML 音频
- 尝试在 OpenGL/SFML 中实现鼠标外观"camera"
- 实现对角线移动时,2个箭头键按下(与SFML)