戏子难言 2023-10-18 15:50 采纳率: 0%
浏览 10

一写SoundBuffer buffer就会报错?

我用SFML写了一个打砖块的小游戏,在写声音之前一切正常,证明我的配置和语法都没问题,但是写了一个发声模块之后程序不能工作了,我把发声的逻辑一点点删掉,直到SoundBuffer buffer,也就是第一句话,有他就不能编译,没他就可以,怎么回事

img

img

img

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>
#include <SFML/audio.hpp>
#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;
int main()
{
    srand(time(0)); // 使用当前时间作为随机数种子
    double screenWidth = 576 * 1.7, screenHeight = 324 * 1.7;

    RenderWindow app(VideoMode(screenWidth, screenHeight), L"打砖块!"); // 创建窗口
    app.setFramerateLimit(60);

    Texture t1, t2, t3, t4, t5; // 创建纹理对象
    t1.loadFromFile("images/stone.png"); // 加载纹理图片
    t2.loadFromFile("images/city/1.png");//背景
    t3.loadFromFile("images/balls.png");//球
    t4.loadFromFile("images/bat_small.png");//板子
    t5.loadFromFile("images/game over.png");//游戏结束
    Sprite sBackground(t2), sBall(t3), sPaddle(t4), gameOver(t5); // 创建精灵对象,并将纹理应用到精灵上

    sBall.setTextureRect(IntRect(rand()%4*16, 0, 16, 16));
    sBackground.setScale(2.0, 2.0);
    sPaddle.setScale(1.5, 1.5);
    sPaddle.setPosition(screenWidth / 2 - sPaddle.getLocalBounds().width / 2, screenHeight / 10*9 - sPaddle.getLocalBounds().height / 2); // 设置挡板的初始位置

    Sprite block[1000]; // 创建方块精灵对象数组

    int n = 0;
    for (int i = 1; i <= 14; i++) // 创建方块对象,并设置位置
        for (int j = 1; j <= 10; j++)
        {
            block[n].setTexture(t1);
            block[n].setTextureRect(IntRect(0,rand() % 7 * 32,  64, 32));
            block[n].setPosition(i * 64, j * 32);
            n++;
        }

    float dx = 3, dy = 2;
    float x = 300, y = 300;
    bool gameState = true;
    gameOver.setPosition(screenWidth / 2 - gameOver.getLocalBounds().width / 2, screenHeight / 2 - gameOver.getLocalBounds().height / 2);
    
    SoundBuffer buffer;

    while (app.isOpen()) 
    {
        Event e;
        while (app.pollEvent(e)) 
        {
            if (e.type == Event::Closed) 
                app.close();
        }
        if (gameState) {
            
            x += dx; 
            for (int i = 0; i < n; i++) // 检测球与方块的碰撞
                if (FloatRect(x + 3, y + 3, 6, 6).intersects(block[i].getGlobalBounds()))
                {
                    block[i].setPosition(-100, 0);
                    dx = -dx;
                }

            y += dy;
            for (int i = 0; i < n; i++) // 检测球与方块的碰撞
                if (FloatRect(x + 3, y + 3, 6, 6).intersects(block[i].getGlobalBounds()))
                {
                    block[i].setPosition(-100, 0); // 将碰撞的方块移出屏幕
                    dy = -dy; // 球的运动方向取反
                }

            if (x < 0 || x>screenWidth)  dx = -dx; // 球与窗口边界的碰撞检测
            if (y < 0)  dy = -dy;
            if (y > screenHeight) gameState = false;

            //if (Keyboard::isKeyPressed(Keyboard::Right)) sPaddle.move(6, 0); // 键盘输入,控制挡板的移动
            //if (Keyboard::isKeyPressed(Keyboard::Left)) sPaddle.move(-6, 0);
            sPaddle.setPosition(Mouse::getPosition(app).x - sPaddle.getLocalBounds().width / 2, sPaddle.getPosition().y);

            if (sBall.getGlobalBounds().intersects(sPaddle.getGlobalBounds())) dy = -(rand() % 5 + 2); // 球与挡板的碰撞检测
        }
        else {
            if (Keyboard::isKeyPressed(Keyboard::P)) {

                dx = 3, dy = 2;
                x = 300, y = 300;
                sBall.setPosition(x, y); // 设置球的位置
                sBall.setTextureRect(IntRect(rand() % 4 * 16, 0, 16, 16));
                gameState = true;
            }
        }
        sBall.setPosition(x, y); // 设置球的位置

        app.clear(); // 清空窗口
        app.draw(sBackground); // 绘制背景
        app.draw(sBall); // 绘制球
        app.draw(sPaddle); // 绘制挡板
        if (gameState) {
            for (int i = 0; i < n; i++) // 绘制方块
                app.draw(block[i]);
        }
        else
            app.draw(gameOver);
            app.display(); // 显示窗口内容
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-18 21:58
    关注

    【以下回答由 GPT 生成】

    可能的原因是缺少链接到SFML的库文件。当你使用SFML的音频功能时,你需要链接到对应的库文件才能正确编译和运行程序。

    解决方案如下: 1. 首先,确保你已经正确地配置了SFML。这包括将SFML库文件添加到项目中,并在编译器中配置正确的包含目录和库目录。

    1. 确认你已经添加了必要的SFML库文件。对于音频功能,你需要链接到sfml-audio库。你可以在SFML的官方文档或源代码的链接中找到相应的库文件。

    2. 确保你在源代码文件中添加了正确的包含声明。你需要包含SFML的音频头文件,例如"SFML/Audio.hpp"。

    3. 编译和构建你的项目,确保没有任何错误。如果有错误,查看错误信息并解决它们。

    4. 如果上述步骤都正确,但问题仍然存在,那么很可能是因为你没有正确地使用SFML的音频功能。请确保你按照SFML音频模块的使用指南正确地创建和使用音频对象,如SoundBuffer、Sound等。

    如果以上解决方案都不能解决你的问题,那么可能是因为其他原因导致的错误。你可以尝试在SFML的官方论坛或社区中寻求帮助,或者查阅SFML的文档和示例代码来获得更多细节和解决方案。

    希望这些解决方案能够帮助你解决问题。如果有任何进一步的问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月18日