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属性也是差不多的,导致不能完好的显示需要的内容,因此换成了普通的精灵。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python编程学习第一篇——Python零基础快速入门(五)—元组(Tuple)操作

Python元组是一种不可变的有序集合&#xff0c;可以存储多个不同类型的数据。元组使用小括号来表示&#xff0c;其中的元素用逗号分隔开。与列表不同&#xff0c;元组的元素不能被修改、删除或添加。它的一些常规操作包括元组的创建、访问、添加、修改、删除、运算等等&#xf…

电力电子功率模块在工程应用中测温NTC的使用

电力电子功率模块在工程应用中测温NTC的使用 1.概述2.什么是NTC3.模块内部NTC3.1 绝缘隔离措施3.2 NTC热量考虑 4.使用模拟方法测量NTC温度4.1 分压电阻大小 5.使用数字方法测量NTC温度 1.概述 最近做项目的时候突然被问到一个问题。做实验测温用的NTC到底怎么用&#xff1f;为…

JAVA设计模式-策略模式及在Springboot2.X中写法

JAVA设计模式-策略模式及在Springboot2.X中写法 一、经典的策略模式写法二、Springboot2.X中策略模式写法 策略模式的定义&#xff1a;策略模式是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换 策略模式&#xff1a;在策略模式&#xff08;Str…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;稳定&#xff09;选择排序&#xff08;不稳定&#xff09;插入排序&#xff08;稳定&#xff09;希尔排序&#xff08;不稳定&#xff09;归并排序&#xff08;稳定&#xff09;快速排序&#xff08;不稳定&#xff09;堆排序计数排序桶排序基数…

YOLOv8+PyQt5海洋船只检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频&#xff1a;海洋船只检测yoloV8检测&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_哔哩哔哩_bilibili资源包含可视化的海洋船只检测系统&#xff0c;可对于高空拍摄到的海洋图片进行轮船检测&#xff0c;基于最新的YOLOv8训练的海洋船只检测模型&a…

C++设计模式-策略模式,AI角色动态选择行为

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式让算法的选择与使用独立开来&#xff0c;使得代码更灵活、可扩展和易维护。应用&#xff1a;如在游戏开发中&#xff0c;AI角色需要根据环境和条件做出不同的行为&#xff0c;如寻路、攻击、躲避等。可…

【安装笔记-20240529-Windows-Electerm 终端工具】

安装笔记-系列文章目录 安装笔记-20240529-Windows-Electerm 终端工具 文章目录 安装笔记-系列文章目录安装笔记-20240529-Windows-Electerm 终端工具 前言一、软件介绍名称&#xff1a;Wireshark主页官方介绍功能特性 二、安装步骤测试版本&#xff1a;electerm-1.39.35-win-…

【AIoT-Robot】3d hand pose

手语是聋哑人士的主要沟通工具,它是利用手部和身体的动作来传达意义。虽然手语帮助它的使用者之间互相沟通,但聋哑人士与一般人的沟通却十分困难,这个沟通障碍是源于大部分人不懂得手语。 1. 手势&&手语 手势:手的姿势 ,通常称作手势。它指的是人在运用手臂时,所…

初识springcloud

springcloud eureka eureka的作用 消费者该如何获取服务提供者具体信息&#xff1f; 服务提供者启动时向eureka注册自己的信息,eureka保存这些信息消费者,根据服务名称向eureka拉取提供者信息 如果有多个服务提供者&#xff0c;消费者该如何选择&#xff1f; 服务消费者利…

创建模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;自定义模块有两个作用&#xff1a;一个是规范代码&#xff0c;让代码更易于阅读&#xff0c;另一个是方便其他程序使用已经编…

ORACLE创建dblink

dblink的作用 dblink数据库链接顾名思义就是数据库的链接&#xff0c;当我们要跨本地数据库&#xff0c;访问另外一个数据库表中的数据时&#xff0c;本地数据库中就必须要创建远程数据库的dblink&#xff0c;通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中…

Ubuntu22.04之解决:terminal使用alt+1/alt+2/alt+3失效问题(二百三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安卓玩机搞机技巧综合资源----电脑控制手机 投屏操控的软件工具操作步骤解析【二十二】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

外发邮件监控的六种方法, 监控软件如何防止邮件泄密?

外发邮件监控的六种方法&#xff0c; 监控软件如何防止邮件泄密&#xff1f; 外发邮件监控是现代企业信息安全管理的重要组成部分&#xff0c;它有助于防止敏感信息泄露、保护知识产权、以及确保企业合规。以下是外发邮件监控的几种主要方法&#xff0c;这些方法结合使用可以为…

2024最新 Jenkins + Docker实战教程(八)- Jenkins实现集群并发构建

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

群体优化算法----人工蜂群优化算法应用于路径规划(机器人避开平面障碍寻找最短路线)

介绍 人工蜂群优化算法&#xff08;Artificial Bee Colony Algorithm, ABC&#xff09;是由Dervis Karaboga在2005年提出的一种模拟蜜蜂觅食行为的优化算法。该算法基于蜜蜂群体的分工合作和信息交流机制&#xff0c;通过模拟蜜蜂寻找食物源的过程来解决优化问题。ABC算法因其…

INT202 例题

算法复杂度 O(n)&#xff1a;表示算法的渐进上界。如果一个算法的运行时间是O(n)&#xff0c;那么它的运行时间最多与输入规模n成正比。换句话说&#xff0c;当输入规模n增加时&#xff0c;算法的运行时间不会超过某个常数倍的n。比如&#xff0c;如果一个算法的时间复杂度是O(…

打开常用C语言常用内存函数的大门 ——memcmp函数及其模拟实现(完结篇)

文章目录 1. 前言2. memcmp函数2.1 memcmp函数的原型2.2 memcmp的返回值2.2 memcmp的形参2.3 memcmp函数的使用 3. memcmp函数的模拟实现4. 总结 1. 前言 本文是C语言常用内存函数的最后一个函数 —— memcmp函数。 希望各位观众佬爷们能够学会并灵活的使用这四个常用的内存函…

平板显示LED背光芯片OC6700,输入3.6V~60V,升压型 LED 恒流驱动器

概述 OC6700是一款内置60V功率NMOS高效率、高精度的升压型大功率LED恒流驱动芯片。OC6700采用固定关断时间的控制方式&#xff0c;关断时间可通过外部电容进行调节&#xff0c;工作频率可根据用户要求而改变。OC6700通过调节外置的电流采样电阻&#xff0c;能控制高亮度LED灯的…

C语言之指针进阶(5),sizeof和strlen的数组计算以及指针运算笔试难题详解

目录 前言 一、sizeof和strlen 的区分比较 二、sizeof,strlen与数组的计算 三、指针运算&#xff0c;笔试难题解析 总结 前言 本文作为指针进阶的最后一篇文章&#xff0c;给大家带来了丰富的例题&#xff0c;这其中包括区分比较sizeof和strlen计算各种花样的数组指针表达式…