设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3342|回复: 6
打印 上一主题 下一主题

[已经解决] 怎样让RMXP放视频动画

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2010-8-6
帖子
27
跳转到指定楼层
1
发表于 2010-8-19 12:43:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
怎样让RMXP放视频动画如果要脚本的话把脚本发过来

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2010-8-6
帖子
27
2
 楼主| 发表于 2010-8-19 12:47:49 | 只看该作者
加一句怎样使用
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-7-29
帖子
69
3
发表于 2010-8-19 14:55:12 | 只看该作者
本帖最后由 497406594 于 2010-8-19 18:24 编辑

下面是我自己在用的FLASH播放器,可以播放swf格式的
LZ可以先用格式工厂转换下格式,这个大家基本都知道怎么转了
之前用过AVI播放器,可是太麻烦了,弄到最后还是只听到声音,没了图像
这个好些,效果很不错,不过我自己遇到的一些问题就是,播放完之后要等1小点时间才能关掉
如果是转移场所的话他就立刻关了。这是我自己测试自己视频后得出的结论
不知道楼主会不会这样,我在最下面附上使用方法
  1. class String
  2.   
  3.   CP_ACP = 0
  4.   CP_UTF8 = 65001
  5.   
  6.   def u2s
  7.     m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
  8.     w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
  9.    
  10.     len = m2w.call(CP_UTF8, 0, self, -1, nil, 0)
  11.     buf = "\0" * (len*2)
  12.     m2w.call(CP_UTF8, 0, self, -1, buf, buf.size/2)
  13.    
  14.     len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  15.     ret = "\0" * len
  16.     w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
  17.    
  18.     return ret
  19.   end
  20.   
  21.   def s2u
  22.     m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
  23.     w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
  24.   
  25.     len = m2w.call(CP_ACP, 0, self, -1, nil, 0);
  26.     buf = "\0" * (len*2)
  27.     m2w.call(CP_ACP, 0, self, -1, buf, buf.size/2);
  28.   
  29.     len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
  30.     ret = "\0" * len
  31.     w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  32.      
  33.     return ret
  34.   end

  35.   def s2u!
  36.     self[0, length] = s2u
  37.   end  
  38.   
  39.   def u2s!
  40.     self[0, length] = u2s
  41.   end
  42.   
  43. end

  44. class Bitmap
  45.   
  46.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  47.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')

  48.   def address
  49.     buffer, ad = "xxxx", object_id * 2 + 16
  50.     RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
  51.     RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
  52.     RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")[0]
  53.   end
  54.   
  55. end

  56. class RMFlash

  57.         API_NEW                      = Win32API.new("RMFlash", "_new", "piil", "l")
  58.         API_UPDATE            = Win32API.new("RMFlash", "_update", "l", "v")
  59.         API_FREE              = Win32API.new("RMFlash", "_free", "l", "v")
  60.         API_PLAYING     = Win32API.new("RMFlash", "_is_playing", "l", "i")
  61.         API_PAUSE              = Win32API.new("RMFlash", "_pause", "l", "v")
  62.         API_RESUME            = Win32API.new("RMFlash", "_resume", "l", "v")
  63.         API_BACK              = Win32API.new("RMFlash", "_back", "l", "v")
  64.         API_REWIND            = Win32API.new("RMFlash", "_rewind", "l", "v")
  65.         API_FORWARD            = Win32API.new("RMFlash", "_forward", "l", "v")
  66.         API_CURFRAME          = Win32API.new("RMFlash", "_cur_frame", "l", "i")
  67.         API_TOTALFRAME        = Win32API.new("RMFlash", "_total_frames", "l", "i")
  68.         API_GOTOFRAME          = Win32API.new("RMFlash", "_goto_frame", "li", "v")
  69.         API_GETLOOP                  = Win32API.new("RMFlash", "_get_loop", "l", "i")
  70.         API_SETLOOP                  = Win32API.new("RMFlash", "_set_loop", "li", "v")
  71.         API_CLEARALL          = Win32API.new("RMFlash", "_clear_all", "v", "v")
  72.   API_VALID       = Win32API.new("RMFlash", "_valid", "l", "i")
  73.   API_SENDMSG     = Win32API.new("RMFlash", "_send_message", "liii", "l")
  74.        
  75.   CUR_PATH        = Dir.pwd
  76.   
  77.         def self.get_version

  78.         end

  79.         def self.clear_all
  80.                 API_CLEARALL.call
  81.         end
  82.   
  83.   def self.load(name, width, height, v = nil)
  84.     new("#{CUR_PATH}/#{name}".u2s, width, height, v)
  85.   end
  86.   
  87.   attr_reader   :valid

  88.         def initialize(flash_name, flash_width, flash_height, viewport = nil)
  89.                 @sprite = Sprite.new(viewport)
  90.                 @sprite.bitmap = Bitmap.new(flash_width, flash_height)
  91.                 @value = API_NEW.call(flash_name, flash_width, flash_height, @sprite.bitmap.address)
  92.                 @loop = API_GETLOOP.call(@value) > 0
  93.     @valid = API_VALID.call(@value) > 0
  94.         end

  95.         def viewport
  96.                 @sprite.viewport
  97.         end

  98.         def update
  99.                 API_UPDATE.call(@value)
  100.         end

  101.         def dispose
  102.                 API_FREE.call(@sprite.bitmap.address)
  103.         end

  104.         def playing?
  105.                 API_PLAYING.call(@value) > 0
  106.         end

  107.         def pause
  108.                 API_PAUSE.call(@value)
  109.         end

  110.         def resume
  111.                 API_RESUME.call(@value)
  112.         end

  113.         def back
  114.                 API_BACK.call(@value)
  115.         end

  116.         def rewind
  117.                 API_REWIND.call(@value)
  118.         end

  119.         def forward
  120.                 API_FORWARD.call(@value)
  121.         end

  122.         def current_frame
  123.                 API_CURFRAME.call(@value)
  124.         end

  125.         def total_frames
  126.                 API_TOTALFRAME.call(@value)
  127.         end

  128.         def goto_frame(goal_frame)
  129.                 API_GOTOFRAME.call(@value, goal_frame)
  130.         end

  131.         def x
  132.                 @sprite.x
  133.         end

  134.         def x=(v)
  135.                 @sprite.x = v
  136.         end

  137.         def y
  138.                 @sprite.y
  139.         end

  140.         def y=(v)
  141.                 @sprite.y = v
  142.         end

  143.         def z
  144.                 @sprite.z
  145.         end

  146.         def z=(v)
  147.                 @sprite.z = v
  148.         end

  149.         def width
  150.                 @sprite.bitmap.width
  151.         end

  152.         def height
  153.                 @sprite.bitmap.height
  154.         end

  155.         def loop?
  156.                 @loop
  157.         end

  158.         def loop=(v)
  159.                 if @loop != v
  160.                         @loop = v
  161.                         API_SETLOOP.call(@value, v)
  162.                 end
  163.         end
  164.   
  165.   def msg_to_flash(msg, wParam, lParam)
  166.     return API_SENDMSG.call(@value, msg, wParam, lParam)
  167.   end
  168.   
  169.   #  例
  170.   WM_MOUSEMOVE  = 0x0200
  171.   
  172.   def make_long(a, b)
  173.     return (a & 0xffff ) | (b & 0xffff) << 16
  174.   end
  175.   
  176.   def on_mouse_move(x, y)
  177.     return msg_to_flash(WM_MOUSEMOVE, 0, make_long(x, y))
  178.   end

  179. end

  180. module Kernel

  181.   alias origin_exit exit unless method_defined? :exit
  182.   
  183.   def exit(*args)
  184.     RMFlash.clear_all
  185.     origin_exit(*args)
  186.   end
  187.   
  188. end

  189. #fls = RMFlash.load("2.swf", 640, 480)

  190. #while true
  191. #        Graphics.update
  192. #        Input.update
  193. #        fls.update
  194. #        break if Input.trigger?(13)
  195. #end
  196. #fls.dispose

  197. #exit

  198. =begin
  199. class RMFlash
  200.   API_NEW = Win32API.new("RMFlash", "_new", "piil", "l")
  201.   API_UPDATE = Win32API.new("RMFlash", "_update", "l", "v")
  202.   API_FREE = Win32API.new("RMFlash", "_free", "l", "v")
  203.   #def self.new(*args)
  204.   #  obj = super(*args)
  205.   #  obj.send :initialize, *args
  206.   #  obj
  207.   #end
  208.   
  209.   def initialize(flashname, fw, fh)
  210.    
  211.   end
  212.   
  213. end

  214. RMFlash.new
  215. exit
  216. =end
复制代码
楼主可以按照这个来调整,我自己感觉这样最佳
把2句脚本语言发给你好了  Graphics.frame_rate = 40
fls = RMFlash.load("3.swf",640,480)
fls.x = 0
fls.y = 0
fls.loop = 1
while true
        Graphics.update
#        Input.update
        fls.update
        break if !fls.playing?
#        break if Input.trigger?(13)
end
fls.dispose
上面那个3.swf可以换成你的文件名,只需把文件放在游戏的文件夹就行

flash.rar (963.25 KB, 下载次数: 645) 刚才忘记了,把这个解压到原文件夹就OK
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
229
在线时间
596 小时
注册时间
2010-6-21
帖子
1218
4
发表于 2010-8-19 16:06:56 | 只看该作者
再送LZ一个和LZ不一样的播放脚本
  1. #==============================================================================
  2. # ☆★☆ AVI播放器 ☆★☆
  3. #------------------------------------------------------------------------------
  4. # - FantasyDR
  5. # - 2006.3.12
  6. #------------------------------------------------------------------------------
  7. # MSN: [email protected]
  8. #------------------------------------------------------------------------------
  9. # Note:
  10. #  
  11. #   1.在下方 PROJECT_NAME = 后面填写你的游戏工程名.
  12. #
  13. #   2.在游戏中,调用脚本事件播放你的视频文件,如果一行写不下可以在逗号后换行.
  14. #
  15. #   $MP.play(movie_name, movie_length,
  16. #            skip, fullscr,
  17. #            x, y, width, height, loop)
  18. #
  19. # 参数说明:
  20. #
  21. #     movie_name   : 视频文件名(*.avi),必须
  22. #     movie_length : 电影时间,单位是秒,必须
  23. #             skip : 是否可以按A键跳过,true/false,默认是true
  24. #          fullscr : 是否强制为全屏幕播放,true/false,默认是false
  25. #              x,y : 视频播放的左上角坐标,默认是0,0
  26. #     width,height : 视频的宽度,可以任意.默认是640,480
  27. #             loop : 循环播放,true/false,默认是true
  28. #
  29. # 例如播放logo.avi,时间13秒,禁止跳过,强制全屏,范围(是0,0)-(640,480),循环播放
  30. #        $MP.play("logo.avi",13,false,true)
  31. #==============================================================================

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

  33. PROJECT_NAME = "骑士の圣堂"

  34. #==============================================================================
  35. # ■ Win32API
  36. #------------------------------------------------------------------------------
  37. #  需要用到的API
  38. #==============================================================================

  39. # 切换到全屏延时
  40. SWITCH_DELAY = 0.1

  41. # API使用的一些常数
  42. WS_EX_TOPMOST = 0x8
  43. WS_EX_TOOLWINDOW= 0x80
  44. WS_VISIBLE = 0x10000000
  45. WS_POPUP = 0x80000000
  46. GWL_HINSTANCE = (-6)
  47. WM_CLOSE = 0x10
  48. WS_CHILD = 0x40000000
  49. WS_NONE = 0x16000000
  50. CP_ACP = 0
  51. CP_UTF8 = 65001

  52. # 字符编码转换API
  53. $MP_m2w = Win32API.new('kernel32', 'MultiByteToWideChar', '%w(i,l,p,i,p,i)', 'i')
  54. $MP_w2m = Win32API.new('kernel32', 'WideCharToMultiByte', '%w(i,l,p,i,p,i,p,p)', 'i')
  55.    
  56. # 按键API
  57. $MP_keybd = Win32API.new('user32', 'keybd_event', '%w(i,i,l,l)', 'v')

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

  60. # 锁定窗口
  61. # hWnd,ifEnable
  62. $MP_EnableWindow = Win32API.new('user32','EnableWindow','%w(l,l)','L')

  63. # 激活窗口
  64. # hWnd
  65. $MP_SetActiveWindow = Win32API.new('user32','SetActiveWindow','%w(l)','L')

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

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

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

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

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

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

  79. # 建立窗体
  80. # ExStyle,ClassName,WindowName,
  81. # style,x,y,width,height
  82. # 0,0,hInstance,0
  83. $MP_CreateWindowEX = Win32API.new('user32','CreateWindowEx','%w(l,p,p,l,l,l,l,l,l,l,l,p)','L')

  84. #==============================================================================
  85. # ■ MoviePlayer
  86. #------------------------------------------------------------------------------
  87. #  处理视频播放画面的类。
  88. #==============================================================================

  89. class MoviePlayer
  90.   #--------------------------------------------------------------------------
  91.   # ● 初始化
  92.   #     project_name : 工程名称
  93.   #--------------------------------------------------------------------------
  94.   def initialize(project_name = PROJECT_NAME)
  95.     @sys_timer=SystemTimer.new()
  96.     buffer = "\0\0" * project_name.size
  97.     @project_name = "\0" * project_name.size
  98.    
  99.     $MP_m2w.call(CP_UTF8, 0, project_name, -1, buffer, project_name.size)
  100.     $MP_w2m.call(CP_ACP,0,buffer,-1,@project_name,project_name.size,0,0)
  101.    
  102.     @hWnd = $MP_FindWindowEX.call(0,0,nil,@project_name)
  103.     @hInt = $MP_GetWindowLong.call(@hWnd,GWL_HINSTANCE)
  104.     @class_name = " " * 256
  105.     $MP_GetClassName.call(@hWnd,@class_name,256)
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ● 是否已经全屏幕
  109.   #--------------------------------------------------------------------------
  110.   def is_full?
  111.     # 播放起始坐标
  112.     point = [0, 0].pack('ll')
  113.     if $MP_ClientToScreen.call(@hWnd, point) == 0
  114.       return false
  115.     end
  116.     x, y = point.unpack('ll')
  117.     if x == 0 and y == 0
  118.       return true
  119.     else
  120.       return false
  121.     end
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   # ● 切换全屏
  125.   #--------------------------------------------------------------------------
  126.   def switch_full
  127.     $MP_keybd.call (0xA4, 0, 0, 0)
  128.     $MP_keybd.call (13, 0, 0, 0)
  129.     $MP_keybd.call (13, 0, 2, 0)
  130.     $MP_keybd.call (0xA4, 0, 2, 0)
  131.     sleep(SWITCH_DELAY)
  132.     for i in 1..3
  133.       Graphics.update
  134.     end
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # ● 播放电影
  138.   #     movie_name : 视频文件名(*.avi)
  139.   #     movie_length : 电影时间,单位是秒
  140.   #     skip : 是否可以按键跳过
  141.   #     fullscr : 是否强制为全屏幕播放
  142.   #     x,y,width,height: 播放的位置以及宽度
  143.   #     loop : 循环播放
  144.   #--------------------------------------------------------------------------
  145.   def play(movie_name,movie_length,
  146.            skip = true,fullscr = false,
  147.            x = 0,y = 0,width = 640,height = 480,loop = true)
  148.     # 数据不合法则退出
  149.     return true if movie_name == nil or movie_length <= 0
  150.     # 文件不存在
  151.     return true unless FileTest.exist?(movie_name)
  152.    
  153.     # 窗口宽度
  154.     width -= (x + width)- 640 if (x + width) > 640
  155.     height -= (y + height)- 480 if (y + height) > 480
  156.    
  157.     if fullscr and !is_full?
  158.       self.switch_full
  159.     end
  160.    
  161.     fullscr = self.is_full?
  162.    
  163.     # 播放起始坐标
  164.     point = [x, y].pack('ll')
  165.     if $MP_ClientToScreen.call(@hWnd, point) == 0
  166.       return true
  167.     end
  168.     x, y = point.unpack('ll')
  169.     return true  if (x + width) < 0 or (y+height) < 0
  170.    
  171.     if fullscr
  172.       wnd = $MP_CreateWindowEX.call(WS_EX_TOPMOST,@class_name,@project_name,
  173.                                     WS_VISIBLE | WS_POPUP,x,y,width,height,
  174.                                     0,0,@hInt,0)
  175.     else
  176.       wnd = $MP_CreateWindowEX.call(WS_EX_TOOLWINDOW,@class_name,@project_name,
  177.                                     WS_VISIBLE | WS_POPUP,x,y,width,height,
  178.                                     0,0,@hInt,0)
  179.     end                              
  180.     # 窗体建立失败
  181.     return true if wnd == 0
  182.    
  183.     # 屏蔽原窗体
  184.     $MP_EnableWindow.call(@hWnd,0)
  185.    
  186.     $MP_mciSendString.call("open \"" + movie_name + "\"" +
  187.                            " alias FILE style 1073741824 parent " +\
  188.                             wnd.to_s,0,0,0)
  189.     if loop
  190.       $MP_mciSendString.call("play FILE repeat window",0,0,0)
  191.     else
  192.       $MP_mciSendString.call("play FILE window",0,0,0)
  193.     end
  194.    
  195.     @sys_timer.clear()
  196.     step = 0.1
  197.     begin
  198.       loop do
  199.         # 如果在窗口模式
  200.         unless fullscr
  201.           # 变成全屏
  202.           if self.is_full?
  203.             break
  204.           else
  205.             Graphics.update
  206.           end
  207.         end
  208.         #sleep(step)
  209.         if skip
  210.           Input.update
  211.           break if Input.trigger?(Input::A)
  212.         end
  213.         if @sys_timer.now_s >= movie_length
  214.           break
  215.         end
  216.         if $MP_GetActiveWindow.call() != wnd
  217.           $MP_SetActiveWindow.call(wnd)
  218.         end
  219.       end
  220.       Graphics.update
  221.       # 关闭当前窗体
  222.       $MP_PostMessage.call(wnd,WM_CLOSE,0,0)
  223.       $MP_mciSendString.call("close FILE",0,0,0)
  224.       $MP_EnableWindow.call(@hWnd,1)
  225.       $MP_SetActiveWindow.call(@hWnd)
  226.       return true
  227.     rescue Hangup
  228.       retry
  229.     end
  230.   end
  231. end

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

点评

这个脚本曾经按要求试过了N多次,可惜都最后还是放不出,哭死  发表于 2010-8-19 17:00
如果我是一个美工就好啦!
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-7-21
帖子
139
5
发表于 2010-8-19 16:33:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
329
在线时间
890 小时
注册时间
2009-10-12
帖子
1829
6
发表于 2010-8-19 16:45:30 | 只看该作者
66 提到过这个问题,他除了建议使用播放avi动画的那个脚本,它还做了一个教程,就是连续播放图片。search一下看看。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
398
在线时间
972 小时
注册时间
2007-12-31
帖子
2137
7
发表于 2010-8-19 17:59:36 | 只看该作者
AVI播放器的高精度计时器呢……
Flash播放器的DLL和OCX呢
连续播放,小游戏+少、小图片倒还好,大一点在个别老机器上面跑不动

Flash播放器跳帧请先把影片转换成flv,导入到Flash,选择导入到场景啥的,总之不要用它提供的插件啥的,设置好尺寸和帧频,重要的就是帧频了,自制的Flash可以使用原帧频,电影之类的截下来就要使用30fps,然后输出,输出的swf大概跟flv差不多。
注意转码为flv时帧频也要对应好,不然速度也会有问题……

评分

参与人数 1星屑 +200 收起 理由
六祈 + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 14:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表