我一直在尝试使用 emscripten 和 sdl2 在 C 中创建一个小型 Web 应用程序。我想将 sdl2_mixer 包含到程序中以便播放声音,但控制台一直给我错误:
Mix_Init: no sound/music loaders supported ()
。我能够很好地使用 SDL2 和 SDL2_image,但是一旦我开始导入 SDL2_mixer(甚至不使用它),它就会向我抛出此错误。任何帮助将非常感激。我试图找到使用 emscripten 和 sdl2 的示例和教程,但他们似乎很少使用 sdl2_mixer。
我尝试了很多不同的命令来编译它(例如包括 -sUSE_VORBIS=1 或 -sUSE_OGG=1),但这是我当前正在使用的命令:
emcc source/main.c -o main.html -s USE_SDL=2 -s USE_SDL_IMAGE=2 -s USE_SDL_MIXER=2 -s SDL2_IMAGE_FORMATS=["png"] -s ALLOW_MEMORY_GROWTH=1 --preload-file assets
这是该项目的代码(请注意,我并没有尝试在项目中播放声音。只需包含它即可。):
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <emscripten.h>
#include <stdlib.h>
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
SDL_Rect destinationRect = {100, 100, 0, 0};
void render_loop() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
emscripten_cancel_main_loop();
break;
}
}
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, &destinationRect);
SDL_RenderPresent(renderer);
}
int main() {
SDL_Init(SDL_INIT_VIDEO);
IMG_Init(IMG_INIT_PNG);
window = SDL_CreateWindow("SDL2_image Example",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
800, 600,
0);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Surface *surface = IMG_Load("assets/triangle.png");
if (!surface) {
printf("Failed to load image: %s\n", IMG_GetError());
return 1;
}
destinationRect.w = surface->w;
destinationRect.h = surface->h;
texture = SDL_CreateTextureFromSurface(renderer, surface);
if (!texture) {
printf("Failed to create texture: %s\n", SDL_GetError());
return 1;
}
SDL_FreeSurface(surface);
emscripten_set_main_loop(render_loop, 0, 1);
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
IMG_Quit();
SDL_Quit();
return 0;
}
我能够让它工作。我不得不恢复到旧版本的emsdk(我使用的是3.1.44)。我认为一定存在某种错误。