自己动手创建并居中窗口!

居中 Windows XP 窗口

作者:Kyonides

难度等级:中级

简介

本教程的唯一目的是向您展示如何轻松地随时将任意类型的窗口居中。

尽管如此,我们仍会快速回顾一些基本功能,以提醒您在游戏中创建或修改任何场景元素时需要注意的一些重要且不可避免的方面。

规划阶段

1 - 入门阶段

  • 显示窗口
  • 解冻/冻结图片
  • 创建循环
  • 更新方法

2 - 窗口创建

  • 窗口的基本元素
  • 传递参数
  • 创建位图与字符串
  • 绘制位图与字符串

3 - 修改窗口

  • 模块化与封装
  • 重新定位窗口
  • 通过创建可重用代码提高模块化
  • 居中窗口

入门阶段

根据您的最终目标可选

注意: 如果您只是打算修改默认脚本,可能不需要经过此阶段。

步骤 1 - 要正确显示窗口,我们需要一个场景。

摘要

引擎中有很多场景,但创建一个全新的场景可以让您只专注于我们的新窗口。

以下是我们新场景的骨架:

class Scene_Test
end

遵循古老的 RM 类命名约定,我们的场景被称为 Scene_Test。
class 关键字让我们可以创建一个可以多次复制的新对象。

这为什么很重要?

因为如果没有它,我们可能被迫只绘制该场景的最后一个状态,而不是按需获取一个全新的场景。
您不希望每次按下取消按钮时都只打开物品栏或装备菜单,对吧?
您希望显示一些选项。因此,这里您需要一个类。

现在我们有了一个类,接下来该做什么呢?

步骤 2 - 解冻/冻结屏幕上的所有图片。

摘要

class Scene_Test
def main
Graphics.transition
# 此处添加一些代码
Graphics.freeze
end
end

def 表示我们正在定义一个方法,该方法将属于我们自定义的场景类。

在这里我们定义了 main 方法。这是所有场景都必须具备的方法,以便能够继续运行我们的游戏。如果缺少此方法,这里很快就会抛出错误。

我们需要调用 Graphics 模块中定义的 transitionfreeze 方法,以便在前一个场景、我们的场景和下一个场景之间实现无缝过渡。这是强制性的。

通常,这意味着离开地图,打开我们的场景,然后返回到当前地图。

步骤 3 - 为新场景创建一个循环。

摘要

class Scene_Test
def main
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
Graphics.freeze
end
end

我们为什么要创建循环

因为我们需要停留在当前场景中。否则,它会返回到地图。您很可能只会注意到地图事件短暂停止移动,然后就没有然后了。

为了保持场景流畅运行,我们需要更新两件事:

  • 图形
  • 输入

如果我们不刷新图形,制作工具很快就会告诉我们它卡住了。
如果不更新输入功能,我们的新场景将完全无用,除非我们从未打算让它具有交互性。

注意:通常,过渡场景根本不需要任何输入。相反,它们依赖于计时器。

我们还需要打破这个循环,否则我们将无法返回地图或您想到的任何其他场景。self 代表我们正在处理的当前场景(一个自定义的 Ruby 类)。

注意: 到目前为止,我们在屏幕上什么都看不到……除了一个告诉我们没有 update 方法的错误消息。

步骤 4 - 添加 update 方法。

摘要

class Scene_Test
def main
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
Graphics.freeze
end

def update
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
return
end
end
end

现在 update 方法存在了,我们可以离开空场景并返回到地图。

Input.trigger? 允许我们询问玩家是否按下并释放了一个按钮,在本例中是取消按钮。这就是触发按钮。在所有基于 RGSS 的引擎中,这些按钮由常量表示,如 A、B、C、SHIFT 等。它们都属于 Input 模块。引用运算符 :: 为我们建立了连接。

$game_system.se_play($data_system.cancel_se) 方法调用是 RMXP 依赖的用于在游戏中播放任何音效(SE)的长路径。在这种情况下,它播放取消音效。

$game_system 是我们正在运行的 Game_System 类的副本。
se_play 是它的一个方法。它负责播放音效。
$data_system 是系统选项卡内容的副本,已加载到内存中。
cancel_se 代表我们之前在系统选项卡中选择的取消音效变量。

如果我们从未添加这样的 if 语句(即我们的条件),我们就无法永远离开测试场景。:o
您不想通过暴力方式关闭游戏,对吧?:stuck_out_tongue:

return 代表返回到最初调用它的方法。在这种情况下,它是 main 方法内部的循环。

注意:请记住,目前我们在屏幕上只能看到一片漆黑。:wink:

在我的下一章中,我将开始处理定义实际窗口的内容。

2 个赞