注册会员 登录
Project1 返回首页

亿万星辰的深邃空间 https://rpg.blue/?62841 [收藏] [复制] [分享] [RSS]

日志

RGSS窗口类Window详解(四)

热度 2已有 540 次阅读2011-9-13 20:45 |个人分类:坑爹的RGSS教程

上一讲结束的时候我们提到了物品窗口中特殊的多选项排列形式,究竟它是如何实现的呢,这一讲我们着重讲这一点。
(这一讲的代码不会设计太多,主要讲的是理论性的东西。)

通过前面所学的,我们知道要在一个Window类的对象中描绘一些文字图片就必须先为这个窗口对象创建它的contents,也就是一个Bitmap类的对象,有了这个contents,我们才可以把想要展现出的东西描绘出来。

接着我们知道,如果这个contents的宽度大于窗口的宽度时,在窗口的右边会出现一个指向右边的箭头,同样的情况也发生在宽度超标时。

其实,这个箭头出现的前提是contents有部分位于窗口的外侧,右边和下边位于窗口外侧这两个好理解,那么左边和上边是怎么超出去的呢?这里介绍Window类的一个新的属性ox oy,这两个值负责的是控制窗口中contents属性的起点坐标,在F1里,是这么解释的:

RM的F1:
ox:精灵传送元原点的 X 座标。
oy:精灵传送元原点的 Y 座标。

默认这两个值均为0。但这里要注意的是,它们两个指代的坐标和我们往常意义所说的坐标不同,它们指代的contents中当前位于窗口原点的坐标。很绕口也很难懂,举例来说明一下就好懂一些了。

我们先来写一些假设条件,我们现在要在一个窗口中描绘一行字“亿万脚本屋学堂”,这其中每个字的长宽大小均是32像素。
当ox=0 oy=0时,这是默认情况,窗口里显示的文字是“亿万脚本屋学堂”。
当ox=32 oy=0时,窗口里显示的文字是“万脚本屋学堂”。“亿”字则到了窗口最左端,看不到了。
当ox=0 oy=32时,窗口里看不到文字显示。因为所有的字都到了窗口上方。
当ox=0 oy=16时,窗口里看不到所有文字的下半身。结合这个例子理解上面那条。
而这一条正式我们这节的一大重点。

听了我这句话,有的同学可能已经在拿这个效果和Window_Item物品窗口里的样子做比较了。先别着急,我们再来讲最后一个小细节,就是光标。其实光标的部分所设计的代码并不是很多,因为如果是默认的菜单样式,系统自带的Window_Selectable类中对光标的处理就相当完善了,我这要说的是关于自行改变光标位置和光标宽窄的方法。

在Window_Selectable中有这么一个方法:
 #--------------------------------------------------------------------------
 # ● 更新光标矩形
 #--------------------------------------------------------------------------
 def update_cursor_rect
 # 光标位置不满 0 的情况下
 if @index < 0
 self.cursor_rect.empty
 return
 end
 # 获取当前的行
 row = @index / @column_max
 # 当前行被显示开头行前面的情况下
 if row < self.top_row
 # 从当前行向开头行滚动
 self.top_row = row
 end
 # 当前行被显示末尾行之后的情况下
 if row > self.top_row + (self.page_row_max - 1)
 # 从当前行向末尾滚动
 self.top_row = row - (self.page_row_max - 1)
 end
 # 计算光标的宽度
 cursor_width = self.width / @column_max - 32
 # 计算光标坐标
 x = @index % @column_max * (cursor_width + 32)
 y = @index / @column_max * 32 - self.oy
 # 更新光标矩形
 self.cursor_rect.set(x, y, cursor_width, 32)
 end

这个方法里有两部分重点内容,其一是直接定义了光标的宽度和出现的位置,倘若我们自制了一个窗口,而这个窗口的高度并不是默认的32,位置也不是很有规律,那么就可以通过这个方法下手,至于方法,我希望大家能自己看看,因为通过前面的学习应该要看懂这个不是很难,我这里给出一个提示:最关键的代码是最后一句,它直接负责给光标传送坐标及宽高属性的值。其二则是它还负责了整个窗口的内容随这光标进行滚动,具体的代码是包含“self.top_row ”的两行,通过给top_row赋值,制定了当前页面的首行,整个窗口也就跟着滚动起来了。

好了,现在细节部分都说完了,可以说说Window_Item物品窗口的运作了。
我们先来罗列一下物品窗口的特性:
1、物品多的时候自动出现向下的小箭头。
这个很容易实现咯,只要创建的contents的高度大于窗口的高度即可。
2、光标跟随键盘操作
在刚才说到的“更新光标矩形”的方法里已经见到了,通过一句“self.cursor_rect.set”对光标矩形的坐标及宽高进行设置。
3、光标到达窗口最下或最上时,如果下面或上面还有物品,则整个窗口的内容也跟着一起滚动。
这个运用到了刚才说到的top_row的控制,说到底就是窗口ox oy属性的控制。

到这里为止,关于RGSS中窗口类的介绍就基本结束了,结合默认系统中的若干窗口,仔细阅读明白以后相信要弄明白窗口类的代码并不是一件难事,之后,要写出自己的窗口也并不是一件难事。


鸡蛋
1

鲜花

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-2 05:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部