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.pswp.cn/bicheng/22019.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22019.shtml
英文地址,請注明出處:http://en.pswp.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;為…

【Python】超時請求或計算的處理

超時機制 一般應用于處理阻塞問題 場景&#xff1a; 復雜度較大的計算&#xff08;解析&#xff09;某個數值、加解密計算等請求中遇到阻塞&#xff0c;避免長時間等待網絡波動&#xff0c;避免長時間請求&#xff0c;浪費時間 1. requests 請求超時機制 reqeusts 依賴中的…

[大師C語言(第十九篇)]C語言函數式編程技術詳解

引言 函數式編程&#xff08;Functional Programming&#xff0c;FP&#xff09;是一種編程范式&#xff0c;強調通過使用純函數和不可變數據來編寫代碼。這種范式具有許多優點&#xff0c;如易于測試、可維護性高、并發友好等。盡管C語言被認為是一種過程式編程語言&#xff…

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…

多線程知識-11

Runnable 和 Thread 用哪個好 使用Runnable接口的好處是&#xff1a; 避免了單繼承的限制&#xff1a;當你的類已經繼承了另一個類時&#xff0c;你仍然可以實現Runnable接口來創建線程。提高代碼的復用性&#xff1a;你可以將Runnable對象傳遞給多個線程來執行&#xff0c;從…

C++設計模式-策略模式,AI角色動態選擇行為

運行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式讓算法的選擇與使用獨立開來&#xff0c;使得代碼更靈活、可擴展和易維護。應用&#xff1a;如在游戲開發中&#xff0c;AI角色需要根據環境和條件做出不同的行為&#xff0c;如尋路、攻擊、躲避等。可…

深度解析CSS中為什么會有Stacking Context的概念

CSS中的堆疊上下文&#xff08;Stacking Context&#xff09;概念是為了管理和控制網頁元素的重疊順序而引入的。堆疊上下文的引入解決了以下幾個關鍵問題&#xff1a; 層次管理&#xff1a; 在網頁中&#xff0c;多個元素可能會相互重疊&#xff0c;堆疊上下文定義了這些元素的…

01-CompressionWebpackPlugin---提高 Web 應用性能的利器

CompressionWebpackPlugin—提高 Web 應用性能的利器 筆記分享 在現代 Web 開發中&#xff0c;優化資源加載速度是提升用戶體驗的重要環節。減少文件大小可以顯著提升網頁加載速度&#xff0c;從而改善用戶體驗。CompressionWebpackPlugin 是一個強大的 Webpack 插件&#xff…

【安裝筆記-20240529-Windows-Electerm 終端工具】

安裝筆記-系列文章目錄 安裝筆記-20240529-Windows-Electerm 終端工具 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240529-Windows-Electerm 終端工具 前言一、軟件介紹名稱&#xff1a;Wireshark主頁官方介紹功能特性 二、安裝步驟測試版本&#xff1a;electerm-1.39.35-win-…

【藍橋杯】常見的數據結構

&#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &#x1f34d;博學而日參省乎己&#xff0c;知明而行無過矣 目錄 &#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &…

Spring項目中Ordered接口的應用:全局過濾器(GlobalFilter)的順序控制

在Spring框架&#xff0c;尤其是Spring Cloud Gateway或Spring WebFlux項目中&#xff0c;Ordered接口扮演著重要的角色&#xff0c;特別是在實現全局過濾器(GlobalFilter)時&#xff0c;用于控制過濾器執行的優先級。下面將介紹如何在Spring項目中使用Ordered接口來管理Global…

【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分區格式 小米紅…