赞 | 0 |
VIP | 35 |
好人卡 | 32 |
积分 | 6 |
经验 | 37746 |
最后登录 | 2024-11-20 |
在线时间 | 924 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 600
- 在线时间
- 924 小时
- 注册时间
- 2011-5-11
- 帖子
- 438
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 345912390 于 2012-11-25 20:09 编辑
看到有人在提问区问到了这个问题,所以教程比计划的早了一点!
预先准备工作:有一个半身像素材,和前三讲的工程。
提供工程:http://pan.baidu.com/share/link?shareid=26813&uk=3843192968 (内有半身像素材)
申明:
1.本教程只适合初学者,大神可无视
2.对已使用了,某某大神的脚本实现了,与其相似功能的可以跳过。
3.本教程如果影响了你现使用的脚本,你可以新建工程,找到教程中提到的脚本页,从新工程中拷贝替换。
4.不提供教程与其它脚本的冲突解决方案。
教程的最终效果图
正课:
在 小镜子的第二章中到讲了,Window_MenuCommand的横向解决方法。也许就会有人效仿第二章的做法,
修改Window_MenuStatus的父类。
呵呵,如果你换了,那么你就很可能改到上图显示的样子,但是实际上点击人物却不能进入单个人物页。
今天先讲一下理论:就是关于类的继承。
类的继承模型:- class A
- def A_B(x)
- x+line
- end
- def line
- return 5
- end
- end
- class B<A
- def B_A
- 5*A_B(5)
- end
- end
- class C<A
- def C_A
- 5*A_B(5)
- end
- def line
- return 20
- end
- end
- #得出 B_A -----------50
- #得出 C_A -----------125
复制代码 上面的代码中
c和B虽然都继承了(父类)A。但其输出 却有很大的不同。其主要原因就是因为C重定义了A中的def line
这也是我们今天修改脚本的第一步
在Window_MenuStatus页面插入以下脚本- #--------------------------------------------------------------------------
- # ● 获取列数
- #--------------------------------------------------------------------------
- def col_max
- return 4 #跟据分辨率的不同可以改
- end
复制代码 至于为什么加这段,不解释。实在不懂的,可以将Window_ItemList(物品画面)与Window_ShopBuy(商品的窗口)两个脚本对比一下就应该明白。
测试后效果图
从上图可发现角色都挤在一起,所以我们现在就需要调整每一个角色的信息位置与列宽。
脚本如下 :- #--------------------------------------------------------------------------
- # ● 获取项目数
- #--------------------------------------------------------------------------
- def item_max
- $game_party.members.size
- end
- #--------------------------------------------------------------------------
- # ● 获取项目的高度
- #--------------------------------------------------------------------------
- def item_height
- height - standard_padding * 2
- end
- #--------------------------------------------------------------------------
- # ● 获取项目的宽度
- #--------------------------------------------------------------------------
- def item_width
- (width - standard_padding * 2 + spacing) /col_max - spacing
- end
- #--------------------------------------------------------------------------
- # ● 获取行间距的宽度
- #--------------------------------------------------------------------------
- def spacing
- return 0
- 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*5)
- draw_actor_tp(actor,rect.x,rect.y+96+line_height*6)
- end
复制代码 上面的脚本有些def在Window_MenuStatus页面本来就有。所以 已存在的就替换掉,没有的就加进去。
测试效果图
到了这一步大致上看状态页的横向排列脚本是写玩。但是如果你的队伍里的人数超过4 人时就会出现翻页的问题。
这下是很多初学者没法解决的地方。
好了,我们再重新回到开头。在本文的开头,我提到了有人会用 小镜子的第二章中到讲的方法,修
改Window_MenuStatus的父类为Window_HorzCommand来达到横排的效果,其实也真的可以达到所相要的显
示效果。
由此我们就可参考Window_HorzCommand脚本来达到我们想要的目的。要参考,我认为首先就要看它所继承的父类
有没有相关连地方。对比结果如下:
Window_MenuStatus < Window_Selectable
Window_HorzCommand < Window_Command< Window_Selectable
由上我们可以看到
Window_HorzCommand为Window_Selectable的二级子类。
Window_MenuStatus为Window_Selectable的一级子类。
通过Window_HorzCommand与Window_Command的脚本对比。我们可以发现在这两个脚本中都重定义了
Window_Selectable的 光标在画面范围 与之相关的脚本。而我们现在需要解决的翻页问题就是与 光标在画
面范围 有关,所以我们可以将Window_HorzCommand脚本中与光标有关的脚本复制到Window_MenuStatus
的脚本中,通过测试来对比前后两个界面的差别。
光标有关的脚本如下- #--------------------------------------------------------------------------
- # ● 获取首列位置
- #--------------------------------------------------------------------------
- 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
- 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 item_rect(index)
- rect = super
- rect.x = index * (item_width + spacing)
- rect.y = 0
- rect
- end
- #--------------------------------------------------------------------------
- # ● 获取对齐方向
- #--------------------------------------------------------------------------
- def alignment
- return 1
- end
- #--------------------------------------------------------------------------
- # ● 光标向下移动
- #--------------------------------------------------------------------------
- def cursor_down(wrap = false)
- end
- #--------------------------------------------------------------------------
- # ● 光标向上移动
- #--------------------------------------------------------------------------
- def cursor_up(wrap = false)
- end
- #--------------------------------------------------------------------------
- # ● 光标移至下一页
- #--------------------------------------------------------------------------
- def cursor_pagedown
- end
- #--------------------------------------------------------------------------
- # ● 光标移至上一页
- #--------------------------------------------------------------------------
- def cursor_pageup
- end
复制代码 测试效果如下:
我们可以看到光标是横向移动了,只是有部分角色没显示出来。这个就比较难办。
仔细想想,光标的这一部分脚本应该是没有问题的。那问题出在哪里呢?
呵呵,细心的人可能已经发现了,在页面中间的下方还是有一个小三角。
这样我们就可以考虑下Window(窗口)的contents(容器)部分了。
现在我们再重定义contents的宽度和高度,测试
脚本 如下
- #--------------------------------------------------------------------------
- # ● 计算窗口内容的宽度
- #--------------------------------------------------------------------------
- def contents_width
- (item_width + spacing) * item_max - spacing
- end
- #--------------------------------------------------------------------------
- # ● 计算窗口内容的宽度
- #--------------------------------------------------------------------------
- def contents_height
- item_height
- end
复制代码 效果图如下
横向的脚本就完部完成了
现在说下半身像的问题
准备工作:因为我只有一张4*2 的半身像身像素材Actor1.png,所以上我在工程中所有角色图片都用的Actor1有头像。
如图:
半身像的素材在:教程3\Graphics\HalfBody目录命名为Actor1.png
说明一下半身像的名字一定要与角色图片用的Actor1名字相同。
步骤1:根据RM脚本的命名规则可以在Window_MenuStatus中找到- draw_actor_face(actor, rect.x, rect.y, enabled)
复制代码 我们全局搜索关键字:draw_actor_face
得到Window_Base的 def draw_actor_face(actor, x, y, enabled = true)函数。
我们复制draw_actor_face函数,更名为draw_actor_HalfBody添加到Window_Base脚本中
脚本如下:- #--------------------------------------------------------------------------
- # ● 绘制角色半肖像图
- #--------------------------------------------------------------------------
- def draw_actor_HalfBody(actor, x, y, enabled = true)
- draw_HalfBody(actor.face_name, actor.face_index, x, y, enabled)
- end
复制代码 在draw_actor_face函数中,我们看到它只调用了draw_face方法。
步骤2:我们搜索关键字:draw_face
得到Window_Base的 def draw_face(face_name, face_index, x, y, enabled = true)函数。
我们复制draw_face函数,更名为draw_HalfBody添加到Window_Base脚本中- #--------------------------------------------------------------------------
- # ● 绘制角色半身肖像图
- # enabled : 有效的标志。false 的时候使用半透明效果绘制
- #--------------------------------------------------------------------------
- def draw_HalfBody(face_name, face_index, x, y, enabled = true)
- bitmap = Cache.HalfBody(face_name)
- rect = Rect.new(face_index % 4 * 96, face_index / 4 * 194, 136, 194)
- contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
- bitmap.dispose
- end
复制代码 由于draw_face函数中用bitmap = Cache.face(face_name)语句。bitmap(位图)的意义我们决定了步骤3。
步骤3:我们在Cache脚本页搜索关键字:face
得到def self.face(filename)函数。
我们复制def self.face(filename)函数,更名为def self.HalfBody(filename)添加到Cache脚本中
脚本如下:- #--------------------------------------------------------------------------
- # ● 获取角色肖像图
- #--------------------------------------------------------------------------
- def self.HalfBody(filename)
- load_bitmap("Graphics/HalfBody/", filename)
- end
复制代码 最后我们修改Window_MenuStatus页面中的def draw_item(index)部分
改为- draw_actor_HalfBody(actor, rect.x, rect.y, enabled)
复制代码 上面那半身像一部分,我讲的整个过程。只不过是一个由结果逆向推导的思维过和。
测试如下 图
这一讲提供工程下载http://115.com/file/c2uroazw#教程4.zip
也许上面的讲解有错的地方,有就请指出,不要没事就乱喷!
谢谢各位观客。
下次讲解内容为:
回合制网游中的精典系统《跑商》。到那时会有跑商的核心脚本:NPC指定收购物品
补充一下:
有人在说背景的问题,在现在加一段脚本 放在Scene_Menu页面- #--------------------------------------------------------------------------
- # ● 生成背景
- #--------------------------------------------------------------------------
- def create_background
- @background_sprite = Sprite.new
- @background_sprite.bitmap =Cache.load_bitmap("Graphics/System/","Menubackground")
- @background_sprite.color.set(0,0, 0,0)
- end
复制代码 效果如下
上在的背景脚本好像有点小问题
提供另一种方法:在Scene_Menu中新建一个透明的Window_XX,然后用类似draw_face的函数加入背景- class Window_background < Window_Base
- #--------------------------------------------------------------------------
- # ● 初始化对象
- #--------------------------------------------------------------------------
- def initialize
- super(0, 0, 544,416)
- self.opacity = 0
- refresh
- end
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- contents.clear
- bitmap = Cache.load_bitmap("Graphics/System/","Menubackground")
- rect = Rect.new(0, 0, 544,416)
- contents.blt(0,0, bitmap, rect, 255)
- bitmap.dispose
- end
- end
复制代码 效果如下
至于窗口透明可在Window_XX的def initialize中加入脚本有人反应脚本有问题,所以重新改了一下 |
评分
-
查看全部评分
|