查看: 55|回复: 0

[转载发布] 地图菜单窗口插件2:多级菜单联合【送:角色创建】

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月七日(秋) | 显示全部楼层 |阅读模式
    多级菜单联合

    范例:

    示意图:

    范例使用指南:
    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 代码
    1. $name_str = "冰雪殇璃陌梦·爱樱沫渺·落璃琴依语·千梦然丝伤·可薇·茉殇黎·幽幻紫银·泪如韵影倾乐兰慕·凝羽冰蓝璃·泪伊如琉璃爱梦莲泪·冰雅泪落冰紫蝶梦·殇心樱语冰凌伊蝶梦如·璃紫陌悠千艳优墨阳云筱残·雪莲茉·伊文思·蕊夏清·碎墨音·芊乐梦黛怡·墨丽莎·梦灵苏魅香·紫蓝幽幻倾城萌美迷离·茉莉白嫩爱凤风魑·殇泪花如霜梦兰·萝莉心梦妖丽百千艳·瑰百合香珠合梦喃·泪伤梦雅爱之瑰·墨艳黎幻殇雪倩梦·情娜血清恋沫幽弥千月绯心丝梦灵蓝千月筱雪殇·希羽岚梦心殇雨樱琉璃舞韵倾雅·蕾玥瑷雅芸茜殇樱雪梦·曦魂梦月澪瑷琪欣泪·咝玥蓝·岚樱殇紫乐蝶雨·苏丽落雅馨瑷魅·音蕾琦洛凤之幽·蠫赬飖·风璃殇·颜鸢璃沫血伤·月冰灵希洛梦·玖兮恋琴爱·雨烟雪殇萌呗·血叶洛莉兰·凝羽冰蓝璃·泪伊如冰缈娅泪落冰花紫蝶梦珠·殇心樱语冰凌伊娜·洛丽塔紫心爱·蝶梦如璃紫陌悠千艳·优花梦冰玫瑰灵伤如爱·晶泪墨阳云筱残伤雅·琉璃爱梦莲泪·冰雪殇璃陌梦".gsub!(/·/,"")
    2. def random_name(n)
    3.   start = rand($name_str.length / 3)
    4.   return$name_str[start*3..start*3+n*3-1]
    5. end
    复制代码


    5. 接下来先制作主菜单和一级子菜单,实现添加角色的功能吧!(由于不能上传太多代码,这里隐去一些信息)
    RUBY 代码
    1. class Interpreter
    2.   # 用于在事件脚本中调用的初始化方法
    3.   def init_plugin_CreateActor
    4.     $all_saved_actor_ids = []
    5.     $name_str = "...".gsub!(/·/,"")      
    6.   end  
    7.   # 用于在事件脚本中调用的呼叫窗口方法
    8.   def call_mapmenu_CreateActor
    9.     ...
    10.     call_mapmenu('新增角色', '删除角色', '编辑角色', '开始游戏')
    11.     ...
    12.     $game_map.need_refresh = true
    13.   end
    14. end
    15. class Game_Party
    16.   # 插件 Task 设置
    17.   alias _CreateActor_set_mapwindow_task set_mapwindow_task
    18.         def set_mapwindow_task
    19.     # 保留之前的 task 设置
    20.     _CreateActor_set_mapwindow_task
    21.     # 新的内容只有插件开启的时候会添加
    22.     if$plugin_CreateActor_enable
    23.       # 具体的 Task 设置
    24.       # 新增角色
    25.       if$all_saved_actor_ids.size == 8
    26.         name = "新增角色:角色已满@Return"
    27.         text = "角色已满 8 人,请先删除角色!"
    28.         @tasks_info.push Game_Task.new(name,text)
    29.       else
    30.         ...
    31.       end
    32.       # 删除和编辑角色
    33.       if$all_saved_actor_ids.empty?
    34.         ...
    35.       else
    36.         $all_saved_actor_ids.eachdo |id|
    37.           ...
    38.         end
    39.       end
    40.       # 开始游戏
    41.       if$all_saved_actor_ids.size == 4
    42.         ...
    43.       else
    44.         ...
    45.       end
    46.     end
    47.   end
    48. end
    49. class Window_MapMenu < Window_Command
    50.   # 插件 按键响应 设置
    51.   alias _CreateActor_run_confirm run_confirm
    52.   def run_confirm(ary)
    53.     _CreateActor_run_confirm(ary)
    54.     if$plugin_CreateActor_enable
    55.       # -------------------------------------------------------
    56.       # 具体的 按键响应 设置
    57.       # ---------------------------------------------------------
    58.       # 从 '@' 选项中读取角色ID
    59.       if ary[2] =~ /ID\[(\d+)\]/
    60.         id = $1.to_i
    61.       end
    62.       # -------------------------------------------------------
    63.       if ary[0] == "新增角色"
    64.         # -------------------------------------------------------
    65.         if ary[1] == "随机生成"
    66.           $game_actors[id].name = random_name_CreateActor(4)
    67.         end
    68.         # -------------------------------------------------------
    69.         if ary[1] == "确认结果"         
    70.           $all_saved_actor_ids.push id         
    71.         end        
    72.       end
    73.       # -------------------------------------------------------
    74.       if ary[0] == "删除角色"
    75.         if$all_saved_actor_ids.size > 0
    76.           $all_saved_actor_ids.delete id
    77.         end
    78.       end
    79.       # -------------------------------------------------------
    80.       if ary[0] == "开始游戏"
    81.         if$all_saved_actor_ids.size == 4
    82.           ...
    83.         else
    84.         end
    85.       end
    86.     end
    87.   end
    88.   # 用于生成随机的名字
    89.   def random_name_CreateActor(n)
    90.     ...
    91.   end
    92. end
    复制代码



    现在才是正题:【多级菜单的调用】
    子菜单是锁定菜单,在“编辑角色”激活时可以使用,选中特定角色,按下右键会打开。子菜单的设置和主菜单几乎一样,略有不同的地方是,在修改 $wmm_position 前,要把这个值存起来,退出菜单后还原。
    子菜单的部分代码,请注意 14 行和 23 行。
    RUBY 代码
    1. class Interpreter
    2.   # 用于在事件脚本中调用的初始化方法
    3.   def init_plugin_LockAttributes
    4.     $lock_LockAttributes = [false] * 12
    5.     $max_LockAttributes = 4# 最多锁定 4 个属性
    6.   end
    7.   # 用于在事件脚本中调用的呼叫窗口方法
    8.   def call_mapmenu_LockAttributes
    9.     # 初始化
    10.     init_plugin_LockAttributes if !$lock_LockAttributes
    11.     # 插件开启
    12.     $plugin_LockAttributes_enable = true
    13.     # 记录上一个窗口位置,设置窗口位置
    14.     last_position_LockAttributes = $wmm_position.clone
    15.     $wmm_position = {1=>[-100, -100, 100, 100], 2=>[0, 320, 160, 160], 3=>[160, 320, 480, 160]}
    16.     # 设置窗口透明度,nil会调用默认透明度
    17.     $wmm_backopacity = nil
    18.     # 呼叫菜单,请设置此插件需要呼叫的主菜单
    19.     call_mapmenu('锁定属性')
    20.     # 插件关闭
    21.     $plugin_LockAttributes_enable = false
    22.     # 还原到上一个窗口位置
    23.     $wmm_position = last_position_LockAttributes
    24.     # 刷新地图
    25.     $game_map.need_refresh = true
    26.   end
    27. end
    复制代码


    主菜单中调用子菜单的方法,在 run_right 中:
    RUBY 代码
    1. alias _CreateActor_run_right run_right
    2.   def run_right(ary)
    3.     _CreateActor_run_right(ary)
    4.     if$plugin_CreateActor_enable
    5.       # -------------------------------------------------------
    6.       if ary[0] == "编辑角色"
    7.         Interpreter.new(0,true).call_mapmenu_LockAttributes
    8.       end      
    9.     end
    10.   end
    复制代码

    其实就是新建一个Interpreter对象,因为呼叫菜单的方法定义在了 Interpreter 中。仅此一句,十分简单。

    范例已上传

                 本帖来自P1论坛作者luliang,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=399070  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-13 00:31 , Processed in 0.064159 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表