您需要 登录 才可以下载或查看,没有账号?注册会员
bgm和se都是WaveSoundBuffer的子类,不过bgm有两个buffer,还继承了另外一个类,所以这两个类最种有些方法不一样。 之前看水螅说过,因为bgm要设置是播放midi还是wave,不如bgm专门播放midi,wave类型的bgm就交给se来放,反正都可以设置 loop=true。不过最后实验下来,发现se和bgm还是有点差别,最大的差别就是se不能暂停…… 所以要想游戏又播放midi又播放wave(包括mp3、ogg之类)的bgm就要做些改动。 实验表明,在config.tjs中设置的type,在游戏进行中是可以改的。比如这样:[eval exp="kag.bgm.type='Wave'"]复制代码这样之后找文件就能找到wave类型的文件了。不过还是不能用,因为buffer类型还是midi的,所以还要重建buffer,像这样:[eval exp="kag.bgm.createBuffers()"]复制代码这样之后就能正常播放了,实验通过。虽然wave改midi的时候卡了一下…… 坚持用se来播放wave类的话,稍微改动一下也能做到。首先是bgm和se的父类都有一个paused的属性,赋值true就能暂停,赋值false就正常播放。实际上bgm的暂停就是改动这个属性做到的。 接下来就好办了,要么去mainwindow.tjs里面改kag指令的handler那个字典,要么就加个宏什么的。比如:[macro name=pausese] [eval exp="kag.se[+mp.buf].paused = true"] [endmacro] [macro name=resumese] [eval exp="kag.se[+mp.buf].paused = false"] [endmacro]复制代码调用宏的话就会传一个字典mp做参数,所以用这个宏的时候加上buf=xx的参数,就能让第xx号的buffer暂停或者继续。 这样还有一个问题,就是se的暂停的状态存盘的时候不会存下来。一路顺着tjs看过去,会发现问题在SE类里面。store这个是把该buffer的状态存入字典中,restore是把字典里面存的状态重新设置buffer。知道这个之后就简单了,直接加上红色的语句就可以。function store() { // 辞書配列に現在の状態を記録する var dic = %[]; dic.currentStorage = currentStorage; dic.paused = this.paused; dic.volume = currentVolume; dic.pan = pan; return dic; } function restore(dic) { // 辞書配列から状態を読み出し、復帰する currentVolume = dic.volume;Debug.message("Volume"); pan = dic.pan;Debug.message("Pan"); if(dic.currentStorage != "") { play(%[storage : dic.currentStorage, loop : true]);this.paused = dic.paused;} else stop(); }复制代码好久没用这东西,我都忘了if后面只能接单语句或代码块了……总之大括号必须添上。 这样把se当作bgm用应该就没什么问题了、大概…… 哦对了,不管是bgm还是se,只有loop=true的时候,才会把目前播放的文件存入字典中,也就是说不循环的se或者bgm是不会存入存档里面的。
使用道具 举报
献给最先抵达这片土地的你。参加预注册的用户即可获得。
Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.