设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2298|回复: 17
打印 上一主题 下一主题

[原创发布] 使用HTML 来开发RMMV的UI

[复制链接]

Lv2.观梦者

梦石
0
星屑
679
在线时间
71 小时
注册时间
2022-4-18
帖子
29
跳转到指定楼层
1
发表于 2023-6-28 10:19:35 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 m1615690513 于 2023-7-1 05:48 编辑

【开发的背景】:

考虑到HTML生态的繁荣和VUE3的优势,我们决定让PIXI.JS专注于游戏画面的渲染,而将UI部分交给HTML处理。以前基于PIXI的UI界面定制开发工作量相对较大,但现在我们可以借助HTML和VUE3的力量,大大减少代码的编写量。

由于RMMV使用的PIXI版本较为老旧,对于CSS的支持较差。因此,在创建渐变特效或动画时,可能需要额外编写大量的代码。不过,值得一提的是,CSS3的动画已经能够满足许多UI使用场景的需求。

另外一个好处是,通过减少PIXI绘制UI的工作,可以在一定程度上提高游戏的帧率。这是因为UI渲染通常会占用一定的计算资源,将其交给HTML处理后,游戏的帧率可能会有所提升。

以前,前端开发人员需要学习PIXI.js来开发界面。然而,现在我们可以将界面的开发完全交给前端开发人员来处理,因为他们不再需要了解PIXI.js,只需要专注于他们已经熟悉的领域,比如VUE等。这样做的好处是前端开发人员可以更加专注于自己擅长的技术栈,提高工作效率。

实现细节:
我们在Graphics上添加了一个UI容器,用于显示UI组件。通过动态加载HTML界面,并执行其中可见的脚本内容,因此可以实现不同场景下的个性化UI场景。通过持续替换UI容器的内容,实现动态变化。

使用的建议:
当前版本仅提供预览,不建议普通用户实际使用。预期使用者是那些具备JS基础和HTML基础的开发人员,因为我们需要重写所有原先采用PIXI实现的UI界面,转而替换成DOM版本。这个工程还有很多工作尚未完成。不过,对于极客开发者来说,他们也可以尝试使用。

对于普通用户而言,我们将在完成UI界面的全部重写之后,提供完整替代方案,并支持多种主题配色方案。请尽情期待这些更加丰富和多样化的功能!

【更新日志-20230701】:
- 我们对游戏标题界面进行了重写,样式参考了MZ的UI标题界面。(Scene_Title.html)
- 我们移除了不必要的代码若干。
- 我们额外提供了themes.css 用于配置主题色

下载地址: 使用实例.zip (382.93 KB, 下载次数: 38)

以下是该版本的预览效果:


themes.css 长这样子:
CSS 代码复制
  1. /* 主题变量 */
  2. :root {
  3.     /**文本阴影**/
  4.     --mv-text-shdow: 2px 2px 4px #555555;
  5.     /**字体颜色**/
  6.     --mv-color: #ffffff;
  7.     /**背景颜色**/
  8.     --mv-bg-color: #000000;
  9.     /** 文字对齐方式 **/
  10.     --mv-text-align: center;
  11.     /**字体**/
  12.     --mv-font-family: Arial, GameFont, sans-serif;
  13.     /** 选项框背景色 **/
  14.     --mv-w-select-bg-color: var(--mv-bg-color);
  15.     /** 选项框透明度 最大255 **/
  16.     --mv-w-select-bg-opacity: 192;
  17.     /** 选项框背景填充5像素 **/
  18.     --mv-w-select-bg-padding: 5px;
  19.     /** 选项框背景色 **/
  20.     --mv-w-select-bg-radius: 10px;
  21.     /** 选项框边框颜色 **/
  22.     --mv-w-select-bg-border: 5px #6f91d1 solid;
  23.     /** 选项字体颜色 **/
  24.     --mv-w-select-item-color: var(--mv-color);
  25.     /** 选项边框 **/
  26.     --mv-w-select-item-boder: 2px black solid;
  27.     /** 选项行高度 **/
  28.     --mv-w-select-item-line-height: 36px;
  29.     /** 选项文字大小 **/
  30.     --mv-w-select-item-font-size: 20px;
  31.     /** 选项文字对齐方式 **/
  32.     --mv-w-select-item-text-align: var(--mv-text-align);
  33.     /** 选项背景颜色 **/
  34.     --mv-w-select-item-bg-color: #6caaa6;
  35.     /** 选项背景颜色2 **/
  36.     --mv-w-select-item-bg-color2: #346371;
  37.     /** 选项禁用背景颜色 **/
  38.     --mv-w-select-item-disabled-bg-color: rgba(0, 0, 0, 0.5);
  39.     /** 选项禁用字体颜色 **/
  40.     --mv-w-select-item-disabled-color: gray;
  41.     /** 选项字体颜色 **/
  42.     --mv-w-select-item-text-shdow: var(--mv-text-shdow);
  43.  
  44.     /** 标题界面选项框宽度 **/
  45.     --mv-w-title-select-bg-width: calc(240px - var(--mv-w-select-bg-padding) * 2)
  46. }



【更新日志-20230630】:

- 本次更新更新了所有界面的待办事项,将所有场景界面由Scene_Base的基类转为Scene_HTML_Base。
- 取消二级目录map/ title
- 默认UI 库选择现代前端Element-UI作为默认UI框架
- Scene_HTML_Base基类新增onTerminate销毁钩子函数。(问题描述:Vue中创建的应用程序实例(通过Vue.createApp()方法)不会自动销毁,而是会持续存在,直到手动调用app.unmount()方法来销毁它们。由于本工程采用动态加载方式,如果是和Vue结合,那么会创建新的app对象,因此我们提供了一个钩子函数来销毁由Vue创建的app对象。)
JAVASCRIPT 代码复制
  1. const {createApp} = Vue
  2. const app = createApp({
  3.     data() {
  4.         return {
  5.             message: 'Hello Vue!'
  6.         }
  7.     },
  8.     methods: {
  9.         startGame() {
  10.             scene.commandNewGame();
  11.         }
  12.     }
  13. });
  14. app.use(ElementPlus);
  15. app.mount('#window');
  16. scene.onTerminate = function () {
  17.     app.unmount();
  18.     console.log("已销毁!")
  19. }


【更新日志-20230629】:

- 本次更新提供了默认事件禁用状态,也就是点击UIContainer不会触发当前地图的事件。(问题描述:当点击UI组件的时候,人物也得到了事件响应,而实际情况下,我们只是需要人物点击游戏地图时才会做响应,点击UI上的按钮时,希望人物在原地保持不动。)
- 修复Scene_Map.html 中点击地图失效的问题。(问题描述:HTML UI地图:Scene_HTML_Map点击游戏地图时,人物没有响应,无法移动)


HTML 代码复制
  1. <!-- 通过添加data-preventGlobalEvents=“true”,我们可以轻松禁用来自RMMV Input和TouchInput的事件传递到该UI元素。 -->
  2. <a href="#" @click="gameMain" :data-preventGlobalEvents="true">主页</a>


【软件的内部的协议】:

1. Element-Plus (https://gitee.com/element-plus/element-plus/blob/dev/LICENSE)
2. Vue(https://cn.vuejs.org/about/faq.html#what-license-does-vue-use

【Element-Plus原型设计】

Axure Element-Plus资源


【压缩包使用方式】:

1. 解压覆盖到游戏工程目录。(建议新建一个项目测试)

效果展示:




点评

既然rmmv的pixi版本比较老旧,要不试试在rmmz上用这一套东西?正好rmmz前两天刚更新了1.7.0版呢。  发表于 2023-6-28 11:02

Lv1.梦旅人

梦石
0
星屑
34
在线时间
2 小时
注册时间
2023-7-9
帖子
5
17
发表于 2024-2-15 23:50:16 | 只看该作者
m1615690513 发表于 2023-7-24 11:35
将HTML内容嵌入到Canvas中是相对简单的,只需要在GameCanvas的上层添加一个UI容器(DOM)来承载HTML内容 ...

您好楼主,我已经跑去unity并且已经实现自己想要实现的功能了
rpgmaker固然简单,但是局限性还是太大
感谢楼主半年前的回复
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
679
在线时间
71 小时
注册时间
2022-4-18
帖子
29
16
 楼主| 发表于 2023-7-24 11:37:17 | 只看该作者
RuanZhongNan 发表于 2023-7-19 11:24
兄弟,有github仓库么?我手痒了,想写vue3组件了。

目前仓库为游戏本体仓库的独立分支,暂时为私有仓库,暂不公开。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
679
在线时间
71 小时
注册时间
2022-4-18
帖子
29
15
 楼主| 发表于 2023-7-24 11:35:49 | 只看该作者
恩凡 发表于 2023-7-20 20:08
大大您好!我刚好遇到了一个相关的问题,请问您可以指点一二吗?
https://rpg.blue/thread-493806-1-1.html ...

将HTML内容嵌入到Canvas中是相对简单的,只需要在GameCanvas的上层添加一个UI容器(DOM)来承载HTML内容。

然而,在实现中确实需要考虑一些问题,例如事件传递和冒泡。Canvas本身无法直接捕获和处理DOM事件,所以原来的Canvas将事件注册到全局document对象上。

所以你还需要考虑来自GameCanvas已经定义的全局事件(例如document上的事件)。你需要思考新增的UI容器是否需要支持这些全局事件。如果需要,你可以将这些全局事件传递给UI容器,让它能够相应地处理这些事件。这包括在全局事件处理程序中判断事件的目标元素是否属于UI容器,并相应地处理事件。

除此之外你还需要考虑DOM与Canvas风格的一致性:
大致可以从以下几点来做:
1. 字体和字号:确保在Canvas中嵌入的HTML内容的字体和字号与Canvas中的绘制一致,以保持整体视觉风格的统一。

2. 颜色和背景:根据Canvas的整体配色方案,调整嵌入的HTML内容的颜色和背景,以使其与Canvas保持一致。

3. 边框和阴影效果:如果Canvas中有特定的边框或阴影效果,尽量在嵌入的HTML内容中进行相应的模拟,以使整体效果更加一致。

4. 响应式设计:确保嵌入的HTML内容能够适应Canvas大小的改变,保持响应式布局,以提供一致性的用户体验。

嵌入HTML开发在现代前端开发中的应用旨在帮助前端开发人员更好地参与到RMMV(RPG Maker MV)的开发和建设中,而不是鼓励普通的JavaScript程序员学习HTML和CSS并从头开始独立开发。

通过嵌入HTML,前端开发人员可以利用他们已经掌握的前端技术知识和工具来与RMMV进行集成,为游戏添加自定义的UI和交互元素。这样可以提高开发效率,并且能够充分利用现有的前端生态系统和资源。

对于普通的JavaScript程序员来说,学习HTML和CSS去实现嵌入式开发可能是一个额外的负担,并且可能并不必要。他们可以专注于他们已经熟悉的JavaScript开发,通过使用RMMV提供的API和扩展机制来实现游戏逻辑和功能。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
34
在线时间
2 小时
注册时间
2023-7-9
帖子
5
14
发表于 2023-7-20 20:08:31 | 只看该作者
大大您好!我刚好遇到了一个相关的问题,请问您可以指点一二吗?
https://rpg.blue/thread-493806-1-1.html
谢谢!
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
537
在线时间
39 小时
注册时间
2021-1-25
帖子
10
13
发表于 2023-7-19 11:24:46 | 只看该作者
兄弟,有github仓库么?我手痒了,想写vue3组件了。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
679
在线时间
71 小时
注册时间
2022-4-18
帖子
29
12
 楼主| 发表于 2023-6-30 13:56:52 | 只看该作者
本帖最后由 m1615690513 于 2023-6-30 14:30 编辑
rfvtgbzxc 发表于 2023-6-30 12:09
想了解一下,前端做UI的话,这两个问题楼主认为是否算问题,是否有解决方案:
1.要做美观很麻烦,对比现在 ...


非常感谢你的回复,也非常感谢你的点赞。

事实上,我倡导在适当的情况下使用HTML进行开发,而不是用HTML代替原生Canvas/WebGL。简单来说,我们应该根据简单易用、方便的原则来选择使用方式。尽管使用HTML可能会带来一些性能提升,但是由于受到多种因素的影响,我建议我们可以忽略这方面的提升,而将注意力放在它们各自的特性上。这个项目的初衷是扩展RMMV的开发生态,吸引拉拢现代前端开发人员,并使这部分群体能够轻松开发RMMV的UI界面,无需深入学习RMMV和PIXI.JS。(也是作为我们自己Conquest项目中重要的一环)

另外,我还想补充一下关于UI、游戏逻辑和游戏中产生的动画之间的概念关系。以下是我个人的浅显理解:

UI(User Interface,用户界面)是指玩家与游戏进行交互时所看到和操作的界面。它包括各种可视化的元素,如按钮、菜单、指示器等,以及与之相关的布局、样式和交互设计。UI的目标是提供清晰、直观和易于操作的界面,使玩家能够方便地控制游戏和获取相关的信息。

游戏逻辑是指游戏中的规则、事件和逻辑流程。它处理游戏中各种操作和事件的发生,包括玩家输入和游戏状态的变化。游戏逻辑负责判断游戏胜负条件、控制游戏进程和计算游戏中的数值等。它通过编程算法和条件判断来实现游戏的核心逻辑。

在游戏中,UI和游戏逻辑之间有密切的关系。UI元素往往是玩家与游戏进行交互的媒介,它通过按钮、滑块等交互元素接受玩家的输入,并将输入传递给游戏逻辑进行处理。游戏逻辑则根据玩家的输入和当前游戏状态进行相应的计算和判断,同时还会更新UI来反馈给玩家游戏的变化。

游戏中产生的动画则是在游戏逻辑过程中通过UI展示给玩家的视觉效果。这些动画可以包括角色的移动、攻击、跳跃等动作,以及特效、场景切换、过渡效果等。这些动画通过游戏逻辑根据当前的游戏状态和规则进行控制和展示,以增强游戏的可玩性和视觉效果,给玩家带来更加沉浸的游戏体验。

综上所述,本工程的目的就浮出水面,让那些操作界面可以交给HTML DOM来实现,那种与游戏逻辑紧密相关的内容则采用PIXI.JS原生实现更好。其目的将操作界面交给HTML生态,而PIXI.JS则可以专注于游戏动画效果的设计上,这样就可以充分利用了HTML和PIXI.JS各自的优势。
回复 支持 2 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4189
在线时间
504 小时
注册时间
2011-3-26
帖子
110
11
发表于 2023-6-30 12:09:52 | 只看该作者
想了解一下,前端做UI的话,这两个问题楼主认为是否算问题,是否有解决方案:
1.要做美观很麻烦,对比现在常见二游的UI,前端的组件库在插值动画、各种变换方面很难写。
  例如原神的圣遗物界面,是一个绕角色旋转的圆环,不提角色本身和圆环间的遮挡关系,这种3D空间内一组元素的绕轴旋转,近大远小的效果是难靠CSS和dom的位置元素实现的。
  又例如选中各种物品时,物品一瞬间的发光效果和持续纷飞的粒子特效,mog插件中使用了大量sprite来绘制,而用前端的dom来实现,性能消耗恐怕不小。
2.要表现复杂的内容也很麻烦。例如绘制条形图、饼图等,这些在前端中都是直接使用echarts来绘制,本质上还是一个canvas,想写一些效果绚丽一些的填充,最后还是难免自定义着色器。
本质是,一些要使用大量精力去设计CSS才能达到的效果,在原生绘图环境下是非常容易达成的。
前端的UI在数据交互和模块化管理上很优秀,可以适应各种复杂的数据表单和高频变更的开发需求。但是动效方面很差,如果存在有优秀动效的库的话,前端做UI就优势很大了
另外看到老哥发布的是基于MIT的开源项目,点赞~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
18483
在线时间
1455 小时
注册时间
2017-4-16
帖子
222

开拓者

10
发表于 2023-6-30 08:52:45 | 只看该作者
也算是一种解决方案思路吧,期待后续
个人RM交流群:568785370,目前在该群发布Ganfly系列插件
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
679
在线时间
71 小时
注册时间
2022-4-18
帖子
29
9
 楼主| 发表于 2023-6-30 08:51:09 | 只看该作者

我深感谢你对这个问题的关注,并对你提出的观点表示尊重。对于UI和游戏逻辑的分离模式的讨论,不同的人有不同的见解和经验,因此也存在各种不同的实践和成功案例。

实际上,对于每个具体的项目和情境,可能需要根据需求和实际情况来确定最佳的开发架构和技术选择。在游戏开发中,UI和游戏逻辑之间的分工可以因情况而异,有时强调分离,有时则紧密耦合。

因此,我要再次强调,将UI和游戏逻辑分离的做法的有效性和性能优势是需要综合考虑众多因素的。我非常感谢你的观点和问题,这促使我对这个话题进行更深入的思考。

因素参考:
应用复杂性:应用的复杂性对于分离UI和游戏逻辑的可行性和效果有很大影响。如果应用有较简单的UI和较简单的游戏逻辑,则分离的收益可能较小;而对于复杂的应用,分离能够更好地管理和优化UI和游戏逻辑。

性能需求:性能需求是决定是否采用分离模式的关键因素之一。如果应用对帧率、动画效果或图形渲染要求较高,分离UI和游戏逻辑可能能够提升性能;而对于简单的应用,分离可能不会带来明显的性能改进。

浏览器支持与兼容性:将UI使用HTML DOM渲染,游戏逻辑使用WebGL/Canvas等技术,需要考虑目标浏览器的支持与兼容性。不同浏览器可能对技术的支持程度有所差异,这可能会影响分离模式的实施和性能结果。

设备能力:不同设备的性能和能力也会对分离模式的效果产生影响。较强大的设备可能更能充分发挥WebGL/Canvas等技术的优势,而较低性能的设备可能无法获得明显的性能提升。

开发与维护成本:分离UI和游戏逻辑可能会带来一定的开发与维护成本。需要投入额外的精力来处理不同技术之间的交互、数据同步和通信等方面的工作,并确保整体的一致性与协调性。


评分

参与人数 1+1 收起 理由
小怪兽奇奇侠 + 1 推陈出新带来进步,加油

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 23:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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