设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 八云紫
打印 上一主题 下一主题

[RMVX发布] 新手教程--从0开始学RGSS2(2013-09-21 修复索引地址)

  [复制链接]

Lv3.寻梦者

梦石
0
星屑
1185
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

61
发表于 2010-12-20 22:15:29 | 只看该作者
未完成的标准库参考手册,近期完成迭代部分:
http://rpg.blue/thread-162871-1-1.html

点评

继续装蒜……  发表于 2010-12-20 22:31
好厉害. 话说, 各种看不懂~~ > <  发表于 2010-12-20 22:30

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
283
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

62
 楼主| 发表于 2010-12-22 00:06:50 | 只看该作者
本帖最后由 八云紫 于 2010-12-23 00:18 编辑

Main

    Main 的含义和它的名字是一样的意思, "主要的". Main脚本在 VX 的脚本库, 乃至 XP 里都是一个很重要的脚本.
    让我们先来看看 Main 的内容.
  1. #==============================================================================
  2. # ■ Main
  3. #------------------------------------------------------------------------------
  4. #  各定义结束后,从这里开始实际处理。
  5. #==============================================================================

  6. # 一些常用的字体
  7. Font.default_name = ["SimHei", "黑体", "DFKai-SB", "標楷體", "Verdana", "Arial Unicode MS"]
  8. begin
  9.   Graphics.freeze
  10.   $scene = Scene_Title.new
  11.   $scene.main while $scene != nil
  12.   Graphics.transition(30)
  13. rescue Errno::ENOENT
  14.   filename = $!.message.sub("无此文件或文件夹 - ", "")
  15.   print("无法找到文件 #{filename}.")
  16. end
复制代码
重要的部分其实都已经说过了. 忘记的话, 就查查 F1 吧.
       Main 脚本里一个重点在于 begin .. rescue.. end 结构. 它的用处是当  begin .. rescue 中级部分出现异常(或者说是错误)的时候, 可以被我们捕获到. 这里捕获的是 "文件找不到" 这个异常. 这就是问什么当我们的素材缺失的时候, RM 会提醒我们什么文件找不到的错误.  具体的部分, 请看 RGSS2异常 部分.


VX 脚本的运行顺序

      Main 的位置标志着 RM 脚本的运行起点. 这里就简单的说说 RM 的脚本运行顺序吧. (其实我自己也不知道是不是这样, 不过八九不离十就是了 > <)
      解说之前要说明一下几点:
      1. 脚本的运行都是从脚本的第一个的第一行开始的.
      2. 遇到 class(类) def(方法) module(模块) 都不会主动运行, 除非你去调用它.
      3. 脚本都是按顺序执行的, 前提是满足执行条件.

      知道这些之后就可以开始说明脚本运行顺序了.
     1. 从右边脚本列表的第一个脚本的第一行开始执行.(是的, 很拗口.)
     2. 如果遇到 class 的话, 那么 RM 就知道这里是定义类的, 于是它将这个类名保存起来.
     3. 如果这个类有父类, 那么 RM 就会去之前的纪录里去查看有没有这个类, 有的话, 就指定它们的继承关系, 没有的话, 就会提示找不到这个类.
     4. def 方法 和 module 模块也是类似的.
     5. 默认的脚本在 Main 脚本之前都是 类 或者 模块 定义的, 所以在执行到 Main 之前都仅仅是扫描.
     6. 到达 Main 脚本后, 真正的执行就是从这里开始了.
     7. 由 Main 脚本的调用关系可以延伸到之前所定义的所有类.
     8. 当我们选择游戏结束的时候(也就是使用脚本来结束, 这里不包含 exit 和 点击右上角的那个红叉), 才会继续从 Main 脚本里脱离出来继续执行后面的内容.

     其实顺序大致就是这样的. 这里呢, 我们就可以注意到一些细节:
     1. 在 类 里面的 方法定义是不限制顺序的, 也就是说, 我们可以先使用, 然后再去定义这个方法的内容. 但是早整个脚本库里, 只能是使用到这个类之前的所有资源. 因为它之后的类啦什么的, 都是没有扫描记录的. 所以, RM 并不知道的它之后的内容是什么.
     2. 由于 Main 里的内容既不是 class module 也不是 def 定义, 它仅仅是一段脚本, 于是满足调用条件, 所以, 真正的脚本开端就是 Main 脚本.
     3. 除非使用到 exit 或者那个红叉来关闭 RM , 否则 Main 后面的内容也是会执行的. 就算是有错误, RM 也是会提醒. 所以, 在某个脚本不需要的情况下, 最好还是批量注释掉.
     4. 没有了吧, 大概.

点评

在退出的时候除了用exit之外还可以用$scene = nil,从而打破了那个while语句循环,然后main脚本继续往下执行,于是就结束退出了。  发表于 2010-12-23 23:24
如果.new被执行的时候就自动执行了相应Scene的installize部分内容,其中包括建立窗口等。 然后$scene.main才真正执行了main函数啊喵!  发表于 2010-12-23 23:23
$scene.main while $scene != nil 这一句,前面的 $scene = Scene_Title.new 就是预先定义好跳转标题画面的语句。 $scene = XXX.new等于设定了下一个场景的目标。  发表于 2010-12-23 23:22

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

狂気の月兔

梦石
0
星屑
276
在线时间
1245 小时
注册时间
2009-4-7
帖子
879

贵宾

63
发表于 2010-12-23 00:17:36 | 只看该作者
消灭烦人的连贴~
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
283
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

64
 楼主| 发表于 2010-12-23 00:18:37 | 只看该作者
本帖最后由 八云紫 于 2011-1-9 21:12 编辑

Window 窗口

    其实这个教程想了好久, 不知道该怎么写. 于是就照搬 F1 了, 只是更加进一步说明一下. 或者给点例子什么的.

    Window 窗口类
    游戏窗口的类。在内部由多重的精灵所组成。

    类方法
        Window.new([viewport])
        生成一个窗口物件。必要时指定一个显示端口(Viewport 显示端口类)。

       方法
       ★ dispose
       释放窗口。若窗口已释放则什么都不做。

       ★ disposed?
       当窗口已释放则返回 true。

       ★ update
       刷新光标的闪烁和暂停标记的动画。原则上每一画格调用一次。
       除非有使用光标或者是暂停标记, 其他的情况下, 没有必要调用这个方法. 起不到任何作用.

       属性
       ★ windowskin
       引用作为窗口外观的位图(Bitmap 位图类)。
       只能够使用 VX 的窗口外观。(RGSS2)
       VX 所使用的窗口素材与 XP 相比有很大的不同, 这个看素材就知道了.(其实是没有安装 XP , 也不好细说, 以后增加吧. 或者去看看有没有人写过这个~)
     
       ★ contents
       引用作为窗口内容的位图(Bitmap点阵图类)
       默认的 contents  的初始值其实是这个的:
  1. contents = Bitmap.new(0, 0, 1, 1)
复制代码
这个值分别在 Window_Base 和 Window_Selectable 的 create_contents 方法里被重新赋值.


       ★ viewport (RGSS2)
       引用与窗口关联的显示端口(Viewport显示端口类)。
       这里要非常的注意一个问题, Window 类里使用的viewport 其实就是在初始化的时候指定的那个. 如果之前的那个 viewport 被修改的话, 这里也会被修改.
  1. v = Viewport.new(0, 0, 100, 100)
  2. w = Window.new(v)
  3. p w.viewport.rect
  4. v.rect.x = 10
  5. p w.viewport.rect
复制代码


       ★ cursor_rect
       游标的矩形(Rect矩形类)以相对坐标 (-16, -16) 设置窗口的左上角。
       这里注意一下, 真实的测试效果和 F1 的说明不一致, 不知道是不是我的测试出问题了.
  1. w = Window.new()
  2. p w.cursor_rect
复制代码
得到的结果是 (0, 0, 0, 0) . 不是F1 里的 -16, -16.


       ★ active
       光标闪烁的状态。true 表示闪烁。

       ★ visible
       窗口可见的状态。true 表示可见。

       ★ pause
       暂停标记可见的状态。true 表示可见。

       ★ x
       窗口的 X 坐标。
      
       ★ y        
       窗口的 Y 坐标。

       ★ width
       窗口的宽度。

       ★ height
       窗口的高度。

       ★ z
       窗口的 Z 坐标。数值愈大的平面愈靠近玩家。Z 坐标相同的,最后生成的对象则会最靠近玩家。
       窗口背景和内容的 Z 坐标在 RGSS2 中不能使用不同的 Z 坐标。(RGSS2)

       ★ ox
       窗口内容的 X 坐标。滚动窗口时修改此数值。

       ★ oy
       窗口内容的 Y 坐标。滚动窗口时修改此数值。
       以上两个属性和 Sprite 的同名属性作用一样. 在不移动窗口位置的情况下, 仅仅是移动窗口的内容. 这个可以理解成 当角色在地图上行走的时候, 地图需要适应性的滚动, 但是 RM 的窗口的位置依旧不变一样.

       ★ opacity
       窗口的不透明度(0~255)。超出此范围的数值会自动修正。
       opacity 针对的是整个Window

       ★ back_opacity
       窗口背景的不透明度(0~255)。超出此范围的数值会自动修正。

       ★ contents_opacity
       窗口内容的不透明度(0~255)。超出此范围的数值会自动修正。

       ★ openness (RGSS2)
       窗口的开启程度(0~255)。超出此范围的数值会自动修正。
       将此数值从 0(完全关闭)至 255(完全开启)之间变换,可以产生窗口打开和关闭的动画效果。 openness 若低于 255,则不会显示其内容。默认值 255。
       Window 的内容只有在 openness  等于 255 的时候才能显示出来.

点评

额, 好吧, 笔误~~~  发表于 2011-1-9 21:11
★ windowskin 引用作为窗口外观的位图(Bitma 位图类)。  发表于 2011-1-9 21:09
Window_Message 里有用到. 对话的暂停的时候可以用的说~~  发表于 2010-12-23 09:21
怎么从来都没见过pause 0.0  发表于 2010-12-23 09:17

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

敌敌畏

梦石
0
星屑
80
在线时间
52 小时
注册时间
2008-5-12
帖子
1748
65
发表于 2010-12-23 14:54:59 | 只看该作者
本帖最后由 偶尔杀人越货 于 2010-12-23 14:57 编辑

帮你消灭一楼,等再出点帮你做个电子书,带图的那种。

点评

就咱的这个渣语言~~~  发表于 2010-12-23 20:15
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
283
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

66
 楼主| 发表于 2010-12-23 21:09:43 | 只看该作者
本帖最后由 八云紫 于 2010-12-23 22:18 编辑

Game 类应用<< 技能书脚本>>
  ★ 要实现的功能
  名字是 << 技能书脚本>> , 那么, 脚本的功能就是使用一个物品(技能书), 让被使用的角色可以学习到物品里指定的技能.

  ★ 初期问题
  1. 既然是物品, 那么就存在一个方法来实现这个物品的使用.
  2. 既然是技能书, 那么就应该有一个对应关系, 就是 物品 => 技能 . 也就说什么物品可以学习到什么技能.
  3. 物品可以使用, 那么技能也应该需要学习.
  4. 需要知道这个物品时给谁使用.

  ★ 初期运行步骤构思
  1. 使用物品
  2. 从使用的物品中取得某个资料
  3. 将这个资料通过某种方式转换成技能资料
  4. 获得被使用者的资料
  5. 让这个使用者学习到这个技能.

  ★ 初期资料收集
  1. 找到能实现 使用物品 的方法.
   于是全局搜索 "使用物品". 找到一些满足条件的.

    我们一个个来排除:
     ● Sound: 这个一定不是了. 看名字就知道是处理声音的.
     ● Game_Battler: 计算的方法, 也不是.
     ● Scene_Item 和 Scene_Skill : 看起来好像就是这里, 点进去一看, 其实是场景跳转什么的.
     ● Scene_Battle : 有两处. 我们想来看看第一个.
  1. when 2  # 使用物品
  2.       execute_action_item
复制代码
可能性很高. 于是继续查找 execute_action_item 这个方法.
  1. #--------------------------------------------------------------------------
  2.   # ● 执行战斗行动:使用物品
  3.   #--------------------------------------------------------------------------
  4.   def execute_action_item
  5.     item = @active_battler.action.item
  6.     text = sprintf(Vocab::UseItem, @active_battler.name, item.name)
  7.     @message_window.add_instant_text(text)
  8.     targets = @active_battler.action.make_targets
  9.     display_animation(targets, item.animation_id)
  10.     $game_party.consume_item(item)
  11.     $game_temp.common_event_id = item.common_event_id
  12.     for target in targets
  13.       target.item_effect(@active_battler, item)
  14.       display_action_effects(target, item)
  15.     end
  16.   end
复制代码
于是就找到了. 就是那个 target.item_effect(@active_battler, item). item_effect就是实现使用物品的方法.

  使用同样的方法可以查找到学习技能的方法: learn_skill.
  
  ★ 开始修改脚本
  1. 我们先从 item_effect 入手. 因为需要修改默认脚本的方法, 所以 alias 的作用很重要.
  1. alias old_item_2_skill_item_effect item_effect
复制代码
2. 然后写一个 item_effect 方法.
  1. def item_effect(user, item)
  2.     old_item_2_skill_item_effect(user, item)
  3.     item_id = item.id
  4.     skill_id = Item2Skill::Item_to_Skill[item_id]
  5.     return if skill_id == nil
  6.     skill_id.each do |id|
  7.       user.learn_skill(id)
  8.     end
  9.   end
复制代码
这里可以将 old_item_2_skill_item_effect 理解成旧的 item_effect. 调用 old_item_2_skill_item_effect 也就是调用 旧的 item_effect. 所以参数是一样的.
    3. 主要到  Item2Skill 这个模块了吗? 它的作用就是将 物品和技能联系在一样. 于是可以这么定义  Item2Skill 模块.
  1. module Item2Skill
  2.   Item_to_Skill = {
  3.     21 => [2],
  4.   }
  5. end
复制代码
第一个 21 是物品的ID号, 后面的 2 是要学习的技能ID. 使用数组的理由是可以添加多个技能ID.

    ★ 测试
    测试就不说了. 有错误改就是了.
  

点评

话说这个能纯事件吧……  发表于 2013-3-29 22:33
丫头,我辈拜服,再造之恩,回来再报  发表于 2010-12-23 21:20

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
12 小时
注册时间
2010-6-18
帖子
22
67
发表于 2010-12-24 10:38:15 | 只看该作者
万分的支持!!!!:hug:
[img=670,503]http://b203.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8ac17b005c660c0ba64143d23a389c6792ec452236fe44c91db2880ab8863d483d60a8f3c28a74172a339a31f2a2f88fd9a762443598074dbf7890ff9837beceba7cea91c25077cfdf2af830eb27d87b520bcb8d&a=204&b=203[/img]
人生是游戏充满BUG,而我偏执意开外挂.....
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
132 小时
注册时间
2010-9-30
帖子
100
68
发表于 2010-12-24 18:39:20 | 只看该作者
要好好学习了
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

69
发表于 2010-12-29 17:42:17 | 只看该作者
嘛现在主人网络杯具了咱来扯几句 ><

RGSSError RGSS错误

在试图访问一个无效(释放掉了或者尚未生成)的Sprite/Window/Plane/Tilemap时会抛出此异常

sp = Sprite.new
sp.dispose
sp.x = 1 #=>RGSSError

另一个比较常见的情况时尚未生成
例如

class Window_Test < Window_Base
  def initialize
    self.z = 100
    super(0,0,544,416)
  end
end
Window_Test.new #RGSSError
由于调用Window_Test.new,系统执行Window_Test的initialize
然后执行了self.z=,这时这个Window尚未生成(在Window顶层类的initialize里生成,需要用super调用上去),所以产生了错误
正确的写法应该是
class Window_Test < Window_Base
  def initialize
    super(0,0,544,416)
    self.z = 100
  end
end

评分

参与人数 1星屑 +200 收起 理由
八云紫 + 200 继续帮咱写吧~~~

查看全部评分

rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
211 小时
注册时间
2010-12-30
帖子
85
70
发表于 2010-12-30 08:31:16 | 只看该作者
支持,能不能整合成压缩包呢??我网页老打不开,卡死
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-21 21:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表