Project1

标题: 要不随便放点老东西吧,关于SE和BGM [打印本页]

作者: trentswd    时间: 2010-6-20 00:30
标题: 要不随便放点老东西吧,关于SE和BGM
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,在游戏进行中是可以改的。比如这样:
  1. [eval exp="kag.bgm.type='Wave'"]
复制代码
这样之后找文件就能找到wave类型的文件了。不过还是不能用,因为buffer类型还是midi的,所以还要重建buffer,像这样:
  1. [eval exp="kag.bgm.createBuffers()"]
复制代码
这样之后就能正常播放了,实验通过。虽然wave改midi的时候卡了一下……

坚持用se来播放wave类的话,稍微改动一下也能做到。首先是bgm和se的父类都有一个paused的属性,赋值true就能暂停,赋值false就正常播放。实际上bgm的暂停就是改动这个属性做到的。
接下来就好办了,要么去mainwindow.tjs里面改kag指令的handler那个字典,要么就加个宏什么的。比如:
  1. [macro name=pausese]
  2. [eval exp="kag.se[+mp.buf].paused = true"]
  3. [endmacro]

  4. [macro name=resumese]
  5. [eval exp="kag.se[+mp.buf].paused = false"]
  6. [endmacro]
复制代码
调用宏的话就会传一个字典mp做参数,所以用这个宏的时候加上buf=xx的参数,就能让第xx号的buffer暂停或者继续。

这样还有一个问题,就是se的暂停的状态存盘的时候不会存下来。一路顺着tjs看过去,会发现问题在SE类里面。store这个是把该buffer的状态存入字典中,restore是把字典里面存的状态重新设置buffer。知道这个之后就简单了,直接加上红色的语句就可以。
  1. function store()
  2. {
  3. // 辞書配列に現在の状態を記録する
  4. var dic = %[];
  5. dic.currentStorage = currentStorage;
  6. dic.paused = this.paused;
  7. dic.volume = currentVolume;
  8. dic.pan = pan;
  9. return dic;
  10. }

  11. function restore(dic)
  12. {
  13. // 辞書配列から状態を読み出し、復帰する
  14. currentVolume = dic.volume;Debug.message("Volume");
  15. pan = dic.pan;Debug.message("Pan");
  16. if(dic.currentStorage != "")
  17. { play(%[storage : dic.currentStorage, loop : true]);this.paused = dic.paused;}
  18. else
  19. stop();
  20. }
复制代码
好久没用这东西,我都忘了if后面只能接单语句或代码块了……总之大括号必须添上。
这样把se当作bgm用应该就没什么问题了、大概……

哦对了,不管是bgm还是se,只有loop=true的时候,才会把目前播放的文件存入字典中,也就是说不循环的se或者bgm是不会存入存档里面的。

其实还有一个问题,就是存档读档的时候buffer似乎没有匹配,不过改改存读档部分的函数就好了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1