注册会员 登录
Project1 返回首页

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

日志

RGSS窗口类Window详解(一)

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

Window类,是RPGMAKER中最为常见的一个类,游戏中出现的各种窗口都是Window类的子类,首先着重分析一下一个窗口类脚本的内容分别指代什么意义。我们拿最简单的金钱类作为例子进行讲解。(这就是那节FLASH的内容,明白的请跳过!) 

(带有■的行为系统自带的默认脚本部分)
class Window_Gold <Window_Base

请注意红色的部分,它代表Window_Gold这个类是Window_Base这个类的子类,当然反过来说,Window_Base就是Window_Gold的父类。
那么为什么是Window_Base而不是其他的什么类呢,原因可以这样认为,Window_Base中常被作为描绘静态文字的窗口,这个说法当然是相对于下一讲中要提到的Window_Selectable来讲的,我对它们之间的区别定位于只要是没有选项出现的窗口,就可以使用Window_Base作为此窗口的父类来使用;如果出现了选择项,那么就用Window_Selectable。
下面来逐句看解释。



 def initialize

这句是初始化函数,一般情况下是每个类必须有的,当然,如果和父类的完全一样,就不需要了。



 super(0, 0, 160, 64)

这里的super在脚本编辑器模式下可以看到是蓝色的,说明它本身是个保留字,它的作用是调用父类中的同名方法initialize,所以这句话也就是创建了窗口本身,而它后面跟着的4个参数分别代表了窗口左上角的x坐标、y坐标、窗口宽度、窗口高度
经常有的朋友想要修改窗口坐标,修改窗口大小,就是要从这里改。



 self.contents = Bitmap.new(width - 32, height - 32)

这句也是至关重要的一句。如果我们把整个窗口比作一个画板,那么上面已经定好了板子的位置和大小了,但光有板子是没法来画的,我们还需要画纸,没错,self.contents,这个东西就是所谓的画纸。这里顺带一提,self指的正是窗口本身。
我们可以从代码中看出,它本身是一个Bitmap类的对象,而后面括号中的两个参数就是这张纸的大小。width height这两个方法分别代表着整个窗口的宽度和高度。
所以,现在我们可以看出,为什么我们窗口内描绘的内容总是要和窗口的边缘有一定的距离,就是因为这里为了让画纸为画板留下一定的空间,所以在上下左右各留了一些距离(这个距离的大小是16),那么是不是我们不减这个32的话,就可以不留这个边儿呢?诸位可以自己先试试看,答案最后揭晓。



 refresh

英语学的好的朋友,应该知道这个词本来的含义——刷新。这里调用的下面定义的refresh这个方法,我们需要知道的是它执行的工作正如它的含义一般,刷新整个画纸上的内容,至于是怎么刷新的,接着看。



 end

这个就不说了……



好了,下面开始看刷新方法是如何实现刷新功能的。

 def refresh
 self.contents.clear

这句,首先self.contents刚才已经说过了,是画纸。clear呢,也正如其名,清除。这句连在一起,意思就是要把目前画纸上的内容清空。好了,这下成了崭新的白纸了。



 cx = contents.text_size($data_system.words.gold).width

这里涉及到了一个Bitmap类的方法text_size,简单说一下,它可以取出当前Bitmap类对象中描绘指定文字时所占的空间。形象一点的说法就是,它能够准确的告诉你,用某个粗细的笔在这张纸上写下几个字,这几个字的位置以及占用空间的宽度和高度。
而本例中的这里,只取的是这个空间的宽度。



 self.contents.font.color = normal_color

再一次看到了画纸,看来想要在窗口里写些什么东西是离不开画纸这一点是显而易见了。
这句的意思就是给画纸指定一种颜色——normal_color,其实就是白色,当然这个normal_color是事先定义过的,你也可以在等号右边直接写诸如 Color.new(255, 0, 0) 这样的代码,我写的是红色的代码。
在这里顺便也列出其他几种能够给画纸指定的内容,它们分别是:


self.contents.font.name = "宋体"
字体的设定
self.contents.font.size = 24
字号的设定
self.contents.font.bold = true
是否粗体的设定[等号右边true/false可选]
self.contents.font.italic = true
是否斜体的设定[等号右边true/false可选]



 self.contents.draw_text(4, 0, 120-cx-2, 32, $game_party.gold.to_s, 2)

重头戏来了,这句便是一句真正往画纸上写文字的语句,让我们仔细来分析分析。
draw_text(4, 0, 120-cx-2, 32, $game_party.gold.to_s, 2)
哇,括号里好多的内容,它们都是什么呢?
最前面的两个“4, 0, ”是要写字的x坐标和y坐标:有了这两个值,就可以明白要往什么地方写了。
紧接着的两个数字“120-cx-2, 32,”是给你写字的空间的宽度和高度:就是说,给你这么大的地方,你在里面写字,能写下最好;写不下嘛,挤一挤也得写;要是挤一挤也写不下,那就能写多少写多少……
“$game_party.gold.to_s,”:这个就是要写的具体的字了,这里可以是直接给定字符串,也可以是字符串变量,或者是其他类型的变量转换而来的,总之这里的值必须是一个字符串类型。
“2”:最后的这个2是做什么的呢?它代表的是写字时的对齐规则,这里有三种规则,居左、居中、居右,分别对应这0、1、2,如果这个值你不写,那么系统会自动认为你要居左写。



下面的两行正好作为练习,看看自己能不能看明白呢?


 self.contents.font.color = system_color
 self.contents.draw_text(124-cx, 0, cx, 32, $data_system.words.gold, 2)
 end
end


第一讲的内容这里就结束了。

记得刚才说的把创建画纸时的- 32 去掉以后的结果么?在窗口的右边和下边的中央,分别多出了一个白色的小箭头(默认素材),这是什么意思呢?其实,这个代表,我们去掉了那个 - 32 以后,创建的画纸的确是比原来大了,箭头的意思就是在这里的右面或者下面,还有一些画纸在。看来很可惜,虽然纸是变大了,但它仍然还是无法抹去窗口边缘的那一小部分镂空,这里也说一下,那部分镂空是系统Window类中定义的内容,目的大概就是为了美观吧!


鸡蛋

鲜花

刚表态过的朋友 (0 人)

评论 (0 个评论)

facelist doodle 涂鸦笔

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

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

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

GMT+8, 2024-4-25 14:29

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部