Project1

标题: 关于MTV脚本的问题 [打印本页]

作者: 步兵中尉    时间: 2009-1-29 08:33
标题: 关于MTV脚本的问题
    最近在游戏中加入了站上的MTV脚本,突然发现战斗时(未放MTV)状态依然被分割出了显示歌词的区域。如何才能设置一个开关,在用时才用MTV脚本,平时关闭(就像读书系统和跟随系统一样)。
    请诸位大侠指教!
附录脚本
  1. #=================================================================
  2. # MTV 脚本,by 66RPG_柳柳
  3. #=================================================================
  4. module MTV  
  5.   #===============================================================
  6.   # 读取文件。文件相对地址:Audio/BGM
  7.   # file_name:文件名;length:MTV长度,按照.1秒为单位记数
  8.   #===============================================================
  9.   def self.load(file_name,length = 0)
  10.     $mtv_time = []
  11.     $mtv_text = []
  12.     $game_system.mtv_length = length
  13.     #=============================================================
  14.     # 打开文件并且读取之
  15.     #=============================================================
  16.     file =  File.open("Audio/BGM/"+file_name)
  17.     #=============================================================
  18.     # 读取歌词
  19.     #=============================================================
  20.     for line in file.readlines
  21.       #===========================================================
  22.       # 转为UTF-8编码
  23.       #===========================================================
  24.       line = EasyConv.s2u(line)
  25.       #===========================================================
  26.       # 寻找本行歌词
  27.       #===========================================================
  28.       this_line_text = line[line.scan(/\]/).size*10,line.size]
  29.       #===========================================================
  30.       # 把读取的行分存成时间与文字
  31.       #===========================================================
  32.       for i in 0...line.scan(/\]/).size
  33.         temp_b = line[i*10+1,8]
  34.         temp_c = temp_b.split(/:/)[0]
  35.         mmsecond = 600 * temp_c.to_i
  36.         temp_c = temp_b.split(/:/)[1]
  37.         mmsecond += 10 * temp_c.to_f
  38.         $mtv_time.push(mmsecond.to_i)
  39.         $mtv_text.push(this_line_text)
  40.       end
  41.     end
  42.     file.close
  43.   end
  44.   #===============================================================
  45.   # 开始MTV字幕
  46.   #===============================================================
  47.   def self.mtv_begin
  48.     $game_system.mtv_now = true
  49.     $game_system.mtv_begin_time = $sys_timer.now()
  50.     $lrc_text = ""
  51.     return
  52.   end
  53.   #===============================================================
  54.   # 结束MTV字幕
  55.   #===============================================================
  56.   def self.stop
  57.     $game_system.mtv_now = false
  58.     return
  59.   end
  60.   #===============================================================
  61.   # 测试MTV是否播放
  62.   #===============================================================
  63.   def self.mtv?
  64.     return $game_system.mtv_now
  65.   end
  66.   #===============================================================
  67.   # 获取MTV字幕
  68.   #===============================================================
  69.   def self.new_text
  70.     if $game_system.mtv_now
  71.       #===========================================================
  72.       # 求出已经经过的时间
  73.       #===========================================================
  74.       nt = $sys_timer.now()
  75.       nt -= $game_system.mtv_begin_time
  76.       nt = nt.to_i
  77.       nt /= 100      
  78.       #===========================================================
  79.       # 制作循环
  80.       #===========================================================
  81.       if $game_system.mtv_length>0 and nt > $game_system.mtv_length
  82.         nt -= $game_system.mtv_length
  83.       end
  84.       #===========================================================
  85.       # 放出字幕
  86.       #===========================================================
  87.       for tm in 0...$mtv_time.size
  88.         if $mtv_time[tm] == nt
  89.           $lrc_text = $mtv_text[tm]
  90.           break
  91.         end
  92.       end
  93.     else
  94.       $lrc_text = ""
  95.     end
  96.   end
  97. end
  98. #==============================================================================
  99. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  100. #==============================================================================
  101. # ------------------------------------------------------------------------
  102. # 高精度计时器 by FantasyDR
  103. # ------------------------------------------------------------------------
  104. # E-mail: [email protected]
  105. # ------------------------------------------------------------------------
  106. # 2005.10.18
  107. # ------------------------------------------------------------------------
  108. # 该类已经被定义为全局变量 $sys_timer
  109. # 如果只需要精确到毫秒,请设置初始化参数为true
  110. # decimal属性设置返回时间值的小数位数。
  111. # ------------------------------------------------------------------------
  112. # 下面是一些有用的方法列表,调用时写:$sys_timer.方法名
  113. # 例如 $sys_timer.clear()
  114. # ------------------------------------------------------------------------
  115. # clear() :计时器清零
  116. # now() :获取当前经过的时间,单位毫秒
  117. # now_s() :获取当前经过的时间,单位秒
  118. # ------------------------------------------------------------------------
  119. class SystemTimer
  120. attr_accessor:decimal #小数位数设定,默认为3

  121. def initialize(use_GetTime=false)
  122. # 初始化,根据系统选择不同精度计时器
  123. @qpFrequency = Win32API.new("kernel32","QueryPerformanceFrequency",'p','L')
  124. @qpCounter = Win32API.new("kernel32","QueryPerformanceCounter",'p','L')
  125. @tGetTime = Win32API.new("winmm","timeGetTime",'','L')

  126. @decimal=3
  127. @perf_cnt=" " * 8
  128. @time_start=" " * 8
  129. @time_now=" " * 8

  130. result = @qpFrequency.call(@perf_cnt)

  131. if use_GetTime
  132. result = 0
  133. end

  134. if result!=0
  135. @perf_flag=true
  136. else
  137. @perf_flag=false
  138. @perf_cnt=[1000,0].pack('LL')
  139. end

  140. #设置时间比例因数
  141. @time_scale=@perf_cnt.unpack('LL')
  142. @time_scale[0] /= 1000.0
  143. @time_scale[1] /= 1000.0

  144. #起始时间清零
  145. self.clear()
  146. end

  147. #-=====================-#
  148. # 计时器清零
  149. #-=====================-#
  150. def clear()
  151. if @perf_flag
  152. @qpCounter.call(@time_start)
  153. else
  154. @time_start=[@tGetTime.call(),0].pack('LL')
  155. end
  156. end

  157. #-==============================-#
  158. # 获取当前经过的时间,单位毫秒
  159. #-==============================-#
  160. def now()
  161. now_time = 0.0e1
  162. now_time += self.timer() - self.start()
  163. now_time /= self.scale()
  164. return self.debug(now_time)
  165. end

  166. #-==============================-#
  167. # 获取当前经过的时间,单位秒
  168. #-==============================-#
  169. def now_s()
  170. now_time = 0.0e1
  171. now_time += self.timer() - self.start()
  172. now_time /= (self.scale()*1000)
  173. return self.debug(now_time)
  174. end

  175. #-==============================-#
  176. # 帧错...
  177. #-==============================-#
  178. def debug(now_time)
  179. if @decimal>0
  180. now_time = (now_time * (10**@decimal)).floor/(10.0**@decimal)
  181. else
  182. now_time = now_time.floor
  183. end
  184. return now_time

  185. #以下用于debug模式
  186. if now_time < 0
  187. p "Timer Wrong!! Clear...",now_time,@perf_flag,@qpCounter,@tGetTime,
  188. @time_now.unpack('LL')[0],@time_now.unpack('LL')[1],
  189. @time_start.unpack('LL')[0],@time_start.unpack('LL')[1]
  190. self.clear()
  191. return 0.0
  192. else
  193. return now_time
  194. end
  195. end

  196. #-=====================-#
  197. # 获取时间比例因数
  198. #-=====================-#
  199. def scale()
  200. return @time_scale[0]+@time_scale[1]*0xffffffff
  201. end

  202. #-=====================-#
  203. # 获取起始滴答数
  204. #-=====================-#
  205. def start()
  206. return @time_start.unpack('LL')[0]+@time_start.unpack('LL')[1]*0xffffffff
  207. end

  208. #-=====================-#
  209. # 获取当前的嘀哒数
  210. #-=====================-#
  211. def timer()
  212. if @perf_flag
  213. @qpCounter.call(@time_now)
  214. else
  215. @time_now=[@tGetTime.call(),0].pack('LL')
  216. end
  217. return @time_now.unpack('LL')[0]+@time_now.unpack('LL')[1]*0xffffffff
  218. end
  219. end
  220. #-------------------------------------#
  221. # 初始化自身成一个全局变量
  222. #-------------------------------------#
  223. $sys_timer=SystemTimer.new()
  224. #-------------------------------------#




  225. #==============================================================================
  226. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  227. #==============================================================================


  228. #==============================================================================
  229. # 仭 EasyConv module - Ver 0.90
  230. #------------------------------------------------------------------------------
  231. # Moonlight INN
  232. # http://cgi.members.interq.or.jp/aquarius/rasetsu/
  233. # RaTTiE
  234. # [email protected]
  235. #------------------------------------------------------------
  236. # EasyConv::s2u(text) : S-JIS -> UTF-8
  237. # EasyConv::u2s(text) : UTF-8 -> S-JIS
  238. #==============================================================================
  239. module EasyConv
  240. # API梡掕悢掕媊
  241.    CP_ACP = 0
  242.    CP_UTF8 = 65001

  243. #--------------------------------------------------------------------------
  244. # 仠 S-JIS -> UTF-8
  245. #--------------------------------------------------------------------------
  246. def s2u(text)
  247. # API掕媊
  248.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  249.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  250. # S-JIS -> Unicode
  251.    len = m2w.call(CP_ACP, 0, text, -1, nil, 0);
  252.    buf = "\0" * (len*2)
  253.    m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2);

  254. # Unicode -> UTF-8
  255.    len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
  256.    ret = "\0" * len
  257.    w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  258.    
  259.    return ret
  260. end
  261. # module_function偲偟偰岞奐
  262. module_function :s2u
  263. #--------------------------------------------------------------------------
  264. # 仠 UTF-8 -> S-JIS
  265. #--------------------------------------------------------------------------
  266. def u2s(text)
  267. # API掕媊
  268.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  269.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  270. # UTF-8 -> Unicode
  271.    len = m2w.call(CP_UTF8, 0, text, -1, nil, 0);
  272.    buf = "\0" * (len*2)
  273.    m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2);

  274. # Unicode -> S-JIS
  275.    len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil);
  276.    ret = "\0" * len
  277.    w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil);
  278.    
  279.    return ret
  280. end
  281. # module_function偲偟偰岞奐
  282. module_function :u2s
  283. end


  284. #==============================================================================
  285. # ■ Game_System
  286. #------------------------------------------------------------------------------
  287. #  处理系统附属数据的类。也可执行诸如 BGM 管理之类的功能。本类的实例请参考
  288. # $game_system 。
  289. #==============================================================================
  290. class Game_System
  291.   #--------------------------------------------------------------------------
  292.   # ● 定义实例变量
  293.   #--------------------------------------------------------------------------
  294.   attr_accessor :mtv_begin_time
  295.   attr_accessor :mtv_now
  296.   attr_accessor :mtv_length
  297.   #--------------------------------------------------------------------------
  298.   # ● 初始化对像
  299.   #--------------------------------------------------------------------------
  300.   alias mtv_gamesystem_initialize initialize
  301.   def initialize
  302.     mtv_gamesystem_initialize
  303.     @mtv_begin_time = $sys_timer.now()
  304.     @mtv_now = false
  305.     @mtv_length = 0
  306.   end
  307. end  

  308. #==============================================================================
  309. # ■ Scene_Map
  310. #------------------------------------------------------------------------------
  311. #  处理地图画面的类。
  312. #==============================================================================
  313. class Scene_Map
  314.   #--------------------------------------------------------------------------
  315.   # ● 刷新画面
  316.   #--------------------------------------------------------------------------
  317.   alias mtv_scenemap_update update
  318.   def update
  319.     @mtv_window.refresh
  320.     mtv_scenemap_update
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # ● 主处理
  324.   #--------------------------------------------------------------------------
  325.   alias mtv_scenemap_main main
  326.   def main
  327.     @mtv_window = Window_MTV.new
  328.     mtv_scenemap_main
  329.     @mtv_window.dispose
  330.   end
  331.   #--------------------------------------------------------------------------
  332.   # ● 调用战斗 (调整自动切换BGM)
  333.   #--------------------------------------------------------------------------
  334.   def call_battle
  335.     # 清除战斗调用标志
  336.     $game_temp.battle_calling = false
  337.     # 清除菜单调用标志
  338.     $game_temp.menu_calling = false
  339.     $game_temp.menu_beep = false
  340.     # 生成遇敌计数
  341.     $game_player.make_encounter_count
  342.     # 记忆地图 BGM 、停止 BGM
  343.     $game_temp.map_bgm = $game_system.playing_bgm
  344.     unless MTV.mtv?      
  345.       $game_system.bgm_play($game_system.battle_bgm)
  346.       # 演奏战斗开始 SE
  347.       $game_system.se_play($data_system.battle_start_se)
  348.     end
  349.     # 矫正主角姿势
  350.     $game_player.straighten
  351.     # 切换到战斗画面
  352.     $scene = Scene_Battle.new
  353.   end
  354. end

  355. #==============================================================================
  356. # ■ Scene_Battle
  357. #------------------------------------------------------------------------------
  358. #  处理战斗的类。
  359. #==============================================================================
  360. class Scene_Battle
  361.   #--------------------------------------------------------------------------
  362.   # ● 刷新画面
  363.   #--------------------------------------------------------------------------
  364.   alias mtv_scenebattle_update update
  365.   def update
  366.     @mtv_window.refresh
  367.     mtv_scenebattle_update
  368.   end
  369.   #--------------------------------------------------------------------------
  370.   # ● 主处理
  371.   #--------------------------------------------------------------------------
  372.   alias mtv_scenebattle_main main
  373.   def main
  374.     @mtv_window = Window_MTV.new
  375.     mtv_scenebattle_main
  376.     @mtv_window.dispose
  377.   end
  378. end

  379. #==============================================================================
  380. # ■ Window_MTV
  381. #------------------------------------------------------------------------------
  382. #  显示MTV字幕的窗口。
  383. #==============================================================================

  384. class Window_MTV < Window_Base
  385.   #--------------------------------------------------------------------------
  386.   # ● 初始化窗口
  387.   #--------------------------------------------------------------------------
  388.   def initialize
  389.     super(0, 416, 640, 64)
  390.     self.contents = Bitmap.new(width - 32, height - 32)
  391.     $lrc_text = ""
  392.     self.z = 9999
  393.     refresh
  394.   end
  395.   #--------------------------------------------------------------------------
  396.   # ● 刷新
  397.   #--------------------------------------------------------------------------
  398.   def refresh(text = "")
  399.     MTV.new_text
  400.     self.contents.clear   
  401.     if $game_temp.in_battle
  402.       self.opacity = 120
  403.     else
  404.       self.opacity = 0
  405.     end
  406.     self.contents.font.color = Color.new(0,0,0,255)
  407.     self.contents.draw_text(0, 0, 608, 32, $lrc_text, 1)   
  408.     self.contents.font.color = Color.new(255,255,255,255)
  409.     self.contents.draw_text(1, 1, 608, 32, $lrc_text, 1)   
  410.   end
  411. end
复制代码

附录问题图片

[LINE]1,#dddddd[/LINE]此贴于 2009-1-31 13:03:44 被版主darkten提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]此贴于 2009-2-1 11:16:28 被版主darkten提醒,请楼主看到后对本贴做出回应。
作者: darkten    时间: 2009-1-30 20:22
    if $game_temp.in_battle
      self.opacity = 120
    else
      self.opacity = 0
    end
在脚本的最后找到这段,改改看...

作者: 步兵中尉    时间: 2009-2-2 07:50
    自己把问题解决了。主要改“Window_MTV”那里。拿出来大家分享。
原脚本:
  1. #==============================================================================
  2. # ■ Window_MTV
  3. #------------------------------------------------------------------------------
  4. #  显示MTV字幕的窗口。
  5. #==============================================================================

  6. class Window_MTV < Window_Base
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化窗口
  9.   #--------------------------------------------------------------------------
  10.   def initialize
  11.     super(0, 416, 640, 64)
  12.     self.contents = Bitmap.new(width - 32, height - 32)
  13.     $lrc_text = ""
  14.     self.z = 9999
  15.     refresh
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 刷新
  19.   #--------------------------------------------------------------------------
  20.   def refresh(text = "")
  21.     MTV.new_text
  22.     self.contents.clear   
  23.     if $game_temp.in_battle
  24.       self.opacity = 120
  25.     else
  26.       self.opacity = 0
  27.     end
  28.     self.contents.font.color = Color.new(0,0,0,255)
  29.     self.contents.draw_text(0, 0, 608, 32, $lrc_text, 1)   
  30.     self.contents.font.color = Color.new(255,255,255,255)
  31.     self.contents.draw_text(1, 1, 608, 32, $lrc_text, 1)   
  32.   end
  33. end
复制代码

改进后
  1. #==============================================================================
  2. # ■ Window_MTV
  3. #------------------------------------------------------------------------------
  4. #  显示MTV字幕的窗口。
  5. #==============================================================================

  6. class Window_MTV < Window_Base
  7. Window_MTV = 50  #默认打开50开关后进入读书系统
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化窗口
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super(0, 416, 640, 64)
  13.     self.contents = Bitmap.new(width - 32, height - 32)
  14.     $lrc_text = ""
  15.     if $game_switches[Window_MTV]== true
  16.     self.z = 9999
  17.   else
  18.     self.z = 0
  19.     refresh
  20.   end
  21. end
  22.   #--------------------------------------------------------------------------
  23.   # ● 刷新
  24.   #--------------------------------------------------------------------------
  25.   def refresh(text = "")
  26.     MTV.new_text
  27.     self.contents.clear   
  28.     if $game_temp.in_battle
  29.       self.opacity = 120
  30.     else
  31.       self.opacity = 0
  32.     end
  33.     self.contents.font.color = Color.new(0,0,0,255)
  34.     self.contents.draw_text(0, 0, 608, 32, $lrc_text, 1)   
  35.     self.contents.font.color = Color.new(255,255,255,255)
  36.     self.contents.draw_text(1, 1, 608, 32, $lrc_text, 1)   
  37.   end
  38. end
复制代码





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