查看: 4812|回复: 3

[原创发布] 地图菜单窗口插件v20170220更新【送:技能商店】

[复制链接]
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-2-18 00:20:58 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

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

×
本帖最后由 guoxiaomi 于 2017-2-26 09:26 编辑

=20170220=更新=纯净版=
地图窗口纯净版+技能商店.zip (351.55 KB, 下载次数: 182)
更新内容:
# 【删除】
# 1. 此版本只保留了一个任务,所以是纯净版
# 2. 此版本只保留了取消键的音效,以及主菜单确认键的音效
# 【修改】
# 1. 此版本修改了 '@' 选项,现在要用 Pageturning Quitmenu Refresh Switchon[n]
#    这些比较长的参数代替原来的 P Q R S[n]。这是为了方便后续插件脚本的编写。
# 2. 修正了任务名称出现正则表达式字符的问题,现在可以随意使用 /.*?+-[]/ 等
# 3. 现在只要有不同 '@' 选项,即使是同名的任务也会被正常识别、显示
# 【新增】
# 1. 在呼叫菜单中使用 \c[n] 命令修改主菜单颜色: call_mapmenu('\c[2]默认设置')
# 2. 在 '@' 选项中使用 Textcolor[n] 修改子菜单颜色
# 3. 修改全局变量 $wmm_position 来调整窗口位置
# 4. 修改全局变量 $wmm_backopacity 来调整窗口透明度
# 5. 添加了 Window_Show 用于显示一行文字
# 【脚本】
# 1. 提供一个插件脚本模板
# 2. 提供赠品:技能商店
# 【赠品】
# 插件脚本范例-技能商店
# 1. 技能商店能正常使用
# 2. 修复了 读档之后 会使菜单初始化的BUG
技能商店图:
捕获.PNG



最近研究了一下 6R 上的任务界面(by 叶子),发现其自由度很高,于是写了一个增强的脚本,用来在地图上显示菜单。在6R上也搜了搜,好像没有特别类似的脚本?总之发给大家交流学习~

任务界面在 XP 图书馆 的 7 楼

具体想做成的样子大概就是这样吧(摘自《毁灭66RPG》)



目前的山寨版效果,字号改不了,其他的还是蛮像的 :
捕获.PNG
[fold=水区行政决议事件][pre lang="ruby"]
Window_MapMenu::BACK_OPACITY = 192
Window_MapMenu::POSITION_1 = [16,96,
240,64]
Window_MapMenu::POSITION_2 = [16,180,
240,200]
Window_MapMenu::POSITION_3 = [320,16,
300,448]
call_mapmenu('水区行政决议')
[/pre][/fold]
[fold=水区行政决议脚本][pre lang="ruby"]#--------------------------------------------------------------------------
    # 水区行政决议
    #--------------------------------------------------------------------------
    name = "水区行政决议:掠夺水区资源"
    text = ""
    @tasks_info.push Game_Task.new(name,text)
    name = "水区行政决议:开放无限水贴"
    text = "\\s[32]\\c[4]  开放无限水贴\\c[0]\\s[0]\n" +
           "\\s[18]我们有一个优良的传统,那就是什么事情都能,水一贴,但是原先的版规破坏了我们这个传统,现在我们掌握了这里的政权,我们要做的就是\n\\s[0]" +
           "每人每天不限水贴!\n" +
           "效果:本地叛乱增长-10%\n\n\n\n\n" +
           "\\c[4]花费:\\c[0]\n  1000\\c[4]VIP\\c[0]\\s[32]    执行\\s[0]"
    @tasks_info.push Game_Task.new(name,text)
    name = "水区行政决议:取缔水区娱乐类活动"
    text = ""
    @tasks_info.push Game_Task.new(name,text)
    name = "水区行政决议:版聊官方化"
    text = ""
    @tasks_info.push Game_Task.new(name,text)
    name = "水区行政决议:水区绝对执法权"
    text = ""
    @tasks_info.push Game_Task.new(name,text)
[/pre][/fold]


这个脚本也是希望不会写window的制作者也能轻松做出接近上面这个样子的菜单

脚本特色:

0. 插件型脚本,几乎不会冲突
1. 对任务界面的改动很小,稍作改动就能兼容原来的任务界面
2. 显示菜单的时候,进入死循环,游戏暂停
3. 拥有一个子菜单,可以自定义显示的内容和按键的处理
4. 可以调用公共事件完成更多的功能
5. 可以自定义窗口的位置和透明度

范例工程(未脱离RTP):其中有详细的说明

地图窗口.zip (211.89 KB, 下载次数: 111)

详细的功能和使用说明:

1. 自定义菜单选项
任务界面里需要玩家自定义任务,对于菜单选项,要求把任务名设置为如下格式(举例):设置:修改变量@r。用冒号和@符号隔开的三个部分,第一部分是“主菜单”,第二部分是“子菜单”,第三部分是“选项”。任务内容可以自行设定。
3.PNG

2. 使用方法
在事件脚本里调用(举例)
[pre lang="ruby"]call_mapmenu('设置')[/pre]
就会打开地图菜单,并且加载所有第一部分为“设置”的菜单选项,如图:
4.PNG
如果call_mapmenu后面不加任何参数,会调用默认的菜单,在脚本“自定义任务”的的 129 行可以自行修改
5.PNG

3. 按键和子菜单
按下取消键会退出菜单,按下确认键,会显示所有的子菜单,并在右边的窗口里显示提前写好的内容。@和后面的部分不会显示
6.PNG

4. 自定义按键相应
对于不同的事件,按下确认键和方向键之后的响应,也是可以自定义的。
7.PNG
比如这里就定义了选项“修改变量”在按下确认键的时候会使 变量1 增加 1。同样也可以在 run_left 和 run_right 的方法里定义左右方向键的功能

5. '@'的使用
'@'后面的部分是选项,在后面添加不同的选项会提供不同的默认功能,这个也可以自行定义,目前的功能如下:
'@'后添加 p ,可以用左右键翻页
'@'后添加 q ,按下确认键会自动退出菜单
'@'后添加 r ,按下确认键会刷新菜单内容
'@'后添加 s[10] ,按下确认键会打开开关 10,这里的 10 也可以改成别的整数

6. 调用公共事件
如果一个选项以 '@qs[1]'结尾,那么按下确认键之后,会先打开开关1,再退出菜单窗口。此时如果有一个公共事件设置为了“自动执行”或“并行处理”,并且条件开关就是1,那么这个事件会执行。事件相关的操作暂时不提。事件的设置如下:
8.PNG
最开始就关闭开关,避免事件重复执行,但是要注意的是:
  1. “自动执行”的公共事件,会在当前的事件完全结束后再执行。
  2. “并行处理”的公共事件,会在退出菜单窗口之后立即执行,但是如果事件脚本“call_mapmenu”后面紧接着是显示文章,并行处理的事件中的显示文章会跳过。
  3. 简单的说就是公共事件里有“显示文章”,用“自动执行”,否则用“并行处理”。

7. 隐藏选项(灵活控制出现的选项)
因为每次移动或者是按键后,都会读取一次 set_mapwindow_task,所以可以在这里面作文章,控制显示or隐藏的菜单选项。具体的请看工程。

8. 其他可以自定义的部分
可以自定义窗口的透明度和位置,以及默认字号的大小(20)

9. 缺点
1. 左边的2个菜单窗口里文字的颜色和大小,需要自己单独修改
2. 虽然可以调整右边窗口的文字大小,但是不能修改行距 已解决,目前行距设置为 ( 文字大小 * 1.25 + 4 ) 取整,在脚本“任务界面”的第 600 行左右的 2 处可以自行修改
3. 如果想实现复杂的功能,还是免不了对脚本的使用



改进版现身!
增加了以下功能:
1. 在call_mapmenu('主菜单') 的参数中加上 \c[n] 会使主菜单的此项改变颜色,举例:
[pre lang="ruby"]# 变成 2 号颜色(红色),注意引号和\的数量
call_mapmenu('公共事件\c[2]') # 单引号里面是  \
call_mapmenu("公共事件\\c[2]") # 双引号里面是 \\
[/pre]
2. '@'后面添加 c[n] 会使子菜单的此项改变颜色,举例:设置 name = '公共事件:自动@qs[2]c[2]',则子菜单中此项显示红色

3. 如果主菜单只有唯一的选项,呼叫菜单后会直接进入子菜单,按 x 会离开地图菜单,并且取消了主菜单的选项框
如图:
捕获.PNG
4. 如果想临时改变窗口位置,或者透明度,直接脚本修改常量也是可以的,因为ruby不会因为修改常量而报错……
[pre lang="ruby"]Window_MapMenu::BACK_OPACITY = 255
Window_MapMenu::POSITION_1 = [60,120,
100,160]
Window_MapMenu::POSITION_2 = [60,280,
100,160]
Window_MapMenu::POSITION_3 = [160,120,
360,320]
call_mapmenu('\c[2]说明')[/pre]效果如图:
捕获.PNG

# 2017/2/18 新增
5. 增加了按键的音效,想修改的请在脚本“地图菜单”里搜索 '$game_system.se_play' 然后自行修改参数或者删除

改进版的范例:
地图窗口-魔改2.zip (212.9 KB, 下载次数: 92)



如果很巧你的工程中要用到叶子的任务系统脚本,请用我这个修改后的脚本,并且找到第 105 行
[pre lang="ruby" line="105"]class Game_Party
        #--------------------------------------------------------------------------
        # ● 设置任务资料
        #--------------------------------------------------------------------------
        def get_tasks_info
                @tasks_info = []
                set_mapwindow_task
        end
end[/pre]
将你之前写的 @tasks_info[n] = Game_Task.new(name, text) 的那一堆全部插入到 set_mapwindow_task 的前面,这样就能与叶子的任务系统兼容。

评分

参与人数 1星屑 +60 收起 理由
夜狠简单 + 60 塞糖

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

 楼主| 发表于 2017-2-19 16:51:46 | 显示全部楼层
本帖最后由 guoxiaomi 于 2017-3-20 00:21 编辑

[fold=写在前面]
多说几句吧,跟前面的发布帖内容不重合,所以觉得有另开一贴的必要。

经常在提问区看到有这样的问题“XX功能怎么实现?”这个其实不算是一个问题,而是2个问题:

1. XX功能在逻辑上怎么实现?

2. XX功能的逻辑怎么在RM工具上实现?

某些“伸手党”让人无语的原因,就是太执着于要第 2 点的答案。即使有人解答了逻辑上的实现方法,“伸手党”会评论“我想要一个脚本”or“有没有工程”。但不理解第 1 点所说的逻辑结构,只是单纯的要脚本,在能力上并不会有提高。

那知道逻辑上怎么实现,但是卡在第 2 点的原因,大多是因为不懂 RGSS 的数据结构以及常见的 Scene 和 Window 的写法。这个脚本就是提供了一个 Window 的框架,用来显示文字并接受用户按键的响应。

卡在第 2 点的作者们,可以借助这个脚本进行实现。

如果大家觉得有意义,我可以写一个 Scene 的模板,才怪……
[/fold]

本楼层用于给上面的脚本提供具体功能的范例,不定时更新。如果有需求,也可以在本楼层点评或者回复,我会判断实现的难度,并提供逻辑 or RM 上的具体实现。

PS:只会提供实现的逻辑、 task 的设置和 run_XXX 方法里的设置,一般不提供具体工程。

只能假设你看到这里的时候,对上面的脚本具体的结构大概了解,并且了解Ruby常见的循环、判断等基础知识。否则往下看意义也不大。

下面是已经写好的插件列表:

[fold=1. 技能商店]
1. 技能商店 (就在主楼中)
这里写一下技能商店的实现思路,以后的功能会开新贴。
先拿技能商店开刀吧~也算是造轮子,但是这个简单!别慌我先去搜索里面看看大家想实现的技能商店是什么样子。
- - - - - - - -
好了,看了一遍,技能商店有以下的功能:
1. 每个商店有不同的技能库存,购买后库存消耗,可以通过指令刷新库存。
2. 每个角色对应不同的技能 or 每个技能对应不同的角色
3. 学习技能的限制:金钱、等级、是否已经学会的其他特定技能
4. 学会的技能可以遗忘
- - - - - - - -
就这么多,下面说一下实现的方法,
1. 逻辑和数据
1.1 每个商店就是一个事件,商店卖什么技能,在事件 or 脚本里提前写好某全局变量$skill_shops[1],然后生成菜单窗口的时候读取这部分,这样实现了第 1 点。同时玩家的购买时会更新这个变量。

1.2 主菜单是队伍里的所有角色,子菜单里列出 [所有角色可以学的技能] 和 [商店售卖的技能] 的交集。[所有角色可以学的技能] 的数据在哪里找呢?如果这个数据是不会改变的话,再设置一个常量就可以。

1.3 每个技能的学习限制,这里为了简单,假设每个技能的限制(金钱、等级、先决技能)是不变的,所以也设置一个常量来保存。

1.4 学会的技能可以遗忘,如果此技能已经学会,选中时按下空格键会遗忘,返回一定比例的金钱,同样为了简单,遗忘技能但是不影响后面已经学过的强力技能。

1.5 子菜单激活时,右边的窗口要展示技能说明,所需金钱等,以及补充按键响应的音效。

2. 具体实现
0. 按照模板一步步来。

1. Class Interpreter 中有2个方法:
init_skill_shop用来初始化数据,包括  [商店售卖的技能],[所有角色可以学的技能]  和 [每个技能的学习限制]。实际操作中要把常量放在方法外定义。
call_skill_shop带有一个参数,为了方便,如果商店的数据存储在第 n 个全局变量里,那么这个参数就是 n。

2. Class Game_Party 的方法:
set_mapwindow_task2重循环 队伍里的所有角色 和 每个角色可以购买的技能 ,设置 tasks_info 的内容。为了后面检索方便,设置 '@'选项为 Actor[m]Skill[n] 指的是ID = m的角色和 ID = n的技能。

3. Class Window_MapMenu的方法:
run_confirm首先读取'@'选项的内容获得角色ID和技能ID,然后根据这两个ID 检索 [所有角色可以学的技能]  和 [每个技能的学习限制],决定按键后的响应效果。

4. 做一些优化和Debug。比如:补充help_window,添加音效,方法结束刷新地图等。
[/fold]
[fold=2. 角色创建]
地图菜单窗口插件2:多级菜单联合【送:角色创建】
[/fold]
[fold=3. 猜数字]
地图菜单窗口插件3: 与公共事件交互【送:猜数字】
[/fold]
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
910
在线时间
94 小时
注册时间
2005-10-22
回帖
335
发表于 2018-3-24 21:08:07 | 显示全部楼层
哎,很多以前的东东都没了,导致版主大大做了好多的重复工作,辛苦啦。

点评

很多东西一开始也不是那么完美的,每次相似的内容发出来,都会有进步~  发表于 2018-3-24 21:39
做脚本先从修改脚本做起,我只修改自己觉得能用到的东西。
以后的任何作品都将不会进行分享。
Bilibili:https://space.bilibili.com/288814521
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部