查看: 1739|回复: 2

[已经解决] 请教两个RGSS的生僻问题

[复制链接]
梦石
0
星屑
4761
在线时间
285 小时
注册时间
2013-10-13
回帖
580
发表于 2014-11-26 11:52:45 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 RyanBern 于 2014-11-26 11:58 编辑

第一个问题:
一方面:
[pre lang="Ruby"]@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))[/pre]
读出的地图数据储存了地图事件数据events,是<RPG::Event>的数据;
[pre lang="Ruby"]for i in @map.events.keys
      @events = Game_Event.new(@map_id, @map.events)
end[/pre]
读取地图事件的主键值,作为参数,再设置一个实变量events的哈希表储存Game_Event对象;
另一方面:
[pre lang="Ruby"]@map_interpreter = Interpreter.new(0, true)[/pre]
问题来了,事件怎么和编译器联结在一起的呢?例如,执行“重新设置窗口”内容,而执行语句是包含在事件中的,那么编译器是对事件的执行语句进行编译还是对事件进行编译?于是,我想,编译器要编译执行内容,首先要和事件连结起来,因为执行内容list是事件events的属性。我这样的理解对吗?
第二个问题:
Scene_File类中:
[pre lang="Ruby"]def main
    # 生成帮助窗口
    @help_window = Window_Help.new
    @help_window.set_text(@help_text)
end[/pre]
Window_Help类中:
[pre lang="Ruby"]def set_text(text, align = 0)
    # 如果文本和对齐方式的至少一方与上次的不同
    if text != @text or align != @align
      # 再描绘文本
      self.contents.clear
      self.contents.font.color = normal_color
      self.contents.draw_text(4, 0, self.width - 40, 32, text, align)
      @text = text
      @align = align
      @actor = nil
    end
    self.visible = true
end[/pre]
我的问题是:@help_window.set_text(@help_text)的参数传递给 set_text(text, align = 0),那么,参数数目不同怎么能进行传递?不是需要参数数目相同才能进行传递么?

无限の剣制

梦石
0
星屑
10450
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

发表于 2014-11-26 12:06:07 | 显示全部楼层
第一个问题:啥???
第二个问题:set_text(text, align = 0)中[align = 0]是设置默认值,作用是调用这个方法时未传入该参数时作为默认值

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2014-11-26 12:13:36 | 显示全部楼层
1.首先要理解一下,什么是Interpreter。
LZ提到的“编译器”,实际指的应该是“Interpreter”吧,这个可不叫编译器,而应该称作为“解释器”。
编译器有专有的含义,英文名对应的是“Compiler”,它的作用是编译你手动写的代码以供机器使用。←这句话可以不看
因此,通俗来讲,解释器的作用就是把一条条指令变为实际应该做的事情,这是考虑到RGSS的数据结构。在RGSS中,类RPG::Event里面存储的是有关地图事件的数据,注意,它存储的只是数据,而不是执行的代码。这个数据存在@list实例变量中,这个你应该是知道的。我们暂且把存储在@list里面的东西叫做一条条“指令”(注意,指令的本质是数据而非代码),那么,装载地图的时候,实际上是把这些数据装载进去了,那么,这些指令怎么变成代码的呢?这就需要解释器。
每一条指令大概可分为两部分内容,指令编号(code)和参数(parameters),这样,一条指令的内容就可以完全确定了。你可以看下Interpreter(1~7)的内容,里面大多都是写的对不同指令编号的处理方法,这里才是真正的代码区域。
2.有一种东西叫做默认参数,在这里,set_text的第二个参数就是默认参数,如果你给了两个参数,那么它接受你给的两个参数运行,如果你只给了一个参数,那么第二个参数有默认值0,它就会按照你给的第一个参数+第二个参数的默认值执行。
具体有关参数的知识,可以看这个:
https://rpg.blue/forum.php?mod=v ... p;page=1#pid2519334

点评

看到编译器我就瞬间懵了……斑斑大高手啊!学会了新东东了!膜拜 m(_ _)m  发表于 2014-11-30 23:58
谢谢斑竹的热心指点,很多新手都找不到教程的  发表于 2014-11-26 21:44
其实所有的代码不都是数据么= =我们有萌萌的 ecx, eip ……  发表于 2014-11-26 17:22
我看了“编译器”也是愣了半天才理解LZ的话  发表于 2014-11-26 12:21
“编译器”吓尿。"喵呜是一个丧失"这点绝对是真的。嗯  发表于 2014-11-26 12:18
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部