现在的位置: 首页 > 综合 > 正文

RPGMAKER XP 脚本实践

2013年08月12日 ⁄ 综合 ⁄ 共 2993字 ⁄ 字号 评论关闭

    一次在网上下载游戏,同人的仙剑奇侠传。不知不觉玩了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,就当是看完这些无聊的文一种安慰。

# ————————————————————————————————————
# 本脚本来自www.66rpg.com,已修给,请保留此信息
# ————————————————————————————————————

class Play_Movie
def initialize(movie,exit_to_game=true)
  @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  @movie_name = "Movies/"+movie
  @exit_to_game = exit_to_game
end
def main
  
  game_name = "/0" * 256
  @readini.call('Game','Title','',game_name,255,".//Game.ini")
  game_name.delete!("/0")
  Graphics.transition
  
  @wnd = Win32API.new('user32','FindWindowEx','%w(l,l,p,p)','L')
  @hWnd = @wnd.call(0,0,nil,game_name)

  @ShowCursor = Win32API.new("user32", "ShowCursor", 'i', 'l')
  @SetCursorPos = Win32API.new("user32", "SetCursorPos", 'i,i', 'l')
  
  @movie = Win32API.new('play','PlayMovieInWindow','%w(l,p)','i')
  @stopm = Win32API.new('play','CloseClip',nil,'V')
  @message = Win32API.new('user32','SendMessage','%w(l,l,l,l)','V')
 # 全屏有待完成
  @detector = Win32API.new('user32','GetSystemMetrics','%w(l)','L')
   #尽管不支持全屏,但是以后还要有的。
    @width = @detector.call(0)
      if @width == 640
        fullscreen
        Graphics.update
        sleep(1)
        Graphics.update
        sleep(1)
        Graphics.update
        sleep(1)
  end
  @message.call(@hWnd,6,1,0)
  Graphics.update
     @ShowCursor.call(0)
     @SetCursorPos.call(-100,-100)#无可奈何的办法
     @counter = @movie.call(@hWnd,@movie_name)

     #p @counter.to_s
  loop do
    sleep(1)
    @message.call(@hWnd,11,0,0)
    Graphics.update
    @message.call(@hWnd,11,1,0)

    Input.update
    if Input.trigger?(Input::B)
      break
    end
    @counter = @counter - 1
    if @counter <= 0
      break
    end
  end
  @stopm.call()
  @Pmovie = true
  if @exit_to_game
    #$scene = $game_map.events.values
    $scene = Scene_Map.new
  else
    $scene = Scene_Title.new
  end 
 # Graphics.freezea
 @message.call(@hWnd,6,1,0)
  if @width == 640
    fullscreen
  end
end
end
def 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)
end
$full = Win32API.new('user32','keybd_event','%w(l,l,l,l)','')

抱歉!评论已关闭.