系列目录

  1. 以SCM插件为基座开发的简易经营游戏思路 - 菜单篇
  2. 以SCM插件为基座开发的简易经营游戏思路 - 状态篇

准备

本篇默认你已经看过了上一篇教程,所以除了必要的情况之外,不会再对讲过的内容重复讲解

延续上一篇的案例,这一篇会搭建一个可以随时切换角色,且可以翻页的新的状态界面

因为接下来可能要涉及到一点点必要的js知识,所以这里给一本教材

通过网盘分享的文件:(分享用)MZ脚本调用大全.xlsx
链接: https://pan.baidu.com/s/1GZcenJU26CrYnvEGrMwttA?pwd=fj7n 提取码: fj7n
–来自百度网盘超级会员v3的分享

这是rmmz核心代码提供的调用脚本文档,感谢制作了中文文档的大佬

另外,这一篇还不会教显示备注栏图片的方法,因为美术素材还没准备好。不过自己摸索应该也能会了

窗口布局

双击选择一个新的空白场景,这次不用再在之前那个场景里塞窗口了,本文命名为Scene_statusNew

有了新场景的标识符,就可以在主菜单的确定事件补上选择人员的分歧了:

1
2
3
4
◆如果:主菜单-index = 2
◆脚本:SceneManager.callCustomMenu('Scene_statusNew');

:结束分支

这样选择对应选项,就会跳到对应的场景中

然后设计窗口布局,看过了上一篇,布局应该就不算特别难办了,只贴一下数值,就不详细展开讲了。

  • 角色列表actorSelect:宽96
  • 角色参数窗口statusParam:相对X坐标窗口actorSelect,高560

如果预计在角色列表中显示的角色会很多,建议定一个固定的高度
因为自动根据行数增加宽度不会自动适应窗口,而是会直接超出屏幕
这里只是演示,所以就先不固定高度了

窗口内容

角色列表

只要获取当前队内的角色

1
$gameParty.members(); // 队伍成员

并画一个角色行走图就行

1
this.drawActorCharacter(item, r.x + 24, r.y + 96); // 角色图形

另外xy偏移需要自己按需调整,r.x应该不用动,r.y加上行走图的高度,我用的行走图是96x96一格

角色参数

首先在在列表窗口标识符输入角色列表的标识符,应该不用强调吧

这次需要在窗口中显示较长一串文本,除了对应角色的属性之外,还要显示一段给玩家看的属性说明,所以需要用上绘制脚本(多行)来输入

我去,这么多的……别急,等会有办法来精简

由于这个游戏是模拟经营游戏,所以用不上自带的那些攻击力啊,防御力啊这些属性,所以我们只能把这些数值存到变量里面,除了属性之外,还需要好感度,以及一个专门用于存放设定的工作安排的变量,总之大概要像这样创建一些变量

1
2
3
4
5
6
7
8
9
10
11
12
v151:角色A的身手
v152:角色A的技巧
v153:角色A的交际
v154:角色A的洞察
v155:角色A的工作安排(角色A是游戏的主要控制角色,所以不需要信赖度)
v156:角色B身手
v157:角色B技巧
v158:角色B交际
v159:角色B洞察
v160:角色B信赖
v161:角色B工作安排
……

这样以此类推,没招了,一个个建吧

建议用记事本或者便签之类的稍微记一下,因为后续还会用到

然后,在角色备注栏中输入元数据:

1
2
3
4
<param:\c[6]身手\c[0]:\v[151]
\c[6]技巧\c[0]:\v[152]
\c[6]交际\c[0]:\v[153]
\c[6]洞察\c[0]:\v[154]>

像这样输入到角色A的备注栏当中,然后复制到角色B的备注栏,把标识符里的变量编号改改

然后写上参数窗口的项目绘制脚本:

1
this.drawTextEx(`${item.meta.param}`, r.x + 324, r.y + 16, r.width); // 任意文本绘制(含控制字符转换)

这样测试游戏,就能看到属性列表了!……吧?

不是,它怎么报错了!

这是因为,这个脚本中提供的item变量,它读取角色的数据时,它读取的并不是数据库里的角色数据,而是游戏中当前状态下的角色数据。也就是说,它读取的其实是$gameParty.members[n],而不是使用了元数据的$dataActor。打开开头给你们的教材,在game data表中找到$gameParty.members[n]的部分,看第三列的属性部分,是不包含note和meta的。

不过,它有一个叫做actor()的属性,可以通过它来获取对应角色在数据库中的数据。我们把项目绘制脚本改成这样

1
this.drawTextEx(`${item.actor().meta.param}`, r.x + 324, r.y + 16, r.width); // 任意文本绘制(含控制字符转换)

就可以正常显示元数据param中的一串文本了

接下来补全剩下的属性信息,它基本上是不会在游戏中改变的,并且drawTextEx支持手动换行,放心大胆地换吧

1
2
3
4
5
6
7
this.drawTextEx(`${item.actor().meta.param}`, r.x + 324, r.y + 16, r.width); // 任意文本绘制(含控制字符转换)
this.drawTextEx(`\\c[5]参数说明\\c[0]
\\c[6]身手\\c[0]:
\\c[6]技巧\\c[0]:
\\c[6]交际\\c[0]:
\\c[6]洞察\\c[0]:
`, r.x + 324, r.y + 206, r.width); // 任意文本绘制(含控制字符转换)

其实这段参数说明文案我还没想好怎么写,只是觉得这里太空了所以要写点东西

精简长段文本

此处的方法,仅适用于前置为PluginCommonBase的插件!

我们后续还要在角色的备注栏中输入更多的文本,例如角色简介、角色优势之类的,但在备注栏输入的文本越来越多,备注栏就越来越长,所以我们肯定是希望备注栏中的文本能够更精简清晰一些

我们可以用到一个官方插件:TextScriptBase,和PluginCommonBase应该是在一个文件夹里。

而这个插件中,我们要用到的功能也很简单,就是将一段很长的文本,浓缩在一个控制符里,插入了这个控制符,就会调用这一段文本

在文本数据列表中双击空位,像这样输入:

  • 识别符:paraminfo

  • 文本

    \c[5]参数说明\c[0]

    \c[6]身手\c[0]:

    \c[6]技巧\c[0]:

    \c[6]交际\c[0]:

    \c[6]洞察\c[0]:

由于从原来的js代码变为了文本,所以不需要用双斜杠转义了,改成单个斜杠符号就行。

没有自动换行功能,需要自己来手动换行。

这样,只要我们插入\tx[paraminfo],就能显示出这么一长串文本。回去把项目绘制脚本改成:

1
2
this.drawTextEx(`${item.actor().meta.param}`, r.x + 324, r.y + 16, r.width); // 角色属性
this.drawTextEx(`\\tx[paraminfo]`, r.x + 324, r.y + 206, r.width); // 属性说明

这样的显示效果,和改之前是没区别的,且代码更为精简了。

接下来要显示大段文本的情况,也将会这样处理。不过……

状态窗口的翻页

不是说好的,按下确定键就会翻页吗,这只写了一个参数显示窗口,我角色介绍窗口呢?

好吧,由于我不知道如何直接刷新窗口的显示内容,所以我们要用特别笨的办法,那就是再建一个显示角色介绍的窗口,通过确定键来交替显示,实现翻页的效果。

可以把角色参数窗口直接复制一个,标识符改成statusBio就行,先把项目绘制内容删掉,以便测试的时候查看翻页的效果。

接下来,给statusBio和statusParam各设定一个显示开关

statusBio就是108号的这个,statusParam就是107号

然后新建一个叫【状态-翻页】的公共事件

1
2
3
4
5
6
7
8
9
◆如果:状态-显示参数 为 开启
◆开关操作:#0107 状态-显示参数 = 关闭
◆开关操作:#0108 状态-显示介绍 = 开启

:否则
◆开关操作:#0107 状态-显示参数 = 开启
◆开关操作:#0108 状态-显示介绍 = 关闭

:结束分支

嗯,应该比较好理解,就不解释了

然后在角色选择窗口中(因为我们在状态场景中,从始至终都是保持激活角色选择窗口),设置确定事件,绑上刚才新建的公共事件

窗口标识符填上角色选择窗口自己的,防止它飞到别的窗口中

这样,当我们在状态界面按下确定键,就会交替显示两个窗口了

为什么不用pgup和pgdn来进行翻页?
因为虽然场景设置中可以选择开启翻页按钮,但实际上我这里显示不出来,考虑到可能需要的移动端适配,所以采用了确定键翻页的方法
如果有人知道为啥显示不出翻页按钮,可以告诉我

介绍窗口的内容

按照角色参数内教的内容,应该自己也会弄了,这里也不展开讲了。

项目绘制脚本

1
2
this.drawTextEx(`${item.actor().meta.bio}`, r.x + 324, r.y + 16, r.width); // 角色介绍
this.drawTextEx(`${item.actor().meta.data}`, r.x + 324, r.y + 256, r.width); // 角色优势劣势

其实这两个内容全都放在一个元数据里也可以,这里是方便排版美观

分别设置角色备注栏

剩下的在TextScriptBase里设置的内容就不放了。这样应该就能显示角色的简介和优劣势了。

drawNoteText这个方法,和用drawTextEx绘制item.meta,有什么区别?
前者会无差别的绘制出备注栏的所有内容,而后者只会绘制元数据,所以哪个比较常用就不用多说了吧

后记

现在状态界面也已经搭建完成,接下来就是比较重量级的经营系统了。