一次在網上下載遊戲,同人的仙劍奇俠傳。不知不覺玩了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(,,,)