Project1

标题: 谁有rpgxp插入视屏的脚本 [打印本页]

作者: wwwxuanye    时间: 2014-11-9 12:25
标题: 谁有rpgxp插入视屏的脚本
谁有rpgxp插入视屏的脚本
作者: ♞丝瓜☣daye    时间: 2014-11-9 17:17
插入视屏。貌似是这个
  1. #==============================================================================
  2. # ☆★☆ AVI播放器 ☆★☆
  3. #------------------------------------------------------------------------------
  4. # - FantasyDR
  5. # - 2006.3.8
  6. #------------------------------------------------------------------------------
  7. # MSN: [email protected]
  8. #------------------------------------------------------------------------------
  9. # Note:
  10. #
  11. #   1.游戏必须使用游戏样板工程附带的RGSS102J.dll
  12. #  
  13. #   2.在下方 PROJECT_NAME = 后面填写你的游戏工程名.
  14. #
  15. #   3.在游戏中,调用脚本事件播放你的视频文件,如果一行写不下可以在逗号后换行.
  16. #
  17. #   $MP.play(movie_name, movie_length,
  18. #            skip, fullscr,
  19. #            x, y, width, height)
  20. #
  21. # 参数说明:
  22. #
  23. #     movie_name   : 视频文件名(*.avi),必须
  24. #     movie_length : 电影时间,单位是秒,必须
  25. #             skip : 是否可以按A键跳过,true/false,默认是true
  26. #          fullscr : 是否强制为全屏幕播放,true/false,默认是false
  27. #              x,y : 视频播放的左上角坐标,默认是0,0
  28. #     width,height : 视频的宽度,可以任意.默认是640,480
  29. #
  30. # 例如:
  31. #        $MP.play("logo.avi",13,false,true)
  32. #==============================================================================

  33. # ------------------------------------------------------------------------
  34. # 高精度计时器 by FantasyDR
  35. # ------------------------------------------------------------------------
  36. # E-mail: [email protected]
  37. # ------------------------------------------------------------------------
  38. # 2005.10.18
  39. # ------------------------------------------------------------------------
  40. # 该类已经被定义为全局变量 $sys_timer
  41. # 如果只需要精确到毫秒,请设置初始化参数为true
  42. # decimal属性设置返回时间值的小数位数。
  43. # ------------------------------------------------------------------------
  44. # 下面是一些有用的方法列表,调用时写:$sys_timer.方法名
  45. # 例如 $sys_timer.clear()
  46. # ------------------------------------------------------------------------
  47. # clear() :计时器清零
  48. #   now() :获取当前经过的时间,单位毫秒
  49. # now_s() :获取当前经过的时间,单位秒
  50. # ------------------------------------------------------------------------

  51. class SystemTimer

  52. attr_accessor:decimal  #小数位数设定,默认为3

  53. def initialize(use_GetTime=false)
  54.    # 初始化,根据系统选择不同精度计时器
  55.    @qpFrequency = Win32API.new("kernel32","QueryPerformanceFrequency",'p','L')
  56.    @qpCounter = Win32API.new("kernel32","QueryPerformanceCounter",'p','L')
  57.    @tGetTime = Win32API.new("winmm","timeGetTime",'','L')
  58.    
  59.    @decimal=3
  60.    @perf_cnt=" " * 8
  61.    @time_start=" " * 8
  62.    @time_now=" " * 8
  63.    
  64.    result = @qpFrequency.call(@perf_cnt)
  65.    
  66.    if use_GetTime
  67.      result = 0
  68.    end
  69.    
  70.    if result!=0
  71.      @perf_flag=true
  72.    else
  73.      @perf_flag=false
  74.      @perf_cnt=[1000,0].pack('LL')
  75.    end
  76.    
  77.    #设置时间比例因数
  78.    @time_scale=@perf_cnt.unpack('LL')
  79.    @time_scale[0] /= 1000.0
  80.    @time_scale[1] /= 1000.0
  81.    
  82.    #起始时间清零
  83.    self.clear()
  84. end

  85. #-=====================-#
  86. # 计时器清零
  87. #-=====================-#
  88. def clear()
  89.    if @perf_flag
  90.      @qpCounter.call(@time_start)
  91.    else
  92.      @time_start=[@tGetTime.call(),0].pack('LL')
  93.    end
  94. end

  95. #-==============================-#
  96. # 获取当前经过的时间,单位毫秒
  97. #-==============================-#
  98. def now()
  99.    now_time = 0.0e1
  100.    now_time += self.timer() - self.start()
  101.    now_time /= self.scale()
  102.    return self.debug(now_time)
  103. end

  104. #-==============================-#
  105. # 获取当前经过的时间,单位秒
  106. #-==============================-#
  107. def now_s()
  108.    now_time = 0.0e1
  109.    now_time += self.timer() - self.start()
  110.    now_time /= (self.scale()*1000)   
  111.    return self.debug(now_time)
  112. end

  113. #-==============================-#
  114. # 帧错...
  115. #-==============================-#
  116. def debug(now_time)
  117.    if @decimal>0
  118.     now_time = (now_time * (10**@decimal)).floor/(10.0**@decimal)
  119.    else
  120.     now_time = now_time.floor
  121.    end
  122.    return now_time
  123.    
  124.    #以下用于debug模式
  125.    if now_time < 0
  126.      p "Timer Wrong!! Clear...",now_time,       @perf_flag,@qpCounter,@tGetTime,
  127.        @time_now.unpack('LL')[0],@time_now.unpack('LL')[1],
  128.        @time_start.unpack('LL')[0],@time_start.unpack('LL')[1]
  129.      self.clear()
  130.      return 0.0
  131.    else
  132.      return now_time
  133.    end
  134. end

  135. #-=====================-#
  136. # 获取时间比例因数
  137. #-=====================-#
  138. def scale()
  139.    return @time_scale[0]+          @time_scale[1]*0xffffffff
  140. end

  141. #-=====================-#
  142. # 获取起始滴答数
  143. #-=====================-#
  144. def start()
  145.    return @time_start.unpack('LL')[0]+          @time_start.unpack('LL')[1]*0xffffffff
  146. end

  147. #-=====================-#
  148. # 获取当前的嘀哒数
  149. #-=====================-#
  150. def timer()
  151.    if @perf_flag
  152.      @qpCounter.call(@time_now)
  153.    else
  154.      @time_now=[@tGetTime.call(),0].pack('LL')
  155.    end
  156.    return @time_now.unpack('LL')[0]+          @time_now.unpack('LL')[1]*0xffffffff
  157. end
  158. end

  159. #-------------------------------------#
  160. # 初始化自身成一个全局变量
  161. #-------------------------------------#
  162. $sys_timer=SystemTimer.new()
  163. #-------------------------------------#

  164. #==============================================================================
  165. # ☆★☆ AVI播放器 ☆★☆
  166. #------------------------------------------------------------------------------
  167. # - FantasyDR
  168. # - 2006.3.8
  169. #------------------------------------------------------------------------------
  170. # MSN: [email protected]
  171. #------------------------------------------------------------------------------
  172. # Note:
  173. #
  174. #   1.游戏必须使用游戏样板工程附带的RGSS102J.dll
  175. #  
  176. #   2.在下方 PROJECT_NAME = 后面填写你的游戏工程名.
  177. #
  178. #   3.在游戏中,调用脚本事件播放你的视频文件,如果一行写不下可以在逗号后换行.
  179. #
  180. #   $MP.play(movie_name, movie_length,
  181. #            skip, fullscr,
  182. #            x, y, width, height, loop)
  183. #
  184. # 参数说明:
  185. #
  186. #     movie_name   : 视频文件名(*.avi),必须
  187. #     movie_length : 电影时间,单位是秒,必须
  188. #             skip : 是否可以按A键跳过,true/false,默认是true
  189. #          fullscr : 是否强制为全屏幕播放,true/false,默认是false
  190. #              x,y : 视频播放的左上角坐标,默认是0,0
  191. #     width,height : 视频的宽度,可以任意.默认是640,480
  192. #             loop : 循环播放,true/false,默认是true
  193. #
  194. # 例如播放logo.avi,时间13秒,禁止跳过,强制全屏,范围(是0,0)-(640,480),循环播放
  195. #        $MP.play("logo.avi",13,false,true)
  196. #==============================================================================

  197. # ★★★请先这里填写游戏的工程名★★★

  198. PROJECT_NAME = "神雕后传"

  199. #==============================================================================
  200. # ■ Win32API
  201. #------------------------------------------------------------------------------
  202. #  需要用到的API
  203. #==============================================================================

  204. # 切换到全屏延时
  205. SWITCH_DELAY = 0.1

  206. # API使用的一些常数
  207. WS_EX_TOPMOST = 0x8
  208. WS_EX_TOOLWINDOW= 0x80
  209. WS_VISIBLE = 0x10000000
  210. WS_POPUP = 0x80000000
  211. GWL_HINSTANCE = (-6)
  212. WM_CLOSE = 0x10
  213. WS_CHILD = 0x40000000
  214. WS_NONE = 0x16000000
  215. CP_ACP = 0
  216. CP_UTF8 = 65001

  217. # 字符编码转换API
  218. $MP_m2w = Win32API.new('kernel32', 'MultiByteToWideChar', '%w(i,l,p,i,p,i)', 'i')
  219. $MP_w2m = Win32API.new('kernel32', 'WideCharToMultiByte', '%w(i,l,p,i,p,i,p,p)', 'i')
  220.   
  221. # 按键API
  222. $MP_keybd = Win32API.new('user32', 'keybd_event', '%w(i,i,l,l)', 'v')

  223. # 视频播放API
  224. $MP_mciSendString = Win32API.new('winmm','mciSendString','%w(p,p,l,l)','V')

  225. # 锁定窗口
  226. # hWnd,ifEnable
  227. $MP_EnableWindow = Win32API.new('user32','EnableWindow','%w(l,l)','L')

  228. # 激活窗口
  229. # hWnd
  230. $MP_SetActiveWindow = Win32API.new('user32','SetActiveWindow','%w(l)','L')

  231. # 当前活动窗口
  232. $MP_GetActiveWindow = Win32API.new('user32','GetActiveWindow','%w()','L')

  233. # hWnd,wMsg,wParam,lParam
  234. $MP_PostMessage = Win32API.new('user32','PostMessage','%w(l,l,l,p)','L')

  235. # 获取当前窗口句柄
  236. $MP_FindWindowEX = Win32API.new('user32','FindWindowEx','%w(l,l,p,p)','L')

  237. # 获取屏幕坐标
  238. $MP_ClientToScreen = Win32API.new("user32", "ClientToScreen", 'ip', 'i')

  239. # 获取hInt
  240. $MP_GetWindowLong= Win32API.new('user32','GetWindowLong','%w(l,l)','L')

  241. # 获取类名
  242. # hWnd,lpClassName,maxCount
  243. $MP_GetClassName= Win32API.new('user32','GetClassName','%w(l,p,l)','L')

  244. # 建立窗体
  245. # ExStyle,ClassName,WindowName,
  246. # style,x,y,width,height
  247. # 0,0,hInstance,0
  248. $MP_CreateWindowEX = Win32API.new('user32','CreateWindowEx','%w(l,p,p,l,l,l,l,l,l,l,l,p)','L')

  249. #==============================================================================
  250. # ■ MoviePlayer
  251. #------------------------------------------------------------------------------
  252. #  处理视频播放画面的类。
  253. #==============================================================================

  254. class MoviePlayer
  255. #--------------------------------------------------------------------------
  256. # ● 初始化
  257. #     project_name : 工程名称
  258. #--------------------------------------------------------------------------
  259. def initialize(project_name = PROJECT_NAME)
  260.    @sys_timer=SystemTimer.new()
  261.    buffer = "\0\0" * project_name.size
  262.    @project_name = "\0" * project_name.size
  263.    
  264.    $MP_m2w.call(CP_UTF8, 0, project_name, -1, buffer, project_name.size)
  265.    $MP_w2m.call(CP_ACP,0,buffer,-1,@project_name,project_name.size,0,0)
  266.    
  267.    @hWnd = $MP_FindWindowEX.call(0,0,nil,@project_name)
  268.    @hInt = $MP_GetWindowLong.call(@hWnd,GWL_HINSTANCE)
  269.    @class_name = " " * 256
  270.    $MP_GetClassName.call(@hWnd,@class_name,256)
  271. end
  272. #--------------------------------------------------------------------------
  273. # ● 是否已经全屏幕
  274. #--------------------------------------------------------------------------
  275. def is_full?
  276.    # 播放起始坐标
  277.    point = [0, 0].pack('ll')
  278.    if $MP_ClientToScreen.call(@hWnd, point) == 0
  279.      return false
  280.    end
  281.    x, y = point.unpack('ll')
  282.    if x == 0 and y == 0
  283.      return true
  284.    else
  285.      return false
  286.    end
  287. end
  288. #--------------------------------------------------------------------------
  289. # ● 切换全屏
  290. #--------------------------------------------------------------------------
  291. def switch_full
  292.    $MP_keybd.call (0xA4, 0, 0, 0)
  293.    $MP_keybd.call (13, 0, 0, 0)
  294.    $MP_keybd.call (13, 0, 2, 0)
  295.    $MP_keybd.call (0xA4, 0, 2, 0)
  296.    Graphics.update
  297.    sleep(SWITCH_DELAY)
  298.    Graphics.update
  299. end
  300. #--------------------------------------------------------------------------
  301. # ● 播放电影
  302. #     movie_name : 视频文件名(*.avi)
  303. #     movie_length : 电影时间,单位是秒
  304. #     skip : 是否可以按键跳过
  305. #     fullscr : 是否强制为全屏幕播放
  306. #     x,y,width,height: 播放的位置以及宽度
  307. #     loop : 循环播放
  308. #--------------------------------------------------------------------------
  309. def play(movie_name,movie_length,
  310.           skip = true,fullscr = false,
  311.           x = 0,y = 0,width = 640,height = 480,loop = true)
  312.    # 数据不合法则退出
  313.    return true if movie_name == nil or movie_length <= 0
  314.    # 文件不存在
  315.    #.........................................................................
  316.    #movie_name = Dir.getwd()+"\\"+movie_name
  317.    #.........................................................................
  318.    return true unless FileTest.exist?(movie_name)

  319.    # 窗口宽度
  320.    width -= (x + width)- 640 if (x + width) > 640
  321.    height -= (y + height)- 480 if (y + height) > 480
  322.    
  323.    if fullscr and !is_full?
  324.      self.switch_full
  325.    end
  326.    
  327.    fullscr = self.is_full?
  328.    
  329.    # 播放起始坐标
  330.    point = [x, y].pack('ll')
  331.    if $MP_ClientToScreen.call(@hWnd, point) == 0
  332.      return true
  333.    end
  334.    x, y = point.unpack('ll')
  335.    return true  if (x + width) < 0 or (y+height) < 0
  336.    
  337.    if fullscr
  338.      wnd = $MP_CreateWindowEX.call(WS_EX_TOPMOST,@class_name,@project_name,
  339.                                    WS_VISIBLE | WS_POPUP,x,y,width,height,
  340.                                    0,0,@hInt,0)
  341.    else
  342.      wnd = $MP_CreateWindowEX.call(WS_EX_TOOLWINDOW,@class_name,@project_name,
  343.                                    WS_VISIBLE | WS_POPUP,x,y,width,height,
  344.                                    0,0,@hInt,0)
  345.    end                              
  346.    # 窗体建立失败
  347.    return true if wnd == 0
  348.    
  349.    # 屏蔽原窗体
  350.    $MP_EnableWindow.call(@hWnd,0)
  351.    
  352.    $MP_mciSendString.call("open \"" + movie_name + "\"" +
  353.                           " alias FILE style 1073741824 parent " +                           wnd.to_s,0,0,0)
  354.    if loop
  355.      $MP_mciSendString.call("play FILE repeat window",0,0,0)
  356.    else
  357.      $MP_mciSendString.call("play FILE window",0,0,0)
  358.    end
  359.    
  360.    @sys_timer.clear()
  361.    step = 0.1
  362.    begin
  363.      loop do
  364.        # 如果在窗口模式
  365.        unless fullscr
  366.          # 变成全屏
  367.          if self.is_full?
  368.            break
  369.          else
  370.            Graphics.update
  371.          end
  372.        end
  373.        #sleep(step)
  374.        if skip
  375.          Input.update
  376.          break if Input.trigger?(Input::A)
  377.        end
  378.        if @sys_timer.now_s >= movie_length
  379.          break
  380.        end
  381.        if $MP_GetActiveWindow.call() != wnd
  382.          $MP_SetActiveWindow.call(wnd)
  383.        end
  384.      end
  385.    rescue Hangup
  386.      retry
  387.    end
  388.    # 关闭当前窗体
  389.    $MP_PostMessage.call(wnd,WM_CLOSE,0,0)
  390.    $MP_mciSendString.call("close FILE",0,0,0)
  391.    $MP_EnableWindow.call(@hWnd,1)
  392.    $MP_SetActiveWindow.call(@hWnd)
  393.    return true
  394. end
  395. end

  396. $MP = MoviePlayer.new
复制代码





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