gpt4 book ai didi

c - SDL_Mixer 无法处理部分代码

转载 作者:太空狗 更新时间:2023-10-29 12:27:03 28 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我想在我的游戏中加入声音。这是一个有两个阶段的游戏。角色扮演游戏之一和战斗之一。在角色扮演游戏中,您可以在踩到怪物时发动战斗。在我的代码中,我使用了 3 次 SDL_mixer 来播放音乐(在菜单、角色扮演游戏和战斗中)。它在前两种情况下有效,但是当我发起战斗时没有音乐。音乐加载完毕,Mix_playingMusic返回true,但是打架时听不到任何音乐。我使用与角色扮演游戏和菜单中相同的音乐。关于SDL_Mixer 的代码到处都是一样的。部分战斗代码:

{
SDL_Event events;
Mix_Music *fightMusic;

enum actual_player actual = PLAYER;
int go = 1;
int action;
int monsterId = 0;

Uint32 t = SDL_GetTicks(), nt;

fightMusic = Mix_LoadMUS("data/Music/rpg.mp3"); // we loading the music

if(fightMusic == NULL){
printf("error loading fightMusic\n");
}

Mix_VolumeMusic(MIX_MAX_VOLUME);

if(Mix_PlayMusic(fightMusic, -1)<0){
printf("error playing fightMusic \n");
}
if (Mix_PlayingMusic() ){
printf("Music it's playing \n");
}

while(go){
if(isFinished(fightSdl->fight))
go = 0;
nt = SDL_GetTicks();


while (SDL_PollEvent(&events)){

action = inputKeyboard(events);
if(action == QUIT){
return -1;
go = 0;
}

if(action == -2){
clearBufferGame(fightSdl->buffer, CHARACTER);
}

if(actual == PLAYER) {

switch(action){

case MOVE_DOWNWARD:
addActionToBufferGame(fightSdl->buffer, DOWN);
break;

case MOVE_UPWARD:
addActionToBufferGame(fightSdl->buffer, UP);
break;

case MOVE_LEFT:
addActionToBufferGame(fightSdl->buffer, LEFT);
break;

case MOVE_RIGHT:
addActionToBufferGame(fightSdl->buffer, RIGHT);

break;

case ATTACK_1:
actionAttackSdl(fightSdl, ATTACK_1);
break;

case ATTACK_2:
if(Mix_PlayChannel(-1,fireSound,0)<0){
printf("error playing fire sound");
}
actionAttackSdl(fightSdl, ATTACK_2);
break;

case ATTACK_3:
actionAttackSdl(fightSdl, ATTACK_3);
break;

case NOTHING:
actual = ENNEMY;
break;

case -1:
setIsIdleCharacSdl(fightSdl->characSdl,1);
}
}
}
if (nt-t>300){

if(actual == ENNEMY){
hitNRunSdl(fightSdl, monsterId);

if(getMpEnnemyFight(fightSdl->fight) == 3 && getMpEnnemyFight(fightSdl->fight) == 3)
monsterId++;
if(monsterId >= fightSdl->nbMstrSdl){
actual = PLAYER;
setApPlayerFight(fightSdl->fight, 3);
setMpPlayerFight(fightSdl->fight, 3);
monsterId = 0;
}

}
t = nt;
}


// updatePlayerDisplay(fightSdl);
// updateMonsterDisplay(fightSdl);
updatePlayerActionFight(fightSdl);
updateSpellDisplay(fightSdl);
updateDisplay(fightSdl);

drawGame(fightSdl);

// SDL_RenderPresent(fightSdl->renderer);
}

if(getLifePointsCharacter(getCharacterFight(fightSdl->fight)) >= 0)
return 1;
return 0;

编辑:我添加了一个 printf("%s", Mix_GetError) 菜单和 rpg 中没有错误,但在战斗中它是 print : Invalid audio device ID

最佳答案

所以,我找到了解决我的问题的方法。显然 SDL_OpenAudio 的返回值总是成功或失败,而不是设备 ID,这意味着您只能使用此函数一次打开一个设备。在启动战斗时,我只是在重新打开之前关闭了音频,并且它有效。

关于c - SDL_Mixer 无法处理部分代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37361630/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com