地图菜单窗口插件2:多级菜单联合【送:角色创建】
多级菜单联合范例:
示意图:
范例使用指南:
1. 复制除模板外的 4 个脚本。
2. 此脚本默认会占用数据库前 30 个角色,请把前 30 个角色的战斗图和行走图设置一下。
3. 此脚本默认占用全局变量 25 ,请在脚本【角色创建】的第 17 行左右修改
4. 尚未添加声音……看心情吧……
===================
2017/2/24 18:52 更新
5. 无视2,现在会占用数据库从 $Start_ID_CreateActor 开始的总共 $All_ID_CreateActor 个角色。
===================
原帖请看这里:
地图菜单窗口插件这个插件可以方便的在地图上弹出窗口,并接受用户的输入键进行处理,不太会用的作者可以直接调用公共事件,但是这个脚本本身有更丰富的用途。
为了不遗余力的推销我这个插件脚本(加上在6R刷存在感),我会继续编写这个插件的更多高级使用方法。
本期内容:
多级菜单联合使用
之前的脚本里提到,只能有一级的子菜单,那如果有多级的子菜单应该怎么办呢?当然没有问题,只需要在一个菜单的按键响应里调用另一个已经写好的菜单就行啦。这里还是拿一个具体的例子来着手做。于是我们来做一个“角色创建系统”吧!
大致实现以下功能:
1. 新增角色,子菜单是随机和确认,随机选项会产生姓名等基本属性。这里用随机而不是输入姓名也是为了方便制作……确认的话会把此角色加入到队伍里。
2. 删除角色,子菜单是当前队伍的所有角色,选中已经在队伍里的角色,删除此角色。
3. 修改角色,子菜单是当前队伍的所有角色,选择某一个特定的角色后,会出现2级子菜单,用来调整各种属性(此处就是多级菜单联合使用)
4. 确认退出,如果队伍人数正确,将已经创建好的角色加入队伍,开始游戏
首先我们分析思路:
1. 可以让玩家保存最多 8 个角色,但是队伍里只能有 4 个。众所周知,往数据库里写东西是很不正确的,所以提前在数据库里创建好 8 个角色,然后添加一个“小精灵”角色作为初始角色,让“小精灵”去触发角色制作事件。
2. 有一个数组用来保存当前已经创建好的角色对应数据库里的角色ID $all_saved_actor_ids = []。
2.1 如果是新建角色,就给数组里添加数组 $all_saved_actor_ids 中不存在,但是在 1-8 之间的最小整数。如果数组$all_saved_actor_ids长度为 8,则显示角色已满,要删除部分角色。
2.2 如果是删除角色,子菜单遍历$all_saved_actor_ids生成,按下确认键就把对应的ID从数组里去掉。如果数组$all_saved_actor_ids为空,显示“无角色”。
2.3 如果是修改角色,子菜单遍历$all_saved_actor_ids生成,按下确认键打开新的属性锁定菜单。如果数组$all_saved_actor_ids为空,显示“无角色”。
3. 确认退出,选中时检查 $ary_saved_actors.size 是否为 4 。是的话就调用公共事件,将设置好的角色信息写入 actors.rxdata ,并且将“小精灵”踢掉,把几位角色都拉入队伍。最后开始游戏。
4. 数据,关于随机生成名字,我找到了一个很好的字符串,去掉字符串里的 '·' 然后随机选择连续的 n 个字就行了,注意到UTF-8里每个汉字是3个字符的位置:
RUBY 代码
$name_str = "冰雪殇璃陌梦·爱樱沫渺·落璃琴依语·千梦然丝伤·可薇·茉殇黎·幽幻紫银·泪如韵影倾乐兰慕·凝羽冰蓝璃·泪伊如琉璃爱梦莲泪·冰雅泪落冰紫蝶梦·殇心樱语冰凌伊蝶梦如·璃紫陌悠千艳优墨阳云筱残·雪莲茉·伊文思·蕊夏清·碎墨音·芊乐梦黛怡·墨丽莎·梦灵苏魅香·紫蓝幽幻倾城萌美迷离·茉莉白嫩爱凤风魑·殇泪花如霜梦兰·萝莉心梦妖丽百千艳·瑰百合香珠合梦喃·泪伤梦雅爱之瑰·墨艳黎幻殇雪倩梦·情娜血清恋沫幽弥千月绯心丝梦灵蓝千月筱雪殇·希羽岚梦心殇雨樱琉璃舞韵倾雅·蕾玥瑷雅芸茜殇樱雪梦·曦魂梦月澪瑷琪欣泪·咝玥蓝·岚樱殇紫乐蝶雨·苏丽落雅馨瑷魅·音蕾琦洛凤之幽·蠫赬飖·风璃殇·颜鸢璃沫血伤·月冰灵希洛梦·玖兮恋琴爱·雨烟雪殇萌呗·血叶洛莉兰·凝羽冰蓝璃·泪伊如冰缈娅泪落冰花紫蝶梦珠·殇心樱语冰凌伊娜·洛丽塔紫心爱·蝶梦如璃紫陌悠千艳·优花梦冰玫瑰灵伤如爱·晶泪墨阳云筱残伤雅·琉璃爱梦莲泪·冰雪殇璃陌梦".gsub!(/·/,"")
def random_name(n)
start = rand($name_str.length / 3)
return$name_str
end
5. 接下来先制作主菜单和一级子菜单,实现添加角色的功能吧!(由于不能上传太多代码,这里隐去一些信息)
RUBY 代码
class Interpreter
# 用于在事件脚本中调用的初始化方法
def init_plugin_CreateActor
$all_saved_actor_ids = []
$name_str = "...".gsub!(/·/,"")
end
# 用于在事件脚本中调用的呼叫窗口方法
def call_mapmenu_CreateActor
...
call_mapmenu('新增角色', '删除角色', '编辑角色', '开始游戏')
...
$game_map.need_refresh = true
end
end
class Game_Party
# 插件 Task 设置
alias _CreateActor_set_mapwindow_task set_mapwindow_task
def set_mapwindow_task
# 保留之前的 task 设置
_CreateActor_set_mapwindow_task
# 新的内容只有插件开启的时候会添加
if$plugin_CreateActor_enable
# 具体的 Task 设置
# 新增角色
if$all_saved_actor_ids.size == 8
name = "新增角色:角色已满@Return"
text = "角色已满 8 人,请先删除角色!"
@tasks_info.push Game_Task.new(name,text)
else
...
end
# 删除和编辑角色
if$all_saved_actor_ids.empty?
...
else
$all_saved_actor_ids.eachdo |id|
...
end
end
# 开始游戏
if$all_saved_actor_ids.size == 4
...
else
...
end
end
end
end
class Window_MapMenu < Window_Command
# 插件 按键响应 设置
alias _CreateActor_run_confirm run_confirm
def run_confirm(ary)
_CreateActor_run_confirm(ary)
if$plugin_CreateActor_enable
# -------------------------------------------------------
# 具体的 按键响应 设置
# ---------------------------------------------------------
# 从 '@' 选项中读取角色ID
if ary =~ /ID\[(\d+)\]/
id = $1.to_i
end
# -------------------------------------------------------
if ary == "新增角色"
# -------------------------------------------------------
if ary == "随机生成"
$game_actors.name = random_name_CreateActor(4)
end
# -------------------------------------------------------
if ary == "确认结果"
$all_saved_actor_ids.push id
end
end
# -------------------------------------------------------
if ary == "删除角色"
if$all_saved_actor_ids.size > 0
$all_saved_actor_ids.delete id
end
end
# -------------------------------------------------------
if ary == "开始游戏"
if$all_saved_actor_ids.size == 4
...
else
end
end
end
end
# 用于生成随机的名字
def random_name_CreateActor(n)
...
end
end
现在才是正题:【多级菜单的调用】
子菜单是锁定菜单,在“编辑角色”激活时可以使用,选中特定角色,按下右键会打开。子菜单的设置和主菜单几乎一样,略有不同的地方是,在修改 $wmm_position 前,要把这个值存起来,退出菜单后还原。
子菜单的部分代码,请注意 14 行和 23 行。
RUBY 代码
class Interpreter
# 用于在事件脚本中调用的初始化方法
def init_plugin_LockAttributes
$lock_LockAttributes = * 12
$max_LockAttributes = 4# 最多锁定 4 个属性
end
# 用于在事件脚本中调用的呼叫窗口方法
def call_mapmenu_LockAttributes
# 初始化
init_plugin_LockAttributes if !$lock_LockAttributes
# 插件开启
$plugin_LockAttributes_enable = true
# 记录上一个窗口位置,设置窗口位置
last_position_LockAttributes = $wmm_position.clone
$wmm_position = {1=>[-100, -100, 100, 100], 2=>, 3=>}
# 设置窗口透明度,nil会调用默认透明度
$wmm_backopacity = nil
# 呼叫菜单,请设置此插件需要呼叫的主菜单
call_mapmenu('锁定属性')
# 插件关闭
$plugin_LockAttributes_enable = false
# 还原到上一个窗口位置
$wmm_position = last_position_LockAttributes
# 刷新地图
$game_map.need_refresh = true
end
end
主菜单中调用子菜单的方法,在 run_right 中:
RUBY 代码
alias _CreateActor_run_right run_right
def run_right(ary)
_CreateActor_run_right(ary)
if$plugin_CreateActor_enable
# -------------------------------------------------------
if ary == "编辑角色"
Interpreter.new(0,true).call_mapmenu_LockAttributes
end
end
end
其实就是新建一个Interpreter对象,因为呼叫菜单的方法定义在了 Interpreter 中。仅此一句,十分简单。
范例已上传
本帖来自P1论坛作者luliang,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=399070若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]