我正在为一个学校项目制作游戏,并且我有一个声音效果,应该在激光器发射时播放。有一段很短的时间它工作正常,但它已经停止了。停止后,我将代码更改了一段,因为我想将文件存储在数据文件中。
在Allegro中初始化声音
install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL);
这是加载和播放声音的代码
//Loading sound file from datafile
DATAFILE *laserShot = NULL;
laserShot = load_datafile_object("asteroids.dat", "laser_Shot");
//Error checking
if (laserShot->dat == NULL) {
allegro_message("Error loading laser_Shot.wav");
}
else {
//Playing sound for shot
play_sample((SAMPLE*) laserShot->dat, 255, 127, 1000, 0);
}
//Freeing memory
unload_datafile_object(laserShot);
声音本身非常短,如果它是重要的,不到一秒钟。 声音也会试图快速连续播放多次,但现在实际上比起最初的工作更多,所以我不认为这会产生影响。
我有什么明显的错误吗?
答案 0 :(得分:0)
首先,确保设置了所有参数,如果只调用install_sound则不会。你也应该这样称呼:
set_config_int("sound", "quality", 1);
第三个参数是指使用的声音质量。这应该意味着最高质量,如果你想要另一种类型,你应该搜索allegro libs参考。
其次,您应该分配语音。语音基本上是用于播放样本的内存空间。默认情况下,allegro 4可以分配255种不同的声音,但由于硬件原因,实数可能会少得多。你这样做:
int laser_voice = allocate_voice("sample.wav");
现在您可以设置参数,如音量,声像,扫描和播放模式。例如,如果你想像源一样以相同的频率和音量播放循环样本,你应该这样做:
voice_set_volume( laser_voice, 200);
voice_set_pan( laser_voice, 127);
voice_set_playmode( laser_voice, PLAYMODE_LOOP);
对于其他选项,您应该访问参考文献。
现在,要播放示例,只需调用
即可voice_start(laser_voice);
然后您可以通过reallocate_voice停止,重播,更改参数或更改样本。就这样。在代码结束时,您可以通过
解除分配deallocate_voice(laser_voice);
答案 1 :(得分:0)
原来我只是犯了一个愚蠢的错误,我在播放声音文件的同一个函数中调用了卸载功能;在卸载文件之前没有足够的时间播放声音文件,因此从技术上讲,编译器没有错误或者导致崩溃,代码试图播放它已经忘记的声音。删除要卸载的呼叫可以播放声音。