在一个我们研究了添加到窗体方法的选择,这个问题来研究窗体类的细节。

所有形式的父类的 Window_Base 四个参数需要初始化。

  #--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super
self.windowskin = Cache.system("Window")
update_padding
update_tone
create_contents
@opening = @closing = false
end

这四个參数表示窗体左上角的横纵坐标以及窗体的宽度与高度。

Window_Base 中还提供了绘制窗体的一整套方法。

比方说绘制文本(draw_text)、 绘制值槽(draw_gauge)、绘制图标(draw_icon)、绘制角色肖像图(draw_face)等等。

Window_Selectable 是拥有光标移动、滚动功能的窗体的父类。

当中定义了一些获得窗体中的绘制项目所需信息的方法。

比方获取列数(col_max)、获取行间距的宽度(spacing)、获取项目的宽度(item_width)等等。

Window_Selectable 类中还定义了处理光标在项目中移动以及选择的方法。

比方处理光标的移动(process_cursor_move)、“确定”和“取消”的处理(process_handling)等等。

Window_Command 的用法上一期已经讲过了。它另一个子类。Window_HorzCommand 表示能够横向选择的指令窗体。

仅仅要是继承自 Window_HorzCommand 的指令装口就是横向选择的。

我们发现尽管指令窗体能够横向选择,可是 Window_Selectable 的子类却仅仅能纵向选择。

所以如今參照 Window_HorzCommand 写一个 Window_HorzSelectable 来处理横向选择的窗体。

#encoding:utf-8
#==============================================================================
# ■ Window_HorzSelectable
#------------------------------------------------------------------------------
#  拥有横向光标移动、滚动功能的窗体
#============================================================================== class Window_HorzSelectable < Window_Selectable

横向与纵向的窗体差别有:

纵向窗体使用上下键切换选项;横向窗体使用左右键切换选项。

选项数量超过一页能显示的最大数量时。纵向窗体的上下边界会有三角箭头,而横向窗体的左右边界有三角箭头。

纵向窗体的选项是从起点向下绘制的;横向窗体的选项是从起点向右绘制的。

參考 Window_HorzCommand  将 Window_Selectable 中与以上三种差别有关的方法挑选出来在 Window_HorzSelectable 中重写。

  #--------------------------------------------------------------------------
# ● 获取列数
#--------------------------------------------------------------------------
def col_max
return 4
end
#--------------------------------------------------------------------------
# ● 获取行间距的宽度
#--------------------------------------------------------------------------
def spacing
return 8
end #--------------------------------------------------------------------------
# ● 获取首列位置
#--------------------------------------------------------------------------
def top_col
ox / (item_width + spacing)
end
#--------------------------------------------------------------------------
# ● 设置首列位置
#--------------------------------------------------------------------------
def top_col=(col)
col = 0 if col < 0
col = col_max - 1 if col > col_max - 1
self.ox = col * (item_width + spacing)
end
#--------------------------------------------------------------------------
# ● 获取尾列位置
#--------------------------------------------------------------------------
def bottom_col
top_col + col_max - 1
end
#--------------------------------------------------------------------------
# ● 设置尾列位置
#--------------------------------------------------------------------------
def bottom_col=(col)
self.top_col = col - (col_max - 1)
end #--------------------------------------------------------------------------
# ● 确保光标在画面范围内滚动
#--------------------------------------------------------------------------
def ensure_cursor_visible
self.top_col = index if index < top_col
self.bottom_col = index if index > bottom_col
end #--------------------------------------------------------------------------
# ● 计算窗体内容的宽度
#--------------------------------------------------------------------------
def contents_width
(item_width + spacing) * item_max - spacing
end
#--------------------------------------------------------------------------
# ● 计算窗体内容的高度
#--------------------------------------------------------------------------
def contents_height
item_height
end #--------------------------------------------------------------------------
# ● 获取项目的绘制矩形
#--------------------------------------------------------------------------
def item_rect(index)
rect = super
rect.x = index * (item_width + spacing)
rect.y = 0
rect
end #--------------------------------------------------------------------------
# ● 光标向下移动
#--------------------------------------------------------------------------
def cursor_down(wrap = false)
end
#--------------------------------------------------------------------------
# ● 光标向上移动
#--------------------------------------------------------------------------
def cursor_up(wrap = false)
end #--------------------------------------------------------------------------
# ● 光标移至下一页
#--------------------------------------------------------------------------
def cursor_pagedown
end
#--------------------------------------------------------------------------
# ● 光标移至上一页
#--------------------------------------------------------------------------
def cursor_pageup
end end

尽管 Window_Selectable 默认的是纵向选择的窗体,可是实际上当中定义了上下左右四个键的行为,并用 row_max 与 col_max 方法来控制行数与列数, 仅仅要改变这两个值就能够将它扩展为n*m的随意选择的窗体。

index 是用来表示选项编号的变量,它能够通过非常easy的公式与选项的行列号进行换算。

col = inex % col_max、row = index / col_max

这里我们设置一行最多4列,当索引超出当前的4列时。就须要 ensure_cursor_visible 方法来改变首列和尾列。使光标在画面范围内滚动。

top_col=(col) 等方法事实上非常坑,重载的=操作符改变了參数index的值。这不符合常理。

最后我们用空的方法替换了光标上下移动以及翻页的方法。这样就仅仅能用左右键来切换选项了。

最后来把游戏菜单画面改为横向吧。

这是默认的菜单画面:

Scene_Menu 中有三个窗体,排除金币窗体,菜单画面中显示指令的窗体与显示队伍成员状态的窗体都能够改为横向。

Window_MenuCommand 继承自 Window_Command。如今把它的父类改为 Window_HorzCommand。

然后改动一下 Window_MenuCommand 的窗体大小。

  #--------------------------------------------------------------------------
# ● 获取列数
#--------------------------------------------------------------------------
def col_max
return 7
end
#--------------------------------------------------------------------------
# ● 获取窗体的高度
#--------------------------------------------------------------------------
def window_height
return 48
end
#--------------------------------------------------------------------------
# ● 获取窗体的宽度
#--------------------------------------------------------------------------
def window_width
return Graphics.width
end

将窗体宽度改为与游戏窗体的宽度同样,高度为48,考虑到共同拥有7个选项。将最大列数设为7。

Window_MenuStatus 原本是 Window_Selectable 的子类。如今它的父类改为 Window_HorzSelectable。

接下来还是改动窗体的宽度与高度。

  #--------------------------------------------------------------------------
# ● 获取窗体的宽度
#--------------------------------------------------------------------------
def window_width
Graphics.width
end
#--------------------------------------------------------------------------
# ● 获取窗体的高度
#--------------------------------------------------------------------------
def window_height
Graphics.height - 96
end

尽管 Window_MenuStatus 的大小正确了,可是它的起点不正确。

在 Scene_Menu 把窗体的起始坐标初始化成正确的值。

  #--------------------------------------------------------------------------
# ● 生成状态窗体
#--------------------------------------------------------------------------
def create_status_window
@status_window = Window_MenuStatus.new(0, 48)
end

如今总体窗体框架已经正确。可是状态窗体中角色属性的绘制还没有变。

  #--------------------------------------------------------------------------
# ● 绘制项目
#--------------------------------------------------------------------------
def draw_item(index)
actor = $game_party.members[index]
enabled = $game_party.battle_members.include?(actor)
rect = item_rect(index)
draw_item_background(index)
draw_actor_face(actor, rect.x, rect.y, enabled)
draw_actor_name(actor,rect.x, rect.y+96)
draw_actor_class(actor,rect.x, rect.y+96+line_height*1)
draw_actor_icons(actor,rect.x,rect.y+96+line_height*2)
draw_actor_level(actor,rect.x, rect.y+96+line_height*2)
draw_actor_hp(actor,rect.x, rect.y+96+line_height*3)
draw_actor_mp(actor,rect.x,rect.y+96+line_height*4)
draw_actor_tp(actor,rect.x,rect.y+96+line_height*5)
end

用 Window_Base 中提供的工具绘制角色的属性。

最后调整一些细节參数。

终于成品:

版权声明:本文博主原创文章,博客,未经同意不得转载。

如何出色的研究 RGSS3 (三) 形式的调整的细节的更多相关文章

  1. 三十项调整助力 Ubuntu 13.04 更上一层楼

    在Ubuntu 13.04 Raring Ringtail安装完成之后,我们还有三十项调整需要进行. 1.Ubuntu 13.04 Raring Ringtail安装完毕后,我又进行了一系列工作 大家 ...

  2. CSS 设计彻底研究(三)深入理解盒子模型

    第三章 深入理解盒子模型 盒子模型是CSS控制页面的基础.需要清楚“盒子”的含义是什么,以及盒子的组成.此外,应该理解DOM的基本概念,以及DOM树是如何与一个HTML文档对应的,在此基础上充分理解“ ...

  3. 【原创】JPEG图像密写研究(三) 数据流译码

    [原创]这次更新比较慢,译码过程比想象中复杂一些,更主要是译出来的DCT系数无法确定是否正确,要想验证就需要再进行正向压缩编码,再次形成jpeg图像验证正确,后续工作正在开展,这里就说一说译码的主要思 ...

  4. 怎样优雅的研究 RGSS3 (四) 使窗体从画面边缘弹出

    在非常多游戏中,窗体能够从游戏画面的边缘弹出. 而在 RGSS3 的默认脚本中时没有这样的功能的,当在地图上按下取消键时.游戏菜单会突然出现. 如今我们能够为主菜单加入动画效果,使其在屏幕边缘弹出. ...

  5. JS&CSS文件请求合并及压缩处理研究(三)

    上篇我们进行了一些代码方面的准备工作.接下来的逻辑是:在View页面解析时,通过 Html.AppendResFile 方法添加的资源文件,我们需要按照分组.优先级,文件名等条件,对其路径进行合并.具 ...

  6. 如何优雅的研究 RGSS3 (七) 加入LOGO屏幕

    对于游戏 LOGO 屏幕. 首先设计 LOGO Scene类.我们知道,现场类 Scene_Base 子类. 让我们回顾一下现场的作品. 首先运行开始处理.其次是开始治疗.然后停止更新屏幕,最后,治疗 ...

  7. JSON库的使用研究(三)

    怎么选择JSON库? 从整体测试结果来看,总结如下: 用于序列化.反序列的功能,数量量小,吞吐量不大于10000每秒的,选择gson: 用于解析JSON的,还是用Fastjson吧,虽然听说坑很多. ...

  8. MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息

    接着上一篇的moquette-mqtt 的使用之broker启动之后,我们需要启动moquette-mqtt 的服务端发布消息. 在moquette-mqtt 的mqtt-client中三种方式实现发 ...

  9. NopCommerce 3.80框架研究(三)替换tinymce 为KindEditor

    NopCommerce 自带的编辑器tinymce 功能不是很全.所以尝试将其替换为功能更强大的 KindEditor 并替实现文件上传和在线浏览功能 首先下载 并解压到如下位置 请注意这里是部署在N ...

随机推荐

  1. ZOJ 2334(Monkey King-左偏树第一题)

    Monkey King Time Limit: 10 Seconds      Memory Limit: 32768 KB Once in a forest, there lived N aggre ...

  2. cocos2d触摸事件处理机制(2.x和3.x变化)

    2.x的触摸事件的版本号 触摸事件处理有2种子.以下单点触摸的样本.(另一种多点触摸屏). 创建cocos2d 该项目. 1. 重写下面虚函数. bool ccTouchBegan(cocos2d:: ...

  3. 【源代码】TreeMap源代码剖析

    注:下面源代码基于jdk1.7.0_11 之前介绍了一系列Map集合中的详细实现类,包含HashMap,HashTable,LinkedHashMap.这三个类都是基于哈希表实现的,今天我们介绍还有一 ...

  4. 使用 WPF 创建预加载控件

    Introduction At the time when WPF applications do a very long process like getting response from a w ...

  5. 谈谈CListCtrl 扩展风格设置方法-SetExtendedStyle和ModifyStyleEx 比較

    谈谈CListCtrl 扩展风格设置方法 --------------------------------------SetExtendedStyle和ModifyStyleEx 比較 对于刚開始学习 ...

  6. SQL Server 版本号汇总

    通过SSMS连接Sql servr,查看实例的版本就能知道当前SQL Server的版本号了.   RTM (no SP) SP1 SP2 SP3 SP4  SQL Server 2014     c ...

  7. JS弄ASP.NET(C#)在页GridView信息选择行

    做web发展还是新手我,为了之前获得Gridview中间值,它是通过服务器端控件通过第一Gridview将数据保存到服务器,当一个服务器,然后绑定的隐藏字段,在通过的js阅读隐藏字段值,如今,这种方法 ...

  8. MVC模式编程演示样本-登录认证(静态)

    好,部分博客分享我的总结JSP-Servlet-JavaBean思想认识和三层编程模型的基本流程,ZH- CNMVC该示例实现演示的编程模式-登录身份验证过程,在这里,我仍在使用静态验证usernam ...

  9. HPUX在oracle10g安装和卸载缩写

    创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/ ...

  10. 【Android基础】listview控件的使用(3)------Map与SimpleAdapter组成的多显示条目的Listview

    前面介绍的两种listview的使用都是最基础的,所以有很大的局限性,比如只能在一个item(即每一行的条目)中显示一个文本信息,这一篇我将介绍Map与SimpleAdapter组成的多显示条目的Li ...