Project1
标题:
问一个窗口脚本的问题
[打印本页]
作者:
kvkv97
时间:
2013-12-4 16:50
标题:
问一个窗口脚本的问题
def initialize(x, y, width, height) 为什么初始化可以作为函数?或者哪个才是DEF要执行的函数?
super()
@windowskin_name =$game_system.windowskin_name windowskin是个类吗? 后面为什么要加name,这句话的意思是
windowskin_name这个实例变量被赋上game_system里面的一
个类的值吗?
self.windowskin = RPG::Cache.windowskin(@windowskin_name) self是什么意思?RPG::Cache是什么意思?
self.x = x x能被自己赋值吗?
self.y = y
self.width = width
self.height = height
self.z = 100 z = 100表示什么?
end
整个函数是什么意思?
作者:
myownroc
时间:
2013-12-4 18:45
1.这个是重新定义了Window类的初始化过程…
2.windowskin_name是窗口皮肤图片的路径。意思如楼主所说。
3.self是指当前这个类本身(现在是Window类)
4.RPG::Cache是调用RPG模块里一个叫Cache的过程
5.等号(其实是赋值号)右边的x是第一行出现的x,是由用户提供的
6.z是窗口显示的优先程度,z值大的会遮盖住小的
作者:
wwwcctvty
时间:
2013-12-4 19:53
建议楼主先看F1
作者:
紫英晓狼1130
时间:
2013-12-4 21:33
第一个指重定义,因为它要覆盖原来的定义
第二个是指Windowskin里的文件,方便调用
第三个self是对于这个新类而言的,Cache对于这里来说就是调用Windowskin
第四个self可以自己定义
第五个z指这个窗口的优先程度,值越高优先级越高
作者:
kvkv97
时间:
2013-12-7 20:17
1,super()是调用父类WINDOW的构造方法吗?是什么构造方法的?后面为什么带个不加参数的括号,表示什么?
2,引用RPG类中的常量Cache,PRG有这个程序或者是脚本吗?
作者:
kvkv97
时间:
2013-12-7 20:23
本帖最后由 kvkv97 于 2013-12-7 20:24 编辑
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
# 游戏中全部窗口的超级类。
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 初始化对像
# x : 窗口的 X 坐标
# y : 窗口的 Y 坐标
# width : 窗口的宽
# height : 窗口的宽
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super()
@windowskin_name =$game_system.windowskin_name
self.windowskin =RPG::Cache. windowskin(@windowskin_name)
self.x = x
self.y = y
self.width = width
self.height = height
self.z = 100
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
# 如果窗口的内容已经被设置就被释放
if self.contents != nil
self.contents.dispose
end
super
end
释放是什么意思?里面为什么还会使用super呢?
作者:
恐惧剑刃
时间:
2013-12-8 08:26
本帖最后由 恋′挂机 于 2013-12-8 08:40 编辑
这个不算挖坟吧。。。。。。。
def initialize(x, y, width, height) # 带有参数的初始化函数,从一般窗口初始化函数传递过来super(x, y, width, height)
super() # 父类同名函数
@windowskin_name =$game_system.windowskin_name # 这个只是窗口图片名!!!!!!
self.windowskin =RPG::Cache. windowskin(@windowskin_name) # 这才是修改皮肤!!并带入图片名称
self.x = x # X坐标
self.y = y # Y坐标
self.width = width # 宽度
self.height = height # 高度
self.z = 100 # Z坐标,你可能知道默认窗口的Z都是100,这就是原因!!!
end
把Scene_Menu的79行注释掉,测试打开菜单看看有什么效果?
发现状态窗口保存在了地图中,所以需要释放(图片,窗口等等)
def dispose
# 如果窗口的内容已经被设置就被释放
if self.contents != nil # 如果窗口的contents属性生成了Bitmap
self.contents.dispose # 释放
end
super
end
为什么要super这个好难解释。。。
你只释放了他的Bitmap,让窗口本身释放掉并不是在Window_Base里定义的,
应该在Window类吧所以需要super。
不过看主楼,LZ连实例变量、方法<或称函数>、类等概念还很模糊的建议去看看某侠的录像!
@windowskin_name 只是一个实例变量,和windowskin是不是一个类这根本就是八竿子打不着。
# 其实看完F1基础篇就能创作脚本了,只是新手没有方向而已,老鸟都说F1好,新手却不会用!!!
# 你去搜索看看啊!!!!在F1中搜索windowskin,发现是Window类的属性(应该是用attr定义的)
# 就又设计到了属性(attr)在Game_Temp中添上一个attr_accessor :aaa
# $game_temp.aaa = 10
# p $game_temp.aaa
# attr_accessor和attr_reader都是可以直接“.xxx”取到值,所以“.xxx” xxx可能是某方法也可能是某属性!!!和类根本不是一个概念!!!
self.windowskin = RPG::Cache. windowskin(@windowskin_name)
现在你去搜索RPG::Cache,看看吧,可以找到RPG::Cache. windowskin是模块方法
RPG::Cache这个模块就是读取各种图片的!!!!!!!
contents是Window的属性,也就是说任何一个窗口都具有这样的属性
搜索contents看看吧,窗口内容的位图
既然是位图当然要Bitmap.new了
在Bitmap去再去描绘文本矩形图片等等
作者:
kvkv97
时间:
2013-12-10 17:50
我想在这里把这个问题仔细研究下去:
1,窗口被几个定义分割成几块,剩下显示状态的窗口没变,我把X坐标变了,只能变这个部分的X坐标。我想问,为什么X能自己赋值?这个值为什么能起到切换状态栏的时候能随机变化(效果可以把X =100试试看)
2,super(),为什么这个关键词后面括号里面没东西?没东西不是不需要括号吗?
作者:
kvkv97
时间:
2013-12-10 17:51
本帖最后由 kvkv97 于 2013-12-10 17:58 编辑
继续这个脚本:
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update 为什么需要刷新,我把这个注释掉了,结果看不出有什么?
super super是引用了Window类的结构
# 如果窗口的外观被变更了、再设置
if $game_system.windowskin_name != @windowskin_name 在上面, @windowskin_name =$game_system.windowskin_name ,后面的量已经被赋在@windowskin_name 上面了
为什么还需要有这个条件? 不是多此一举吗?
@windowskin_name = $game_system.windowskin_name
self.windowskin = RPG::Cache.windowskin(@windowskin_name)
end
end
作者:
RyanBern
时间:
2013-12-10 18:15
我来解释一下:
这里的update是定义的一种方法,习惯上,我们要把需要经常执行的方法都定义成update(当然你可以把它定义成别的,这不过是RGSS一种习惯),意思就是说,update方法是要定期执行的方法。在场景画面中,你会看到Graphics.update等方法(当然这个update和这里窗口的update不同),不过这个方法几乎是每一帧都要执行的,因此不能省去。
因为这个是Window_Base的update方法,里面的内容非常简单,第一个super是调用父类Window的同名方法,而后面,则是设置窗口的样式。因此,如果你在游戏中改变了默认窗口皮肤,这里会及时作出反应,但如果你不调用update方法,那么就会系统会无动于衷。
再说第二个问题,这里不是多此一举,我们恰恰需要这个判断。你注意到上面@windowskin_name = $game_system.windowskin_name是定义在initialize方法里面的,而initialize方法一般只执行一次。如果你在初始化之后,又改变了$game_system.windowskin_name的值,这时候initialize不起作用,只能通过update来判断,即如果窗口样式变化了再设置。
顺便问下,问得这么细,LZ是要学习脚本么?
作者:
kvkv97
时间:
2013-12-11 17:47
是的,在下正在蜗牛爬行中
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1