无效楼层是怎么回事,这篇帖子对我来说很重要啊…… |
本帖最后由 天地有正气 于 2014-2-18 19:38 编辑 @protossonny 因为实在是太混乱了,我自己都看不下去了! 所以,请P叔帮忙把所有的教程都删除!我想重新编写! 0.0真神奇啊。 @protosssonny |
第十三章 解析默认菜单 其实我准备直接出修改菜单来着……但是实在想不出排版……于是先弄个这个。 希望有人能给我个菜单排版啊…………………… 不知道又没用讲过new方法,它是Class类的方法,以下摘自F1帮助。 new( ... ) 所以xxx = Xxx_Xxx.new是生成实例。 以下是正文部分。 首先,是用class~end定义类,随后,可以看到有一个initialize方法。 因为附带了一个参数,所以调用菜单时需要一个参数。 接下来是主要部分,main方法,场景类必须有main方法。 先看这部分。 # 生成命令窗口 s1 = $data_system.words.item s2 = $data_system.words.skill s3 = $data_system.words.equip s4 = "状态" s5 = "存档" s6 = "结束游戏" @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6]) @command_window.index = @menu_index # 同伴人数为 0 的情况下 if $game_party.actors.size == 0 # 物品、特技、装备、状态无效化 @command_window.disable_item(0) @command_window.disable_item(1) @command_window.disable_item(2) @command_window.disable_item(3) end # 禁止存档的情况下 if $game_system.save_disabled # 存档无效 @command_window.disable_item(4) end 一行一行慢慢来。 s1、2、3、4、5、6分别代入字符串,接下来用@command_window这个变量生成Window_Command的实例。 这个160是宽度,翻翻Window_Command就知道了。 然后是index,index是Window_Selectable类的属性,因为Window_Command是Window_Selectable的子类,所以有了这个属性。 再看:$game_party.actors.size这个全局变量代表着队伍人数,$game_party是Game_Party的实例,是在Scene_Title里生成的。 @command_window.disable_item是Window_Command类的方法,用来无效选项。 $game_system是Game_System的实例,找到Game_System,就能看到用attr_accessor定义了几个实例变量,至于实例变量是个什么东西,以后 讲解默认脚本时会提到。这个save_disabled也是那几个变量中的一个。 # 生成游戏时间窗口 @playtime_window = Window_PlayTime.new @playtime_window.x = 0 @playtime_window.y = 224 # 生成步数窗口 @steps_window = Window_Steps.new @steps_window.x = 0 @steps_window.y = 320 # 生成金钱窗口 @gold_window = Window_Gold.new @gold_window.x = 0 @gold_window.y = 416 # 生成状态窗口 @status_window = Window_MenuStatus.new @status_window.x = 160 @status_window.y = 0 继续讲解。 这些都是用变量生成实例。x,y是Window类的属性,可以参考F1 里的Window。 这四个窗口也是预先定义好的,从脚本编辑器往上翻翻Window_Xxx的类就能看见,其余几个都没什么可说的,关键是 这个Window_MenuStatus需要好好说说,不过,我们先暂且放一放。 剩下的main里的内容就是我们上次说过的Scene场景类的基础,一定要写。 那些dispose都是释放(消失),如果不释放,那么这些窗口将会一直存在。 然后继续看。 #-------------------------------------------------------------------------- # ● 刷新画面 #-------------------------------------------------------------------------- def update # 刷新窗口 @command_window.update @playtime_window.update @steps_window.update @gold_window.update @status_window.update # 命令窗口被激活的情况下: 调用 update_command if @command_window.active update_command return end # 状态窗口被激活的情况下: 调用 update_status if @status_window.active update_status return end end 首先是调用各个窗口的update方法(大都是继承了Window_Base的)。 active也是Window类的属性,表示激活状态。为true则表示激活,为false表示不激活。 什么意思呢?比如说,@command_window的active是false,那么那个一闪一闪的表示被选择项的透明框框就会停止闪动。 然后再看。 #-------------------------------------------------------------------------- # ● 刷新画面 (命令窗口被激活的情况下) #-------------------------------------------------------------------------- def update_command # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 切换的地图画面 $scene = Scene_Map.new return end # 按下 C 键的情况下 if Input.trigger?(Input::C) # 同伴人数为 0、存档、游戏结束以外的场合 if $game_party.actors.size == 0 and @command_window.index < 4 # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # 命令窗口的光标位置分支 case @command_window.index when 0 # 物品 # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 切换到物品画面 $scene = Scene_Item.new when 1 # 特技 # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 激活状态窗口 @command_window.active = false @status_window.active = true @status_window.index = 0 when 2 # 装备 # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 激活状态窗口 @command_window.active = false @status_window.active = true @status_window.index = 0 when 3 # 状态 # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 激活状态窗口 @command_window.active = false @status_window.active = true @status_window.index = 0 when 4 # 存档 # 禁止存档的情况下 if $game_system.save_disabled # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 切换到存档画面 $scene = Scene_Save.new when 5 # 游戏结束 # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 切换到游戏结束画面 $scene = Scene_End.new end return end end $game_system.se_play都是Game_System里的方法,作用是播放se,$scene = Xxx都是切换场景用的。 return是结束函数(方法?)处理的命令。 case when end是条件分歧语句,不知道的童鞋请看F1默认帮助,我就不信你看不懂条件分歧~ 然后继续。 #-------------------------------------------------------------------------- # ● 刷新画面 (状态窗口被激活的情况下) #-------------------------------------------------------------------------- def update_status # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 激活命令窗口 @command_window.active = true @status_window.active = false @status_window.index = -1 return end # 按下 C 键的情况下 if Input.trigger?(Input::C) # 命令窗口的光标位置分支 case @command_window.index when 1 # 特技 # 本角色的行动限制在 2 以上的情况下 if $game_party.actors[@status_window.index].restriction >= 2 # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 切换到特技画面 $scene = Scene_Skill.new(@status_window.index) when 2 # 装备 # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 切换的装备画面 $scene = Scene_Equip.new(@status_window.index) when 3 # 状态 # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 切换到状态画面 $scene = Scene_Status.new(@status_window.index) end return end end 这是角色选择的窗口,@status_window.index就是你选择的角色在$game_party.actors[]里的编号,以此来传递各个Scene类的参数。 恩,本章结束。因为已经解析过Scene_Menu了所以以后解析默认脚本就不会再额外解析Scene_Menu了~ |
第十二章 场景类基础 本章咱们来看看场景类(Scene_Xxx)是如何构成的~ 场景类可以说是一个容器吧,我们先写好各种窗口(Window_Xxx)、对象(Game_Xxx)然后,这些最后都在场景里集合。 默认的F1帮助已经给出了最最基础的场景类脚本,我们来看看。
然后,我给这个基础的东西再添加一下。
|
LZ辛苦了。写的很好!支持一个 |
本帖最后由 天地有正气 于 2014-2-2 11:13 编辑 第十一章 如何创建一个窗口5 这一节主要说一下血条的绘制。Bitmap类里面有一个方法,是专门用来填充颜色的。 fill_rect(x, y, width, height, color) 我们把refresh方法中,除了self.contents.clear之外的内容都删光,开始编写血条。 编写之前,有必要了解一下血条的宽度是怎么算出来的,下面这句我认为是最好的写法,简介明了。 w = self.width * $game_party.actors[0].hp / [$game_party.actors[0].maxhp,1].max 然后,开始用fill_rect编写一个血条。 两种方法: 1.self.contents.fill_rect(0,0,w,20,Color.new(255,0,0,220))。 2.self.contents.fill_rect(Rect.new(0,0,w,20),Color.new(255,0,0,220)) 至于边框,也是用fill_rect描绘,注意一条边一条边的描绘。 |
第十章 如何创建一个窗口4 这次来说说如何在窗口中显示图标什么的。 rect 这是F1帮助手册里的内容。我来简单解释一下,为什么要有个“矩形”。 比如说,一张标题图片是640*480,而矩形就是它的显示范围,如果矩形是120*120,那就只会显示120*120的图片。 上一次不是显示了个角色姓名吗?这一次就加一个图标。 self.contents.blt(66,0,Bitmap.new("001-Weapon01"),Rect.new(0,0,24,24)) 我们来解释一下。 66是X坐标,0是Y坐标,Bitmap.new就是一个实例,显示图片,Rect.new是矩形的实例,从图标的x0,y0位置也就是左上角开始,截取24*24的像素。 大家运行一下试试看吧。 |
第九章 创建第一个窗口3 这一节主要是讲上一次是如何得出那个66的 = = 刚刚发现和66rpg的66一样..好吉利 = = 大家可以打开帮助,找到Bitmap,看到最后面有一个方法。
用法一:在开始游戏之前临时建立一个Bitmap类的实例,调用该方法得到宽度。 代码: text = Bitmap.new(1,1).text_size("新手村").width p text exit 临时建立一个宽1长1的Bitmap,调用方法。 用法二:在窗口里使用该方法。 代码: def refresh self.contents.clear w = self.contents.text_size("新手村").width draw_text(0,0,w,22,"新手村") end 用法三(重点): 在draw_text(x,y,width,height)后面,有 draw_text(rect, str[, align]) 这里用到了Rect类(矩形),可以直接利用text_size获得矩形。 代码: w = self.contents.text_size("新手村") draw_text(w,"新手村") 好了,上面那些纯属非重点,重点从这里开始 = = 既然“新手村”是不会变的,那么为什么要反复描绘呢? 我们现在就要让它“变”起来,我们要将“新手村”换成当前队伍里一号角色的名字。 首先介绍一个非常有用的东西,内嵌表达式。 在F1帮助里也有,就是可以在字符串里以“#{变量名}”的方式代入变量。 于是可以得到下面的东西。
|
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2025-2-17 03:44
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.