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,在游戏进行中是可以改的。比如这样:这样之后找文件就能找到wave类型的文件了。不过还是不能用,因为buffer类型还是midi的,所以还要重建buffer,像这样:复制代码
- [eval exp="kag.bgm.type='Wave'"]
这样之后就能正常播放了,实验通过。虽然wave改midi的时候卡了一下……复制代码
- [eval exp="kag.bgm.createBuffers()"]
坚持用se来播放wave类的话,稍微改动一下也能做到。首先是bgm和se的父类都有一个paused的属性,赋值true就能暂停,赋值false就正常播放。实际上bgm的暂停就是改动这个属性做到的。
接下来就好办了,要么去mainwindow.tjs里面改kag指令的handler那个字典,要么就加个宏什么的。比如:调用宏的话就会传一个字典mp做参数,所以用这个宏的时候加上buf=xx的参数,就能让第xx号的buffer暂停或者继续。复制代码
- [macro name=pausese]
- [eval exp="kag.se[+mp.buf].paused = true"]
- [endmacro]
- [macro name=resumese]
- [eval exp="kag.se[+mp.buf].paused = false"]
- [endmacro]
这样还有一个问题,就是se的暂停的状态存盘的时候不会存下来。一路顺着tjs看过去,会发现问题在SE类里面。store这个是把该buffer的状态存入字典中,restore是把字典里面存的状态重新设置buffer。知道这个之后就简单了,直接加上红色的语句就可以。好久没用这东西,我都忘了if后面只能接单语句或代码块了……总之大括号必须添上。复制代码
- 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();
- }
这样把se当作bgm用应该就没什么问题了、大概……
哦对了,不管是bgm还是se,只有loop=true的时候,才会把目前播放的文件存入字典中,也就是说不循环的se或者bgm是不会存入存档里面的。
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |