0

我设法安装了 SDL 并将其集成到我的 Visual Studio 2017 项目 for Windows 10中。

我的主要问题是音频文件的播放。确实,当我输入音频文件的绝对路径时,一切正常。

#include "framework.h"
#include "Pokemon.h"
#include <iostream>
#include <SDL.h>
#include <SDL_mixer.h>

#define WAV_PATH "C:\\Users\\quent\\Documents\\Polytech\\Annee3\\projetPerso\\Sons\\musique.mp3" //WORK TOTALY FINE
#define WAV2_PATH ".\\Resource Files\\musique.mp3" //Mix_LoadMUS(WAV2_PATH) return NULL, so the file is not played

const int WIDTH = 800, HEIGHT = 600;

int main(int argc, char *argv[])
{

    Mix_Music *wave = NULL;
    Mix_Music *wave2 = NULL;

    if (Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096) != 0) {
        std::cout << "Impossible d'ouvrir mixer " << SDL_GetError() << std::endl;
        return 1;
    }

    wave = Mix_LoadMUS(WAV2_PATH);
    wave2 = Mix_LoadMUS(WAV2_PATH);

    if (wave == NULL || wave2 == NULL) {
        std::cout << "Impossible de chargé un fichier .ogg " << SDL_GetError() << std::endl;
        return 2;
    }

    if (Mix_PlayMusic(wave, 1) != 0) {
        std::cout << "Impossible de jouer le fichier " << SDL_GetError() << std::endl;
        return 1;
    }

    SDL_Delay(5000);

    if (Mix_PlayMusic(wave2, 1) != 0) {
        std::cout << "Impossible de jouer le fichier " << SDL_GetError() << std::endl;
        return 1;
    }

    while (Mix_PlayingMusic());

    Mix_FreeMusic(wave);
    Mix_FreeMusic(wave2);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}

当我在“资源文件”文件夹中将文件导入我的项目时,它变得复杂起来。不知道 Visual Studio,我想这是用于您想要使用的外部资源的文件夹(如果我错了,对不起)。

所有声音文件都在资源文件中

导入文件后,我无法弄清楚如何恢复它们的路径以将其提供给将访问要播放的音频文件的 SDL 函数 ( Mix_LoadMUS() )。

所以我想知道如何在 Visual Studio 项目中管理资源。

4

1 回答 1

0

您希望将资源放置在相对于运行时可执行文件的路径已知的位置。那么你需要做的就是;计算出可执行文件的运行时路径(所有操作系统都有办法做到这一点——例如,在 Linux 上;阅读/proc/self/exe符号链接),然后将该路径转换为您的资源的路径。

例如:如果您总是安装程序以便它在some/random/install/location/bin和资源中,那么也进入some/random/install/location/resources. 然后,一旦您获得some/random/install/location/bin/myexecutable了程序的当前运行时路径,您需要做的就是去掉“myexecutable”位并将其替换为“../resources/myresource.file”。

无论您的程序安装在哪里,只要安装目录下的目录结构(相对于您的可执行文件)是固定的(并且您应该能够控制它),这将起作用。不要使用绝对路径——一旦有人将你的程序安装在一个意想不到的位置,它就会中断。使所有内容都与可执行文件的位置相关。

于 2020-04-08T14:58:45.830 回答