如何出色的研究 RGSS3 (三) 形式的调整的细节
在一个我们研究了添加到窗体方法的选择,这个问题来研究窗体类的细节。
所有形式的父类的 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 (三) 形式的调整的细节的更多相关文章
- 三十项调整助力 Ubuntu 13.04 更上一层楼
在Ubuntu 13.04 Raring Ringtail安装完成之后,我们还有三十项调整需要进行. 1.Ubuntu 13.04 Raring Ringtail安装完毕后,我又进行了一系列工作 大家 ...
- CSS 设计彻底研究(三)深入理解盒子模型
第三章 深入理解盒子模型 盒子模型是CSS控制页面的基础.需要清楚“盒子”的含义是什么,以及盒子的组成.此外,应该理解DOM的基本概念,以及DOM树是如何与一个HTML文档对应的,在此基础上充分理解“ ...
- 【原创】JPEG图像密写研究(三) 数据流译码
[原创]这次更新比较慢,译码过程比想象中复杂一些,更主要是译出来的DCT系数无法确定是否正确,要想验证就需要再进行正向压缩编码,再次形成jpeg图像验证正确,后续工作正在开展,这里就说一说译码的主要思 ...
- 怎样优雅的研究 RGSS3 (四) 使窗体从画面边缘弹出
在非常多游戏中,窗体能够从游戏画面的边缘弹出. 而在 RGSS3 的默认脚本中时没有这样的功能的,当在地图上按下取消键时.游戏菜单会突然出现. 如今我们能够为主菜单加入动画效果,使其在屏幕边缘弹出. ...
- JS&CSS文件请求合并及压缩处理研究(三)
上篇我们进行了一些代码方面的准备工作.接下来的逻辑是:在View页面解析时,通过 Html.AppendResFile 方法添加的资源文件,我们需要按照分组.优先级,文件名等条件,对其路径进行合并.具 ...
- 如何优雅的研究 RGSS3 (七) 加入LOGO屏幕
对于游戏 LOGO 屏幕. 首先设计 LOGO Scene类.我们知道,现场类 Scene_Base 子类. 让我们回顾一下现场的作品. 首先运行开始处理.其次是开始治疗.然后停止更新屏幕,最后,治疗 ...
- JSON库的使用研究(三)
怎么选择JSON库? 从整体测试结果来看,总结如下: 用于序列化.反序列的功能,数量量小,吞吐量不大于10000每秒的,选择gson: 用于解析JSON的,还是用Fastjson吧,虽然听说坑很多. ...
- MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息
接着上一篇的moquette-mqtt 的使用之broker启动之后,我们需要启动moquette-mqtt 的服务端发布消息. 在moquette-mqtt 的mqtt-client中三种方式实现发 ...
- NopCommerce 3.80框架研究(三)替换tinymce 为KindEditor
NopCommerce 自带的编辑器tinymce 功能不是很全.所以尝试将其替换为功能更强大的 KindEditor 并替实现文件上传和在线浏览功能 首先下载 并解压到如下位置 请注意这里是部署在N ...
随机推荐
- Objective-C类的使用
Objective-C教程的例题: // // main.m // test // // Created by liwei on 14-10-28. // Copyright (c) 2014年 li ...
- Android 大约Dialog弹出窗口
直接效果图: 实现步骤: 1.主界面activity_main.xml非常easy,一个button <RelativeLayout xmlns:android="http://sch ...
- uva 571 素数的性质
给定 两个杯子,容量分别分Ca,Cb, 要我们用这两个瓶子倒来倒去,得到某个瓶子里装有N的水 而且给的数据保证 Cb > N,且Ca,Cb互质 那么我们肯定可以在容量为Cb的杯子里得到N的水 ...
- hdu1561(树形背包)
给定n,m表示n个城堡,我们可以选择攻占m个城堡.要使得价值最大 接下来n行 a b, 第i行的a b,表示攻占第i个城堡的价值为b,但需要先攻占第a个城堡 如果有多个a=0的点,那么就不是一棵树 ...
- 怎样配置nginx同一时候执行不同版本号的php-fpm
在/usr/local/php/etc/php-fpm.conf里找到 listen = 127.0.0.1:9000 将port9000改动为9001 在对应的nginx配置里也做相同的port改动
- MySql模糊查询like通配符简介
%代表随意多个字符 _代表一个字符 在 MySQL中.SQL的模式缺省是忽略大写和小写的 正则模式使用REGEXP和NOT REGEXP操作符. "."匹配不论什么单个的字符.一 ...
- Gmail POP3设定
好几个同事在问我怎样使用ThunderBird和OE收取IT CHT的邮箱,因为IT CHT就是用Gmail的功能,因此收发邮件是跟Gmail一样,下面是Gmail的POP&SMTP的设置方法 ...
- Oracle Instanc Client安装命令工具
条件 1.Linux RHEL 6.X X86_64操作系统 2.从安装Oracleserver的server此次收购Oracle相关文件(同OS) 软件下载 从Oracle包: 1) instan ...
- 无阻塞情况connect生产EINPROGRESS错
今天的游戏开发client测试程序,非常多,因为出现client.后connect成功.代码证recv系统调用.后来发现,可能是由于socket默认模式被阻止,这将使很多client 接处于链接却不能 ...
- oracle物化视图使用+hibernate
使用过程 ----删除 TRUNCATE TABLE mlog$_xxx_lxz_tmp;DROP MATERIALIZED VIEW LOG ON xxx_lxz_tmp; drop materia ...