一次在网上下载游戏,同人的仙剑奇侠传。不知不觉玩了4个小时,剧情早已都了然与心,到了镇妖塔的时候玩不下去。前面放掉的经验值实在太多。这类同人游戏在网上自然没有什么修改器,但我也惊讶于与我年纪相仿的兄弟既然可以做出如此好的游戏。看了说明,原来他是使用rpgmaker 做的,自己也照猫画虎做起游戏。
RPGMAKER XP 1.02
使用ruby脚本语言,非常好的扩展性,可以做出很多类型游戏。
美中不足的是,与windows联系不很紧密,联系由扩展的win32api脚本来完成。例如电影播放使用起来就很麻烦,66rpg论坛提出的方法用mcistringsend,通过句柄联系,这样不会跳出一个窗口来,也有人用delphi写了使用mcicommand的dll。不过画面总是从左上角开始并且没有做到640*480 比例扩大。
自己也写了个dll。义不容辞使用directshow,因为没有接触过,写完以后发现难点不是在这个dll,而是ruby脚本!
这是一个糟糕的电影播放器的例子,因为是个dll
1、不支持全屏:没写,根据调查好像很多人都不喜欢640*480全屏显示。
2、有鼠标问题:用了个很猥琐的方法解决,但是如果用了鼠标脚本,会发现一个bug(不是脚本冲突)。
3、不能失去焦点:一旦播放电影时,鼠标焦点不在屏幕内……默默地等影片结束吧。
4、关键问题:难以解决的第一次播放动画黑屏的问题,这个问题不知道这否是特例?!@#$%。
我用的是K-Lite Codec Pack 解码包(类似暴风之类,国外的,没有广告……)。
p4 1.7GHz/sdram 256M/tnt2pro 32M/i845G……。
第二次开始则很好的播放了……传说中的原因为(通俗说法) divx还没预热好,电影就播放了。。应该是我的程序的问题……在用win32asm写的调用程序里是一切正常的……为什么在rpgxp里……~!@#$%。程序为我网络硬盘的testdll.rar。
电影宽度问题:默认的是硬性将所播放的电影宽定为640,高按比例减小或扩大正中显示。
最后不得不提的脚本问题,回到游戏时。如何回到所中断的状态,是个需要解决的问题。
说一下结构体,过去问过这个问题,现在自己解决
比如:
RECT STRUCT
left dd ?
top dd ?
right dd ? <-----width
bottom dd ?
RECT ENDS
那么先定义:
rect = [0, 0, 0, 0].pack('l4') #4个dword 于是乎使用直接为:
width = rect.unpack('l4')[2]
width, height = rect.unpack('l4')[2..3]
windows下所有的类型是32位 dword。高级语言为了编程方便分出一大堆类型,所以大家在msdn上查到的结构体可以直接按这个方法使用了。
最后说点题外话,我觉得Overture是个不错音乐软件,尽管大多钢琴,不过写谱子的人真多。
下载http://www.popiano.net/dp.htm 。可以导出为midi。压缩包里有导出的几个喜欢的midi,就当是看完这些无聊的文一种安慰。
Play_Movie (movie,exit_to_game=) @readini = Win32API.new , , %w(p p p p l p), @movie_name = +movie @exit_to_game = exit_to_game main game_name = * 256 @readini.call(,,,game_name,255,) game_name.delete!() Graphics.transition @wnd = Win32API.new(,,,) @hWnd = @wnd.call(0,0,,game_name) @ = Win32API.new(, , , ) @ = Win32API.new(, , , ) @movie = Win32API.new(,,,) @stopm = Win32API.new(,,,) @message = Win32API.new(,,,) @detector = Win32API.new(,,,) @width = @detector.call(0) @width == 640 fullscreen Graphics.update (1) Graphics.update (1) Graphics.update (1) @message.call(@hWnd,6,1,0) Graphics.update @.call(0) @.call(-100,-100) @counter = @movie.call(@hWnd,@movie_name) loop do (1) @message.call(@hWnd,11,0,0) Graphics.update @message.call(@hWnd,11,1,0) Input.update Input.trigger?(Input::B) break @counter = @counter - 1 @counter <= 0 break @stopm.call() @Pmovie = @exit_to_game $scene = Scene_Map.new $scene = Scene_Title.new @message.call(@hWnd,6,1,0) @width == 640 fullscreen fullscreen() $full.call(18,0,0,0) $full.call(13,0,0,0) $full.call(18,0,2,0) $full.call(13,0,2,0) $full = Win32API.new(,,,)