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

所有形式的父类的 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. Codeforces Round#309 C Kyoya and Colored Balls

    给定一个k表示颜色的种类从1到k 然后接下来k行, 每行一个数字, 代表该颜色的球有多少个 这些球都放在一个包中,然后依次拿出.  要求颜色i的最后一个球, 必须要排在颜色i+1的最后一个球前面,   ...

  2. Spark 1.0.0 横空出世 Spark on Yarn 部署(Hadoop 2.4)

    就在昨天,北京时间5月30日20点多.Spark 1.0.0最终公布了:Spark 1.0.0 released 依据官网描写叙述,Spark 1.0.0支持SQL编写:Spark SQL Progr ...

  3. jQuery来源学习笔记:整体结构

    1.1.由于调用一个匿名函数: (function( window, undefined ) { // jquery code })(window); 这是一个自调用匿名函数,第一个括号内是一个匿名函 ...

  4. 【原创】纯OO:从设计到编码写一个FlappyBird (三)

    第二部分请点这里 下面首先来实现Bing接口! 实现Bing接口的类取名SimpleBing. 容易发现,SimpleBing类总的来说要向下,但点击一下又得向上,向上到了一定界限又得向下,但我们又只 ...

  5. 使用ThinkPHP框架高速发展网站(多图)

    使用ThinkPHP框架高速搭建站点 这一周一直忙于做实验室的站点,基本功能算是完毕了.比較有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.假设对于相同是Web方面新手的你有一丝丝帮助 ...

  6. Java应用中使用ShutdownHook友好地清理现场(转)

    在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.Java中得ShutdownHook提供了比较好的方案. JDK在1.3之后提 ...

  7. 传智播客成都校园php纪律指控

    继传智播客成都校区php第一期班圆满开班,说明php的火爆一点儿也不亚于java! 经传智播客商讨决定,传智播客成都校区php学科收费标准例如以下: 採用下面不论什么一种方式都能够享受优惠价: 一.自 ...

  8. 基于Tkinter利用python实现颜色空间转换程序

    主要基于colorsys实现,例子是从hls转换到rgb,假设要换颜色空间非常easy仅仅须要改动一个函数 用到了Scale和Canvas组件 代码例如以下: from Tkinter import ...

  9. 熟知CDN

    一.概念 1.什么是CDN? CDN的全拼是(Content Delivery Network).即内容分发网络.其基本思想是尽可能避开互联网上有可能影响传输数据速度和稳定性瓶颈的环节,使内容传输的更 ...

  10. node.js基础:模块的创建和引入

    模块可能是一个文件,也可能是包含一个或多个文件的目录.如果模块是个目录,node.js通常会在这个目录下找一个叫index.js的文件作为模块的入口. 典型的模块是一个包含exports对象属性定义的 ...