Project1
标题: 写个教程里的脚本作业写晕了 [打印本页]
作者: 应答 时间: 2021-11-6 13:58
标题: 写个教程里的脚本作业写晕了
教程给了一个实践作业,说制作剧情提示的画面,我按照上面的步骤给它做完了
脚本全文是这样:
#---
# ∩ 故事阶段提示
#---
#---
# ∩ 设定选项名称与故事内容
#---
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
#---
# ∩ 故事阶段提示
#---
#---
# ∩ 设定选项名称与故事内容
#---
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
我的问题是,这个窗口是怎么显示出来的,我没有看到显示窗口的语句
比如说Scene_Menu里,它的start中有
def start
super
create_command_window
create_gold_window
create_status_window
end
def start
super
create_command_window
create_gold_window
create_status_window
end
这里的三个create什么什么的后面都被定义了。我的理解是,这三个函数直接被调动了,所以在Menu场景中显示了命令、金钱与状态三个窗口
可在我写的脚本中,Window_Gushi在描述窗口的属性并且让窗口成为有效状态,而Scene_Gushi就只是super了父类,然后把实例变量@gushi_window变成了Window_Gushi的一个实例,不是没有调动任何函数来显示窗口吗?
还有一个问题就是,我看默认的脚本当中,窗口的很多属性都是在Scene里定义的,比如Scene_Menu:
#--------------------------------------------------------------------------
# ● 生成物品窗口
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# ● 生成物品窗口
#--------------------------------------------------------------------------
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
为啥我的脚本就都是在window里定义的……
这些问题或许很笨吧,但我是真的晕了,好难啊
实际操作的时候,感觉教程里讲的东西少之又少,随便拿个脚本就通篇都是疑问……
对我来说,想要自己编写好用的脚本,至少也得一年以后吧
作者: 应答 时间: 2021-11-6 14:02
网上不是有个段子,说:
「你看,这是1,现在我们给它再加上一个1,好了,现在它等于2了,很简单吧。
那么,让我们来挑战一些稍微有点难度的吧:
——请证明哥德巴赫猜想。」
我看完教程自己编写脚本真就这种感觉
作者: KB.Driver 时间: 2021-11-6 15:04
预期效果是,菜单选项中有一个“故事”选项,选择后进入故事场景(Scene_Gushi)
那么先要找到菜单的指令窗口,添加【故事】这个选项
这里为【故事】这个选项设置了一个符号叫 :gushi,
接下来要告诉指令窗口如果碰到符号为 :gushi这个的请求要怎么处理
RM的窗口设计,涉及OOP,详细的不解释了,结论就是:
为了复用窗口,减少重复编写代码,就要把业务逻辑写在“窗口之外”
RM的做法是为窗口对特定符号绑定处理的方法,这个方法是写在“窗口之外”的,也就是场景(Scene)
这里的符号、绑定就是为了能够用窗口去调用“窗口之外”(场景)的方法
前面为【故事】这个选项设置了符号为 :gushi,35行为 :gushi绑定command_gushi这个方法
command_gushi的内容就是转到故事场景(Scene_Gushi)
这样一来,就实现了【菜单选项中有一个“故事”选项,选择后进入故事场景(Scene_Gushi)】
最后一个问题,RM默认代码在场景里设置窗口,你的代码在窗口里面设置。
原因在前面讲了,RM默认的做法是要最大限度的“通用”,所以窗口里面很简单,所有特性都在窗口之外也就是场景来添加。
而自己新加的代码,通常都是定制化的,也就没有太高的复用需要,因此直接在窗口内部写好就可以让场景的代码变得简洁。
(用OOP的话来说,完成了窗口的封装,场景就不需要关注窗口的细节了)
作者: guoxiaomi 时间: 2021-11-6 16:09
rgss有几个特殊的类,会“自动”在窗口上绘制内容。典型特征是initialize时需要传入viewpoint,拥有dispose方法和visible属性。在f1的内部类里也可以看到相应的说法
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |