查看: 2468|回复: 4

[有事请教] 写个教程里的脚本作业写晕了

[复制链接]
梦石
0
星屑
282
在线时间
45 小时
注册时间
2021-5-25
回帖
41
发表于 2021-11-6 13:58:33 | 显示全部楼层 |阅读模式

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

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

×
教程给了一个实践作业,说制作剧情提示的画面,我按照上面的步骤给它做完了
脚本全文是这样:
[pre lang="ruby"]#---
# ∩ 故事阶段提示
#---
#---
# ∩ 设定选项名称与故事内容
#---
module Gushi
  Mingcheng = "故事"
  BLDY = 1 #变量号数
  GSNR = {

1  => "这是一个测试文本。",
2  => "这也是一个测试文本。"

}

end
#---
# ∩ 在菜单中添加「故事」选项
#---
class Window_MenuCommand
  alias add_gushi_command add_original_commands
  def add_original_commands
    add_gushi_command
    add_command(Gushi::Mingcheng,     :gushi)
  end
end
#---
# ∩ 添加「故事」选项所调用的端口
#---
class Scene_Menu
  alias create_command_gushi create_command_window
  def create_command_window
    create_command_gushi
    @command_window.set_handler(:gushi,     method(:command_gushi))
  end
  def command_gushi
    SceneManager.call(Scene_Gushi)
  end
end
#---
# ∩ 创建故事场景
#---
class Scene_Gushi < Scene_MenuBase
  def start
    super
    @gushi_window = Window_Gushi.new
    @gushi_window.set_handler(:cancel,     method(:return_scene))
  end
end
#---
# ∩ 绘制故事窗口
#---
class Window_Gushi < Window_Selectable
  def initialize
    super(0, 0, Graphics.width, Graphics.height)
    draw_text_ex(4, 0, Gushi::GSNR[$game_variables[Gushi::BLDY]])
    activate
  end
end[/pre]
我的问题是,这个窗口是怎么显示出来的,我没有看到显示窗口的语句
比如说Scene_Menu里,它的start中有
[pre lang="ruby"]  def start
    super
    create_command_window
    create_gold_window
    create_status_window
  end[/pre]
这里的三个create什么什么的后面都被定义了。我的理解是,这三个函数直接被调动了,所以在Menu场景中显示了命令、金钱与状态三个窗口
可在我写的脚本中,Window_Gushi在描述窗口的属性并且让窗口成为有效状态,而Scene_Gushi就只是super了父类,然后把实例变量@gushi_window变成了Window_Gushi的一个实例,不是没有调动任何函数来显示窗口吗?

还有一个问题就是,我看默认的脚本当中,窗口的很多属性都是在Scene里定义的,比如Scene_Menu:
[pre lang="ruby"]  #--------------------------------------------------------------------------
  # ● 生成物品窗口
  #--------------------------------------------------------------------------
  def create_item_window
    wy = @category_window.y + @category_window.height
    wh = Graphics.height - wy
    @item_window = Window_ItemList.new(0, wy, Graphics.width, wh)
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window
    @item_window.set_handler(:ok,     method(:on_item_ok))
    @item_window.set_handler(:cancel, method(:on_item_cancel))
    @category_window.item_window = @item_window
  end[/pre]
为啥我的脚本就都是在window里定义的……

这些问题或许很笨吧,但我是真的晕了,好难啊
实际操作的时候,感觉教程里讲的东西少之又少,随便拿个脚本就通篇都是疑问……
对我来说,想要自己编写好用的脚本,至少也得一年以后吧
梦石
0
星屑
282
在线时间
45 小时
注册时间
2021-5-25
回帖
41
 楼主| 发表于 2021-11-6 14:02:19 | 显示全部楼层
网上不是有个段子,说:
「你看,这是1,现在我们给它再加上一个1,好了,现在它等于2了,很简单吧。
那么,让我们来挑战一些稍微有点难度的吧:
——请证明哥德巴赫猜想。」
我看完教程自己编写脚本真就这种感觉
回复

使用道具 举报

梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2021-11-6 15:04:16 | 显示全部楼层
预期效果是,菜单选项中有一个“故事”选项,选择后进入故事场景(Scene_Gushi)

那么先要找到菜单的指令窗口,添加【故事】这个选项
QQ截图20211106145214.jpg

这里为【故事】这个选项设置了一个符号叫 :gushi,
接下来要告诉指令窗口如果碰到符号为 :gushi这个的请求要怎么处理





QQ截图20211106145455.jpg

RM的窗口设计,涉及OOP,详细的不解释了,结论就是:
为了复用窗口,减少重复编写代码,就要把业务逻辑写在“窗口之外”

RM的做法是为窗口对特定符号绑定处理的方法,这个方法是写在“窗口之外”的,也就是场景(Scene)
这里的符号、绑定就是为了能够用窗口去调用“窗口之外”(场景)的方法

前面为【故事】这个选项设置了符号为 :gushi,35行为 :gushi绑定command_gushi这个方法
command_gushi的内容就是转到故事场景(Scene_Gushi)

这样一来,就实现了【菜单选项中有一个“故事”选项,选择后进入故事场景(Scene_Gushi)】



最后一个问题,RM默认代码在场景里设置窗口,你的代码在窗口里面设置。
原因在前面讲了,RM默认的做法是要最大限度的“通用”,所以窗口里面很简单,所有特性都在窗口之外也就是场景来添加。

而自己新加的代码,通常都是定制化的,也就没有太高的复用需要,因此直接在窗口内部写好就可以让场景的代码变得简洁。
(用OOP的话来说,完成了窗口的封装,场景就不需要关注窗口的细节了)

点评

补充一个:窗口的示例初始化后,能够显示在屏幕上这点,是底层代码的功能(有个Window基类),从外部看有点像几个Sprite合在一起的高级Sprite  发表于 2021-11-6 15:22

评分

参与人数 1赞 +1 收起 理由
应答 + 1 认可答案

查看全部评分

用头画头像,用脚写脚本
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2021-11-6 16:09:39 | 显示全部楼层
rgss有几个特殊的类,会“自动”在窗口上绘制内容。典型特征是initialize时需要传入viewpoint,拥有dispose方法和visible属性。在f1的内部类里也可以看到相应的说法

评分

参与人数 1赞 +1 收起 理由
应答 + 1 认可答案

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部