RPG Maker MV 踩坑十一 精灵及背景绘制问题

精灵绘制问题

  • RPG Maker MV战斗问题
    • 入场飞身
    • 战斗背景绘制
      • 精灵集及精灵

RPG Maker MV战斗问题

在RMMV中战斗是在场景中调用战斗管理器,通过管理器去操作角色对象行动及精灵的绘制的。

入场飞身

在其中就发现一个问题加载图片进场时,会偏高,且显示的不是需要的那个需要绘制的区域。
在这里插入图片描述
从这可以看到人物进场时脚下的影子位置和飞身进场的位置差距挺大的且看到,不是我所理想的进场的姿势,那这发生了什么呢?
在这里插入图片描述
当时想到了是不是无意中调用了这里面的的偷窃的动画呢?
不过注释了 steal 后发现不是,那可能是什么问题呢?
在看到了控制台的打印后想到了是不是这个位置的出现了问题:

Sprite_Actor.prototype.refreshMotion = function() {
    var actor = this._actor;
    var motionGuard = Sprite_Actor.MOTIONS['guard'];
    if (actor) {
        if (this._motion === motionGuard && !BattleManager.isInputting()) {
                return;
        }
        var stateMotion = actor.stateMotionIndex();
        if (actor.isInputting() || actor.isActing()) {
            this.startMotion('wait');console.log("待机")
        } else if (stateMotion === 3) {
            this.startMotion('dead');
        } else if (stateMotion === 2) {
            this.startMotion('sleep');console.log("睡眠")
        } else if (actor.isChanting()) {
            this.startMotion('chant');console.log("魔法等待")
        } else if (actor.isGuard() || actor.isGuardWaiting()) {
            this.startMotion('guard');console.log("保护等待")
        } else if (stateMotion === 1) {
            this.startMotion('abnormal');console.log("异常状态")
        } else if (actor.isDying()) {
            this.startMotion('dying');console.log("重伤")
        } else if (actor.isUndecided()) {//是否犹豫(等待)
            this.startMotion('wait');console.log("是否犹豫")
        } else {
            this.startMotion('wait');console.log("后退")
        }
    }
};

通过打印看到刚进来时角色是执行了待机的操作的,那会不会是这个地方出现了问题。
可通过浏览器的调试发现也不是,查看了精灵的大小后,发现精灵一开始是宽高都是0,后面突然变成了精灵图片的宽高,但通过直接修改宽高为固定值却没有任何效果,就在一筹莫展的时候,突然想起了更新帧的代码中是这样写的:

Sprite_Actor.prototype.updateFrame = function() {
    Sprite_Battler.prototype.updateFrame.call(this);
    var bitmap = this._mainSprite.bitmap;
    if (bitmap) {
        var motionIndex = this._motion ? this._motion.index : 0;
        var pattern = this._pattern < 3 ? this._pattern : 1;
        var cw = bitmap.width / 9;
        var ch = bitmap.height / 6;
        var cx = Math.floor(motionIndex / 6) * 3 + pattern;
        var cy = motionIndex % 6;
        this._mainSprite.setFrame(cx * cw, cy * ch, cw, ch);
    }
};

这里面除了调用父类的方法没有用(因为是空的方法,可以看作是接口的抽象方法),往下依次是将精灵获取的图片赋值给一个变量中,然后判断位图是不是空的,不是才执 IF 中的语句,其中获取运动索引的是一个三元运算符,是判断运动的值存在就直接将其索引给变量,否则将0给变量。

if(this._motion){
            var name=this._actor.battlerName();
            var motionIndex=this._motion[name].index;
            this._motionIndexCount = motionIndex.length;
            var pattern = this._pattern < this._motionIndexCount ? this._pattern : 0;
            var cw = bitmap.width;
            var ch = bitmap.height / 12;
            var cx = 0;
            var cy = motionIndex[pattern];
            this._mainSprite.setFrame(cx * cw, cy * ch, cw, ch);
        }

而我的位图判断后是这样的,这就有个问题,没有运动就不会执行相应的绘制,这意味着初始的绘制是一整个图片,那为什么看到会高呢?那是因为组成的图片中最下面是一个完全透明的图片,所以看到最后可以看到的精灵图时是看着飞过来的。
这个经历告诉了我什么呢?不要进行盲目的优化代码,因为优化过后,很可能变得糟糕或更糟糕,需要进行详细的测试每次修改后都得测试对应修改过后的位置是不是会有问题,不然这修改就是无效的。

战斗背景绘制

刚开始尝试战斗背景时发现了背景位置不对,因此尝试进行了调整。

Spriteset_Battle.prototype.createBattleback = function() {
    var margin = 32;
    var x = -this._battleField.x - margin;
    var y = -this._battleField.y - margin;
    var width = Graphics.width + margin * 2;
    var height = Graphics.height + margin * 2;
    this._back1Sprite = new TilingSprite();
    this._back2Sprite = new TilingSprite();
    this._back1Sprite.bitmap = this.battleback1Bitmap();
    this._back2Sprite.bitmap = this.battleback2Bitmap();
    this._back1Sprite.move(x, y, width, height);
    this._back2Sprite.move(x, y, width, height);
    this._battleField.addChild(this._back1Sprite);
    this._battleField.addChild(this._back2Sprite);
};
Spriteset_Battle.prototype.locateBattleback = function() {
    var width = this._battleField.width;
    var height = this._battleField.height;
    var sprite1 = this._back1Sprite;
    var sprite2 = this._back2Sprite;
    sprite1.origin.x = sprite1.x + (sprite1.bitmap.width - width) / 2;
    sprite2.origin.x = sprite1.y + (sprite2.bitmap.width - width) / 2;
    if ($gameSystem.isSideView()) {
        sprite1.origin.y = sprite1.x + sprite1.bitmap.height - height;
        sprite2.origin.y = sprite1.y + sprite2.bitmap.height - height;
    }
};

createBattlebackmargin是用于给背景图片留出边缘空间的常数,计算 **x **和 y 使得背景图片的左上角比战斗场的左上角再向左和上移动margin的距离,计算 widthheight 用游戏画面大小加上两边的margin。然后创建背景1和背景2的平铺精灵,再将对应的背景位图给到两个精灵,并移动其位置和加入精灵集的子集中。
locateBattleback 获取前景图片的宽高,并计算背景图片的原点坐标。
很明显这样是不符合我的要求的,那该怎么办呢?

Spriteset_Battle.prototype.updateBattleback = function() {
    if (!this._battlebackLocated) {
        //this.locateBattleback();
        this._battlebackLocated = true;
    }
};

在更新战斗背景中注释掉locateBattleback 方法,这样就不会触发原点计算的操作,然后修改创建背景的方法:

Spriteset_Battle.prototype.createBattleback = function() {
    //var margin = 32;
    var x = -80;
    var y = -60;
    var width = 640;
    var height = 480;
    this._back1Sprite = new Sprite();
    this._back2Sprite = new Sprite();
    this._back1Sprite.bitmap = this.battleback1Bitmap();
    this._back2Sprite.bitmap = this.battleback2Bitmap();
    this._back1Sprite.move(x, y, width, height);
    this._back2Sprite.move(x, y, width, height);
    this._battleField.addChild(this._back1Sprite);
    this._battleField.addChild(this._back2Sprite);
};

这样就可以实现对应的操作了!
这样内容是不是太少了,踩得坑呢?

精灵集及精灵

精灵集有如下的方法

  • move ( x , y , width , height ):直接设置 TilingSprite(平铺精灵) 的 X 坐标、Y 坐标、宽度和高度。
  • setFrame ( x , y , width , height ):设置 TilingSprite(平铺精灵) 所显示 bitmap(位图) 的矩形区域。
  • update ():在每一帧中刷新 TilingSprite(平铺精灵) 。

属性

  • bitmap Bitmap:TilingSprite(平铺精灵) 所显示的图片。
  • opacity Number:TilingSprite(平铺精灵) 的不透明度(0 ~ 255)。
  • origin Point:滚动显示效果中 TilingSprite(平铺精灵) 的原点。
  • visible Boolean:TilingSprite(平铺精灵) 的可见性。
  • x和y坐标了

这里面我操作了move、setFrame、origin这几项,但发现不能解决问题。

SceneManager._scene.children[0]._back1Sprite.move(-80,-60,640,480)

在这里插入图片描述

计划是调整图片现在在这里面的坐标和大小的,但这样显示却不行。

SceneManager._scene.children[0]._back1Sprite.setFrame(-80,-60,640,480)

在这里插入图片描述
由于平铺的关系导致了图片的不正常拼接,及像素拉伸。
origin属性也是差不多的,导致不能完好的显示需要的内容,因此换成了普通的精灵。

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

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

相关文章

SSRF及相关例题

SSRF及相关例题 服务端请求伪造&#xff08;Server Side Request Forgery, SSRF&#xff09;指的是攻击者在未能取得服务器所有权限时&#xff0c;利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。 SSR…

NAVICAT从MYSQL链接到ORCAL数据库

1、工具-选线 2、环境&#xff0c;将原有的mysql的oci.dll文件改为oracle的 3、新建连接 填写对应数据

【全开源】Java代驾小程序APP代驾跑腿源码微信小程序代驾源码

&#x1f697;代驾小程序&#xff1a;便捷、安全的出行新选择 一、引言&#xff1a;出行新风尚 在如今繁忙的都市生活中&#xff0c;出行问题一直是人们关注的焦点。代驾小程序的出现&#xff0c;为我们提供了一种便捷、安全的出行新选择。无论是酒后不能驾车&#xff0c;还是…

Visual C++2010学习版详细安装教程(超详细图文)

Visual C 介绍 Visual C&#xff08;简称VC&#xff09;是微软公司推出的一种集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于开发C和C语言的应用程序。它提供了强大的编辑器、编译器、调试器、库和框架支持&#xff0c;以及丰富的工具和选项&#xff0c;使得开…

opencv dnn模块 示例(26) 目标检测 object_detection 之 yolov10

文章目录 1、yolov10简要介绍1.1、双标签分配策略1.2、架构改进1.3、性能1.4、预训练模型 1.4、网络有关层说明2、测试2.1、官方测试2.2、opencv dnn仅运行到内部"NMS"步骤之前的层完整代码完整实现所有层 2.3、onnxruntime测试3.4、tensorrt 1、yolov10简要介绍 从…

攻防世界---misc---a_good_idea

1、下载附件得到一张图片&#xff0c;winhex分析&#xff0c;发现有压缩包 2、在kali中用普通用户对jpg进行binwalk 3、得到两张图片和一个文本&#xff0c;查看文本信息&#xff1a;提示试着找到像素的秘密 4、提到像素就想到了Stegsolve这个工具&#xff0c;将这两张图片用该…

Windows主机信息收集

一、内网环境分析 1、什么是内网渗透 内网渗透: ①在拿到webshell的时候&#xff0c;想办法获得系统信息拿到系统权限&#xff0c;进入到网络系统内部之后收集内部 网络的各种信息&#xff0c;获取内部网络有价值的人员、资产信息。 ②内网渗透的第一步&#xff0c;内网信…

Java | Leetcode Java题解之第129题求根节点到叶节点数字之和

题目&#xff1a; 题解&#xff1a; class Solution {public int sumNumbers(TreeNode root) {if (root null) {return 0;}int sum 0;Queue<TreeNode> nodeQueue new LinkedList<TreeNode>();Queue<Integer> numQueue new LinkedList<Integer>();…

事务详讲(本地及分布式)

本地事务在分布式的问题: 因为在分布式服务中,难免一个接口中会有很多调用远程服务的情况,这个就非常容易出现问题,以下是一个详细的例子: 例如,你为了保证事物的一致性等要求,所以,你方法上只写了Transactional,但你的业务中又需要调用其他微服务的方法(Feign),这时就容易出现…

剧本杀市场仍在快速发展,剧本杀小程序成为了新的机遇

近年来&#xff0c;剧本杀一直是年轻人的娱乐游戏方式之一&#xff0c;剧本杀行业呈现出了井喷式发展的形势&#xff0c;成为了当下爆火的娱乐方式。目前&#xff0c;剧本杀行业拥有了完善的剧本资源和呈现方式&#xff0c;发展前景非常大。 根据当下的数据显示&#xff0c;剧…

04-树6 Complete Binary Search Tree(浙大数据结构PTA习题)

04-树6 Complete Binary Search Tree 分数 30 作者 陈越 单位 浙江大学 Question: A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with …

Google 解释AI 概览:关于上周的一些情况

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

c++与c

命名空间的设置&#xff1a; 避免冲突 命名空间&#xff1a; 如果将变量全部定义在全局可能不安全&#xff0c;都可以进行修改。 如果将变量定义在局部&#xff0c;当出了大括号就不能使用。 所以说在定义一个命名空间的时候 定义函数&#xff0c;变量&#xff0c;命名空间…

菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

1.加密流程 工具名称requestsresponseAntSwordbase64等方式明文冰蝎2.0开启Openssl扩展-动态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64冰蝎3.0开启Openssl扩展-静态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64哥斯拉php的为base64异或base64异…

【智能算法】花斑翠鸟优化算法(PKO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;A Bouaouda受到自然界中花斑翠鸟社会行为启发&#xff0c;提出了花斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer, PKO&#xff09;。 2.算法原理 2.1算法思想…

1103. 分糖果 II Rust等差求和+一元二次方程求根(击败100% Rust用户)

题目内容 排排坐&#xff0c;分糖果。 我们买了一些糖果 candies&#xff0c;打算把它们分给排好队的 n num_people 个小朋友。 给第一个小朋友 1 颗糖果&#xff0c;第二个小朋友 2 颗&#xff0c;依此类推&#xff0c;直到给最后一个小朋友 n 颗糖果。 然后&#xff0c;…

Redis缓存(笔记二:Redis常用五大数据类型)

目录 1、Redis中String字符串 1.1 常用命令解释&#xff1a; 1.2 原子性 1.3 具有原子性的常用命令 1.4 String数据结构 1、Redis中String字符串 概念 String 是 Redis 最基本的类型&#xff0c;可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key对应一个 value…

STL容器--list

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指其前…

2.3 OpenCV随手简记(四)

阈值处理是很多高级算法底层处理的预方法之一。 自己求图像平均阈值&#xff1a; # -*- codingGBK -*- import cv2 as cv import numpy as np #求出图像均值作为阈值来二值化 def custom_image(image): gray cv.cvtColor(image, cv.COLOR_BGR2GRAY) cv.imshow("原来&qu…

微服务网关Gateway(下)

CSDN 的小伙伴们&#xff0c;大家好呀&#xff0c;我是苍何。 这篇文章我们继续来说下我们项目中用到的微服务网关 Gateway 的技术点。主要涵盖过滤器&#xff0c;限流处理以及黑白名单配置。 过滤器 网关中的过滤器&#xff0c;有点类似 SpringMVC 里面的拦截器 Intercepto…