RPG Maker MV 踩坑九 场景和窗口问题

RPG Maker MV 踩坑九 场景和窗口问题

  • 启言
  • 场景
  • 窗口
  • 场景和窗口问题
    • 战斗场景

启言

RPG Maker MV中使用的语言是JavaScript作为脚本语言,在HTML中的Canvas画布上进行绘制图像及交互行为
在游戏中能够感知到的最大的容器是场景,往下就是各种用于菜单操作的窗口,再往下可以看做是容器的精灵,之后在精灵中添加位图然后绘制出来。

场景

场景是游戏中的环境、建筑、机械、道具等。游戏场景通常可以理解为根据企划的要求还原出游戏中的建筑物、树木、天空、道路等可用元素(包含武器道具与NPC等)。
在RPG Maker MV的游戏中可以看到的装着窗口的容器就是场景,地图主菜单状态装备交易标题等等,这些都是一个个的场景,场景中有人物移动、有效果变化,有窗口等等。
可以说游戏中的所有看得到的,听得到的一切元素构成了场景;只不过现在我们说的场景只是装着构成场景的各元素的一个盒子。

窗口

在游戏中窗口就是可被绘制出来的一个矩形区域,这个区域有着背景边框,及内容,内容中有些是直接进行显示的,有些是可进行交互的。
WindowLayer 包含游戏的窗口层,简单解释就是游戏中各个窗口基本都是放在这里面的。

场景和窗口问题

通过之前各篇的内容,可以看到我在开发的代码中有些时候窗口并不是放在窗口层中的,而是直接放在场景中的,这是为什么呢?
窗口在窗口层中时会发现这样的一个怪象,窗口和窗口之间互相遮挡时会显示场景中的背景信息,而将精灵放入其中时会发现所有的精灵都在最顶层,即覆盖遮挡了所有的窗口,这也是之前绘制做战斗物品、法术窗口时出现的问题;由于代码功底较少,现在调试着代码比较麻烦,但也可以推测出是窗口层进行渲染时进行的操作。

WindowLayer.prototype.renderCanvas = function(renderer) {
    if (!this.visible || !this.renderable) {
        return;
    }
    if (!this._tempCanvas) {
        this._tempCanvas = document.createElement('canvas');
    }
    this._tempCanvas.width = Graphics.width;
    this._tempCanvas.height = Graphics.height;
    var realCanvasContext = renderer.context;
    var context = this._tempCanvas.getContext('2d');
    context.save();
    context.clearRect(0, 0, Graphics.width, Graphics.height);
    context.beginPath();
    context.rect(this.x, this.y, this.width, this.height);
    context.closePath();
    context.clip();
    renderer.context = context;
    for (var i = 0; i < this.children.length; i++) {
        var child = this.children[i];
        if (child._isWindow && child.visible && child.openness > 0) {
            this._canvasClearWindowRect(renderer, child);
            context.save();
            child.renderCanvas(renderer);
            context.restore();
        }
    }
    context.restore();
    renderer.context = realCanvasContext;
    renderer.context.setTransform(1, 0, 0, 1, 0, 0);
    renderer.context.globalCompositeOperation = 'source-over';
    renderer.context.globalAlpha = 1;
    renderer.context.drawImage(this._tempCanvas, 0, 0);
    for (var j = 0; j < this.children.length; j++) {
        if (!this.children[j]._isWindow) {
            this.children[j].renderCanvas(renderer);
        }
    }
};
WindowLayer.prototype.renderWebGL = function(renderer) {
    if (!this.visible || !this.renderable) {
        return;
    }
    if (this.children.length==0) {
        return;
    }
    renderer.flush();
    this.filterArea.copy(this);
    renderer.filterManager.pushFilter(this, this.filters);
    renderer.currentRenderer.start();
    var shift = new PIXI.Point();
    var rt = renderer._activeRenderTarget;
    var projectionMatrix = rt.projectionMatrix;
    shift.x = Math.round((projectionMatrix.tx + 1) / 2 * rt.sourceFrame.width);
    shift.y = Math.round((projectionMatrix.ty + 1) / 2 * rt.sourceFrame.height);
    for (var i = 0; i < this.children.length; i++) {
        var child = this.children[i];
        if (child._isWindow && child.visible && child.openness > 0) {
            this._maskWindow(child, shift);
            renderer.maskManager.pushScissorMask(this, this._windowMask);
            renderer.clear();
            renderer.maskManager.popScissorMask();
            renderer.currentRenderer.start();
            child.renderWebGL(renderer);
            renderer.currentRenderer.flush();
        }
    }
    renderer.flush();
    renderer.filterManager.popFilter();
    renderer.maskManager.popScissorMask();
    for (var j = 0; j < this.children.length; j++) {
        if (!this.children[j]._isWindow) {
            this.children[j].renderWebGL(renderer);
        }
    }
};

通过该渲染代码渲染了窗口层,后期看能否详细解读下。
场景中直接加入窗口就发现不会出现这样的情况,个人看法是场景的渲染将直接放入的窗口当成了类似图片一样的渲染,这样的重叠遮挡就不会暴露后面的背景了。
在这里插入图片描述
其实这用的话,之前遇到的指令问题也可以迎刃而解了!!!
不过场景与场景之前的问题也是一个头疼的问题,比如返回上一个场景,并显示之前打开的窗口,就发现了问题了!所以需要场景管理器来从中间进行协调管理。

战斗场景

战斗的场景刚进入时会出现敌人出现的消息弹窗,这和原来的游戏方式不搭配,毕竟刚进去时弹出合理,但从其他的场景返回战斗场景时就显得非常突兀了,这时的解决办法是在战斗管理器中开始战斗时注释掉对应的方法调用,但又会出现一个问题,默认的调用使用时会默认显示战斗的角色信息,及窗口,这样就是非常大的BUG,现在找到方法处理了后,又出现了一个战斗操作及人物状态的显示太慢,又是得优化的地方!!!
从其他场景返回战斗场景时可能人物的数据和敌人的数据会发生重置(还没有做到这里),这也是后面得处理的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/482522.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过nginx配置文件服务器(浏览器访问下载)

配置服务器端文件下载和展示(Nginx) nginx.conf文件中增加配置&#xff0c;然后浏览器里访问ip:port回车即可 server { listen port; server_name 服务端ip; # 指定文件下载目录的路径 location / { # 使用root指令来设置文件的根目录 # Nginx会在该目录下寻找相对于loca…

洛谷B3626 跳跃机器人

#先看题目 题目描述 地上有一排格子&#xff0c;共 n 个位置。机器猫站在第一个格子上&#xff0c;需要取第n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这个机器人的行动遵循下面的规则&#xff1a; 初始时…

基于SpringBoot的大学生租房系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统展示 系统功能模块 系统首页界面图 用户…

有什么可以下载网页视频的浏览器插件 浏览器如何下载网页视频 网页视频怎么下载到本地 网页视频下载软件 IDM下载

在视频网站上看电影追剧&#xff0c;已经成为了大众生活中必不可少的一部分。为了保护自家视频的版权&#xff0c;很多平台都禁止用户下载会员视频。其实只要掌握了正确的方法&#xff0c;一样可以将会员视频下载到本地保存。那么有关有什么可以下载网页视频的浏览器&#xff0…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-质数

17569 #include<stdio.h> #include<math.h> const int N 500000;//注意范围设大一点&#xff0c;还是有很多合数滴~ int f[N] {0}, p[N]; int main(){int num 1;for(int i 2; ; i){if(!f[i]){p[num] i;if(num 2020) break;for(int j i * i; j < N; j i…

Token的详解

Token的详解 文章目录 Token的详解前言:简介:使用token&#xff1a; 前言: 为什么会用到Token&#xff0c;因为cookie和session一些自身的缺点&#xff0c;限制了一些功能的实现&#xff0c;比如&#xff1a; cookie&#xff1a;优点是节省服务器空间&#xff0c;缺点不安全。…

数据结构面试常见问题之- Hashing - Hard Version

&#x1f600;前言 在解决哈希问题中的逆向情形时&#xff0c;我们面临着一种特殊挑战&#xff1a;已知散列函数和冲突解决策略的结果&#xff0c;需要推断输入元素的顺序。这种问题要求我们深入理解哈希函数的工作原理以及冲突处理的方式&#xff0c;并通过逆向思维来还原出元…

day43 动态规划part5

1049. 最后一块石头的重量 II 中等 提示 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎…

坚韧不拔,直至胜利的彼岸

当晨曦的第一缕光线透过夜幕的阴霾&#xff0c;希望与挑战并肩而来。在这个世界的每个角落&#xff0c;无数的个体都在经历着各自的斗争、失败、再斗争&#xff0c;直至最终的胜利。这是一个古老而永恒的循环&#xff0c;是成长的必经之路&#xff0c;它讲述着坚韧不拔的精神如…

【LeetCode】升级打怪之路 Day 26:回溯算法 — 集合划分问题

今日题目&#xff1a; 698. 划分为k个相等的子集 | LeetCode473. 火柴拼正方形 | LeetCode 参考文章&#xff1a; 经典回溯算法&#xff1a;集合划分问题 目录 LC 698. 划分为k个相等的子集 【classic&#xff0c;有难度】数据预处理&#xff1a;计算 target基本回溯优化 1&…

Zero-Change Object Transmission for Distributed Big Data Analytics——论文泛读

ATC 2022 Paper 问题 分布式大数据分析在很大程度上依赖于Java和Scala等高级语言的可靠性和多功能性。然而&#xff0c;这些高级语言也为数据传输制造了障碍。要在Java虚拟机&#xff08;JVM&#xff09;之间传输数据&#xff0c;发送方应将对象转换为字节数组&#xff08;序…

校验注解@Length提示Length.class 类文件具有错误的版本 55.0, 应为 52.0

你们好&#xff0c;我是金金金。 场景 我正在学习参数校验&#xff0c;启动项目时报错如下 实体类 依赖版本 报错信息 排查 看报错信息提示类文件具有错误的版本 55.0, 应为 52.0&#xff0c;猜测可能是版本的问题。 可以确实就是版本的关系了&#xff0c;8.0版本的只能在jd…

2024年基于springboot+vue的10个最新选题推荐

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f…

VMware Fusion Pro 13:一站式虚拟化解决方案,满足多样化需求

VMware Fusion Pro 13是一款功能强大的虚拟机软件&#xff0c;专为Mac操作系统设计。它支持在Mac电脑上创建和管理多个虚拟计算机&#xff0c;允许用户在不同操作系统中进行软件测试、开发和部署&#xff0c;如Windows、Linux等。该软件采用了最新的虚拟化技术&#xff0c;能够…

逻辑 | 逻辑先修营

学习到更新日期逻辑先修营-3常见逻辑连词及逻辑表达2024-3-23 1.形式逻辑基础1 2.形式逻辑基础2 3.常见逻辑连词及逻辑表述 4.OR相关考点 5.AND相关考点 6.逻辑箭头基本考点1 7.逻辑箭头基本考点2 8.代入逻辑推理事实真1 9.代入逻辑推理事实真2 10.形式逻辑四大基本考点…

VUE3 Day12pinia

属性在解构时需要用到storeToRefs语法&#xff0c;而方法则不需要 官方文档&#xff1a;https://prazdevs.github.io/pinia-plugin-persistedstate/zh/ 如果不配将使用pinia的默认配置

用Kimichat学习王庆法老师关于Sora的文章

目录 一 引言:二 提示词方面:三 与Kimi的聊天记录我:假如你是一名大模型方面的专家,提取一下这篇文章的核心观点,用三列表格的形式,https://mp.weixin.qq.com/s/Y-vmxmPu4_-tHaeP35hDJg我:上述文章的一、Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统部分…

设计模式及其在项目、框架中的应用

设计模式的作用&#xff1a; 1、类之间关系图&#xff0c;明确的角色及其关系、作用&#xff1b; 2、符合开闭原则&#xff0c;职责明确&#xff0c;并且开放的拓展点可以有效应对后期的变化。 &#xff08;一&#xff09;、责任链模式 适用场景&#xff1a; 在一个流程中&…

ArmSoM-Sige RK3588开发板产品简介

让我们在 5 分钟内了解 Sige7。 简介​ ArmSoM-Sige7采用Rockchip RK3588新一代旗舰级八核64位处理器&#xff0c;主频高达2.4GHz&#xff0c;6 TOPS算力NPU&#xff0c;最大可配32GB大内存。支持8K视频编解码&#xff0c;拥有丰富的接口&#xff0c;支持双2.5G网口、WiFi6 &…

Tomcat9.0.87闪退解决方案

运行Tomcat9.0.87闪退 报错&#xff1a;Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program 原因&#xff1a;使用了免安装的方法&#xff0c;直接运行bin目录下的startup.ba…