RPGMAKER XP 脚本实践

本文介绍了作者使用RPGMAKER XP制作游戏的体验,探讨了其扩展性,特别是通过ruby脚本语言增强游戏功能。然而,作者在实现电影播放功能时遇到了困难,包括全屏支持、鼠标问题、焦点丢失以及播放黑屏等问题。文章分享了作者的解决方案,并讨论了在游戏返回时如何恢复中断状态的脚本挑战。此外,还提及了结构体的使用和推荐的音乐软件Overture。

    一次在网上下载游戏,同人的仙剑奇侠传。不知不觉玩了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)','')

RPGXP脚本学习大全101: 显示文章 102: 显示选择项 103: 数值输入的处理 104: 更改文章选项 105: 按钮输入的处理 106: 等待 108: 注释 111: 条件分歧 112: 循环 113: 中断循环 115: 中断事件处理 116: 暂时消除事件 117: 公共事件 118: 标签 119: 标签跳转 121: 开关操作 122: 变量操作 123: 独立开关操作 124: 计时器操作 125: 增减金钱 126: 增减物品 127: 增减武器 128: 增减防具 129: 替换队员 131: 更改窗口外观 132: 更改战斗 BGM 133: 更改战斗结束 ME 134: 更改禁止存档 135: 更改禁止菜单 136: 更改禁止遇敌 201: 场所移动 202: 设置事件位置 203: 画面卷动 204: 更改地图设置 205: 更改雾的色调 206: 更改雾的不透明度 207: 显示动画 208: 更改透明状态 209: 设置移动路线 210: 等待移动结束 221: 准备渐变 222: 执行渐变 223: 更改画面色调 224: 画面闪烁 225: 画面震动 231: 显示图片 232: 移动图片 233: 旋转图片 234: 更改图片色调 235: 图片消失 236: 天气设置 241: 演奏 BGM 242: 淡出 BGM 245: 演奏 BGS 246: 淡出 BGS 247: 记忆 BGM / BGS 248: 还原 BGM / BGS 249: 演奏 ME 250: 演奏 SE 251: 停止 SE 301: 战斗处理 302: 商店处理 303: 名称输入处理 311: 增减 HP 312: 增减 SP 313: 更改状态 314: 完全回复 315: 增减 EXP 316: 增减等级 317: 增减能力值 318: 增减特技 319: 变更装备 320: 更改角色姓名 321: 更改角色职业 322: 更改角色图形 331: 增减敌人 HP 332: 增减敌人 SP 333: 更改敌人状态 334: 敌人出现 335: 敌人变身 336: 敌人完全回复 337: 显示动画 338: 伤害处理 339: 强制行动 340: 战斗中断 351: 呼叫菜单画面 352: 呼叫存档画面 353: 游戏结束 354: 返回标题画面 355: 脚本
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值