RPGMAKER XP 腳本實踐

    一次在網上下載遊戲,同人的仙劍奇俠傳。不知不覺玩了4個小時,劇情早已都瞭然與心,到了鎮妖塔的時候玩不下去。前面放掉的經驗值實在太多。這類同人遊戲在網上自然沒有什麼修改器,但我也驚訝於與我年紀相仿的兄弟既然可以做出如此好的遊戲。看了說明,原來他是使用rpgmaker 做的,自己也照貓畫虎做起遊戲。

RPGMAKER XP 1.02

使用ruby腳本語言,非常好的擴展性,可以做出很多類型遊戲。

 

美中不足的是,與windows聯繫不很緊密,聯繫由擴展的win32api腳本來完成。例如電影播放使用起來就很麻煩,66rpg論壇提出的方法用mcistringsend,通過句柄聯繫,這樣不會跳出一個窗口來,也有人用delphi寫了使用mcicommanddll。不過畫面總是從左上角開始並且沒有做到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') #4dword 於是乎使用直接爲:

 

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(,,,)
發佈了31 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章