【RPG Maker MV 仿新仙剑 战斗场景UI (五)】

RPG Maker MV 仿新仙剑 战斗场景UI 五

  • 战斗状态菜单
    • 原始RMMV 菜单窗口
    • 仿新仙剑代码
    • 仿新仙剑战斗状态菜单

战斗状态菜单

这部分比较简单,由于有主菜单的状态菜单打底所以开发上也容易些。

原始RMMV 菜单窗口

在原版的RMMV中显示的数据主要是人物的HPMPTP、和两个计量条人物姓名,不需要显示的东西可以不进行显示。
在这里插入图片描述
如图显示是很单调的,主菜单的好歹还有个头像,这个就少了一些东西。

仿新仙剑代码


function Window_BattleStatus() {
    this.initialize.apply(this, arguments);
}

Window_BattleStatus.prototype = Object.create(Window_Selectable.prototype);
Window_BattleStatus.prototype.constructor = Window_BattleStatus;

Window_BattleStatus.prototype.initialize = function(x,y) {
    Window_Selectable.prototype.initialize.call(this, x, y, 465, 116);
    this.characterStateFrame=ImageManager.loadMenu('CharacterStateFrame');
    this.refresh();
};
Window_BattleStatus._faceWidth=144;
Window_BattleStatus._faceHeight=112;
//标准内边距
Window_BattleStatus.prototype.standardPadding = function() {
    return 0;//18;
};
Window_BattleStatus.prototype.numVisibleRows = function() {
    return 1;
};
//设置状态菜单的最大列数
Window_BattleStatus.prototype.maxCols = function() {
	return 3;
};

//最大项目数
Window_BattleStatus.prototype.maxItems = function() {
	return $gameParty.size();
};
//间距
Window_BattleStatus.prototype.spacing = function() {
    return 6;
};

//每项高度
Window_BattleStatus.prototype.itemHeight = function() {
	var clientHeight = this.height - this.padding * 2;
	return Math.floor(clientHeight / this.numVisibleRows());
};

Window_BattleStatus.prototype.drawItem = function(index) {
    this.drawItemImage(index);
    this.drawItemStatus(index);
};
//绘制人物背景
Window_BattleStatus.prototype.drawItemBackground = function(index) {
	if (index === this._pendingIndex) {
		var rect = this.itemRect(index);
		//var color = this.pendingColor();
		var color = this.deathColor();
		this.changePaintOpacity(false);
		this.contents.fillRect(rect.x, rect.y, rect.width, rect.height, color);
		this.changePaintOpacity(true);
	}
};
//绘制人物图像
Window_BattleStatus.prototype.drawItemImage = function(index) {
	var actors = $gameParty.members();
	var actor=actors[index];
	var rect = this.itemRect(index);
	this.changePaintOpacity(actor.isBattleMember());
	this.drawActorFace(actor, rect.x + 2, rect.y + 1, rect.width, rect.height,index);
	this.changePaintOpacity(true);
};

//绘制演员头像
Window_BattleStatus.prototype.drawActorFace = function(actor, x, y, width, height,index) {
    this.drawFace(actor.faceName(), actor.faceIndex(), x, y, width, height,index);
};

//绘制头像
Window_BattleStatus.prototype.drawFace = function(faceName, faceIndex, x, y, width, height,index) {
	var actors=$gameParty.members();
	var wx=0;
	switch(actors.length){
		case 1:
			wx=154*2;
			break;
		case 2:
			wx=154;
			break;
		default:
			break;
	}
    width = width || Window_BattleStatus._faceWidth;
    height = height || Window_BattleStatus._faceHeight;
    var bitmap = ImageManager.loadFace(faceName);
    var pw = Window_BattleStatus._faceWidth;
    var ph = Window_BattleStatus._faceHeight;
    var sw = Math.min(width, pw);
    var sh = Math.min(height, ph);
    var sx = faceIndex % 6 * pw + (pw - sw) / 2;
    var sy = Math.floor(faceIndex / 6) * ph + (ph - sh) / 2;
	
	
   if(!bitmap.isReady()){
	   setTimeout(()=>{
			this.contents.blt(bitmap, sx, sy, sw, sh, x+wx, y);
			this.drawItemStatus(index);
	   },0.25);
   }else{
	    this.contents.blt(bitmap, sx, sy, sw, sh, x+wx, y);
   }
};

//绘制人物状态
Window_BattleStatus.prototype.drawItemStatus = function(index) {
	var actor = $gameParty.members()[index];
	var rect = this.itemRect(index);
	this.drawActorSimpleStatus(actor, rect.x,  rect.y, rect.width,rect.height);
};

//绘制演员简单状态
Window_BattleStatus.prototype.drawActorSimpleStatus = function(actor, x, y, width,height) {
    this.drawActorIcons(actor, x+73, y+36,width,height);// 人物状态图标
    this.drawActorHp(actor, x, y, width);
	this.drawActorMp(actor, x, y, width);
};

//绘制演员图标,作为参考及绘制四种状态
Window_BattleStatus.prototype.drawActorIcons = function(actor, x, y, width) {
    width = width || 144;
	var actorStates=actor.states(); //获取人物状态
	var stateIcons=[];
	for (var i = 0; i < actorStates.length; i++) {
		if (actorStates[i].id>13&&actorStates[i].id<18) {
			stateIcons.push(actorStates[i].iconIndex);
		}
	}
    for (var i = 0; i < stateIcons.length&&i<2; i++) {
        this.drawIcon(stateIcons[i]-12, x + 24 * i+(i*5), y);
    }
};
//绘制状态图标
Window_BattleStatus.prototype.drawIcon = function(iconIndex, x, y) {
	var actors=$gameParty.members();
	var wx=0;
	switch(actors.length){
		case 1:
			wx=154*2;
			break;
		case 2:
			wx=154;
			break;
		default:
			break;
	}
	x=x+wx;
    var bitmap = ImageManager.loadSystem('CharacterStatus');
    var pw = 24;
    var sx = iconIndex % 5 * pw;
    var sy = 0;
	if(!bitmap.isReady()){
		   //console.log(bitmap.isReady())
		   setTimeout(()=>{this.contents.blt(bitmap, sx, sy, pw, 26, x, y);},0.25);
	}else{
		    this.contents.blt(bitmap, sx, sy, pw, 26, x, y);
	}
};
//绘制演员HP
Window_BattleStatus.prototype.drawActorHp = function(actor, x, y, width) {
    width = width || 144;
	var color1 = this.textColor(10);
    var color2 = this.textColor(15);
    this.drawCurrentAndMax(actor.hp, actor.mhp, x-2, y+56, width,color1, color2);
};
//绘制演员MP
Window_BattleStatus.prototype.drawActorMp = function(actor, x, y, width) {
    width = width || 144;
    var color1 = this.textColor(9);
    var color2 = this.textColor(15);
    this.drawCurrentAndMax(actor.mp, actor.mmp, x-10, y+74, width,color1, color2);
};

//绘制现在和最大值
Window_BattleStatus.prototype.drawCurrentAndMax = function(current, max, x, y,
                                                   width, color1, color2) {
   var actors=$gameParty.members();
   var wx=0;
   switch(actors.length){
	case 1:
		wx=154*2;
		break;
	case 2:
		wx=154;
		break;
	default:
		break;
   }
   x=x+wx;
	this.contents.fontSize=14;//设置字体大小
    var labelWidth = this.textWidth('HP');//28
    var valueWidth = this.textWidth('0000');//56
    var slashWidth = this.textWidth('/');//14
    var x1 = x + width - valueWidth;
    var x2 = x1 - slashWidth;
    var x3 = x2 - valueWidth;
    if (x3 >= x + labelWidth) {
        this.changeTextColor(color1);
		this.contents.outlineColor=color1;
		this.contents.outlineWidth = 0;
        this.drawText(current, x3, y, valueWidth, 'right');
        this.changeTextColor(color2);
		this.contents.outlineColor=color2;
		this.contents.outlineWidth = 0;
        this.drawText('/', x2, y, slashWidth, 'center');
		this.changeTextColor(color1);
		this.contents.outlineColor=color1;//轮廓颜色
		this.contents.outlineWidth = 0;//轮廓宽度
        this.drawText(max, x1, y, valueWidth, 'left');
    } else {
		this.contents.outlineColor=color1;//轮廓颜色
		this.contents.outlineWidth = 0;//轮廓宽度
        this.changeTextColor(color1);
        this.drawText(current, x1, y, valueWidth, 'left');
    }
};

//绘制文本
Window_BattleStatus.prototype.drawText = function(text, x, y, maxWidth, align) {
    this.contents.drawText(text, x, y, maxWidth, this.lineHeight(), align);
};
//等待索引
Window_BattleStatus.prototype.pendingIndex = function() {
	return this._pendingIndex;
};
//刷新光标
Window_BattleStatus.prototype._refreshCursor = function() {
	var pad = this._padding;
	var x = this._cursorRect.x;
	var y = this._cursorRect.y;
	var w = this._cursorRect.width;
	var h = this._cursorRect.height;
    var bitmap = new Bitmap(w, h);
    this._windowCursorSprite.bitmap = bitmap;
    this._windowCursorSprite.setFrame(0, 0, w, h);
	var actors=$gameParty.members();
	var wx=0;
	switch(actors.length){
		case 1:
			wx=154*2;
			break;
		case 2:
			wx=154;
			break;
		default:
			break;
	}
    this._windowCursorSprite.move(wx+x, y);
    if (w > 0 && h > 0&&this.characterStateFrame) {
		var csf=this.characterStateFrame;
		this._windowCursorSprite.bitmap.blt(csf,0,0,164,96,0-3,0+20,164,96);
    }
};
//更新光标
Window_BattleStatus.prototype._updateCursor = function() {
	this._windowCursorSprite.bitmap.clear();
	var blinkCount = this._animationCount % 50;
	var characterStateSpriteY=0;
    if (this._windowCursorSprite.visible) {
		switch(Math.floor(blinkCount/10)){
			case 0:
				characterStateSpriteY=0;
			break;
			case 1:
				characterStateSpriteY=96;
			break;
			case 2:
				characterStateSpriteY=192;
			break;
			case 3:
				characterStateSpriteY=288;
			break;
			case 4:
				characterStateSpriteY=384;
			break;
			default:
				//characterStateSpriteY=4*96;
			break;
		}
    }
	this._windowCursorSprite.bitmap.blt(this.characterStateFrame,0,characterStateSpriteY,164,96,0-3,0+20,164,96);
	this._windowCursorSprite.visible = this.isOpen();
};

Window_BattleStatus.prototype.update = function() {
    Window_Selectable.prototype.update.call(this);
	this._animationCount++;
};

这里只对其中部分代码做出解释,大部分代码在之前都说过的。
initialize 方法中,调用的父类传入的参数width和主菜单的不同,这是为什么,这是因为主菜单时做的是4角色同框的,而这里是3个角色同框的,后期应该会保持一致。
maxCols 方法中的参数也是这个作用。

	switch(actors.length){
		case 1:wx=154*2;break;
		case 2:wx=154;break;
		default:break;
	}

这部分代码也是这个作用,重新计算需要绘制图像的位置
_updateCursor 这个更新光标的方法中判断的条件发生了变化,原来是按照是否激活来判断,现在按照是否隐藏来判断,这是因为,默认窗口是取消激活的,而激活后导致的问题就是在使用其他菜单时会操作到这个菜单,因此需要取消激活,但是光标的更新就出现了问题,因此需要更换判断条件。
update 正常来说更新的方法是不用显示的写出来的,因为会自动执行,但里面的代码更新动画的变量是在窗口激活时才进行计数的,因此需要子类显示调用父类后重新进行动画更新计时的增加,不然就不能正常显示。

仿新仙剑战斗状态菜单

如图:
在这里插入图片描述
做出来的样子就是这样的,当然了,现在是暂时没有去掉背景的,后期全部完善战斗场景的窗口和功能后再去掉背景。

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

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

相关文章

1688货源工厂商品采集如何实现自动化对接?(API免费测试)

随着电子商务的迅猛发展&#xff0c;货源采购已成为企业运营中不可或缺的一环。对于许多商家而言&#xff0c;1688货源工厂是一个重要的采购平台&#xff0c;其丰富的商品种类和价格优势吸引了大量采购者的目光。然而&#xff0c;手动采集商品信息不仅效率低下&#xff0c;而且…

SpringCloudAlibaba Nacos配置及应用

Nacos搭建及配置 nacos本机服务搭建 windows上搭建单机nacos&#xff1a; Releases alibaba/nacos GitHub 下载安装包 下载本地&#xff0c;解压&#xff0c;直接运行&#xff08;保证安装包的绝度路径只有英文字符&#xff0c;有中文会导致运行失败&#xff09;&#xff…

进程切换进程状态

文章目录 前言一、进程切换二、运行状态(R)三、休眠状态(S)四、磁盘休眠状态(D)五、停止状态(T)六、死亡状态(X)和僵尸状态(Z) 前言 人在做一件事情都会有对应的状态是做完了&#xff0c;还是没有开始做或者正在做&#xff0c;而进程也是有自己状态的进程对应状态&#xff1a;…

ReaLTaiizor开源.NET winform控件库学习使用

一、ReaLTaiizor项目介绍 1.1 介绍及地址 基于MIT license开源、免费、美观的.NET WinForm UI控件库&#xff1a;ReaLTaiizor ReaLTaiizor是一个开源免费的.NET WinForms控件库&#xff0c;它提供了广泛的组件和丰富的主题选项&#xff08;用户友好、注重设计&#xff09;&am…

Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作

上文 Spring boot2.7整合jetcache方法缓存 我们做了个方法缓存的案例 可以将接口内容缓存起来 是能大大提高效率的 但是 我们接口的数据大多来自数据库 如果我们调用增删查改 它的数据变化了 那缓存的内容就会因为没有及时更新变的不准确 例如 我们这样 我们在上面 定义了 一…

微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现)

项目介绍 自从计算机发展开始&#xff0c;计算机软硬件相关技术的发展速度越来越快&#xff0c;在信息化高速发展的今天&#xff0c;计算机应用技术似乎已经应用到了各个领域。 在餐饮行业&#xff0c;除了外卖以外就是到店里就餐&#xff0c;在店里就餐如果需要等待点餐的话…

【图解物联网】第3章 物联网设备

3.1 设备——通向显示世界的接口 3.1.1 为什么要学习设备的相关知识 经过前两章的学习&#xff0c;想必各位读者已经掌握物联网这个词描绘出的世界和用于实现物联网的系统架构了。基于这点&#xff0c;这一章将会为大家介绍在物联网世界中起着核心作用的因素&#xff0c;即设…

FreeCAD傻瓜教程之创建参数化几何图形-螺旋体、平面、球体、椭球体、圆柱体、圆锥体、棱柱、椭圆

目的&#xff1a;学会用FreeCAD绘制参数化的几何图形。 一、使用的工作台和工具 1.1选择Part 工作台 1.2单击创建图元...工具 也就是上图黄色工具区域的倒数第2个 1.3 打开几何图元 下方的下拉列表 二、绘制螺旋体、弹簧、螺丝杆 2.1 选择几何图元列表中的 “螺旋体” 设…

01分布式搜索引擎ES

分布式搜索引擎ES 1.初识elasticsearch1.1.了解ES1.2.倒排索引1.3.es的一些概念 2.索引库操作2.1.mapping映射属性2.2.索引库的CRUD 3.文档操作3.1.新增文档3.2.查询文档3.3.删除文档3.4.修改文档3.5.总结 4.RestAPI4.0.导入Demo工程4.1.创建索引库4.2.删除索引库4.3.判断索引库…

利用autodl服务器跑模型

1. 租用服务器 本地改模型 服务器 将改进好的、数据集处理好的模型压缩为zip文件上传到阿里云盘打开服务器AUTODL服务器&#xff0c;在主页中选择容器实例 在此位置进行开关机操作&#xff0c;若停止服务器&#xff0c;必须关机&#xff0c;不然会一直扣钱 2. 运行模型 选择…

【数字IC/FPGA】书籍推荐(0)----《Verilog 传奇--从电路出发的HDL代码设计》

在下这几年关于数字电路、Verilog、FPGA和IC方面的书前前后后都读了不少&#xff0c;发现了不少好书&#xff0c;也在一些废话书上浪费过时间。接下来会写一系列文章&#xff0c;把一部分读过的书做个测评&#xff0c;根据个人标准按十分制满分来打分并分享给大家。 定位 书名…

“因聚而生,数智有为”实在智能Agent牵手华为生态合作

近日&#xff0c;2024华为中国合作伙伴大会顺利闭幕&#xff0c;实在智能受邀出席&#xff0c;携TARS大模型及实在Agent&#xff08;智能体&#xff09;数字员工精彩亮相&#xff0c;与华为生态伙伴共同探讨如何帮助客户抓住数智化转型的巨大机遇&#xff0c;加速培育“新质生产…

爬虫系列-CSS基础语法

&#x1f308;个人主页&#xff1a;会编程的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” CSS全称层叠样式表 &#xff0c;主要用来定义页面内容展示效果的一门语言&#xff0c;HTML&#xff1a;页面骨架&#xff0c;素颜CSS&#xff1a;页面效果美化&#xff1a…

CTF题型 匿名函数考法例题总结

CTF题型 匿名函数考法&例题总结 文章目录 CTF题型 匿名函数考法&例题总结一 .原理分析二 .重点匿名函数利用1.create_function()如何实现create_function代码注入 2.array_map()3.call_user_func()4.call_user_func_array()5.array_filter() 三.例题讲解1.[Polar 靶场 …

应急响应-Web2

应急响应-Web2 1.攻击者的IP地址&#xff08;两个&#xff09;&#xff1f; 192.168.126.135 192.168.126.129 通过phpstudy查看日志&#xff0c;发现192.168.126.135这个IP一直在404访问 &#xff0c; 并且在日志的最后几条一直在访问system.php &#xff0c;从这可以推断 …

数据库:基本操作与用户授权

一 基本操作 1 SQL分类 数据库&#xff1a;database 表&#xff1a;table&#xff0c;行&#xff1a;row 列&#xff1a;column 索引&#xff1a;index 视图&#xff1a;view 存储过程&#xff1a;procedure 存储函数&#xff1a;function 触发器&#xff1a;trigger 事…

【大屏设计】如何进行软件系统网站大屏页面设计?不限于智慧城市、物联网、电商、园区领域

【大屏设计】如何进行软件系统网站大屏页面设计&#xff1f;不限于智慧城市、物联网、电商、园区领域 一、什么是网站大屏设计二、网站大屏设计原型素材三、网站大屏设计设计素材四、他山之石 一、什么是网站大屏设计 网站大屏设计是网站设计中至关重要的一部分&#xff0c;因…

浅谈前端路由原理hash和history

1、认识前端路由 本质 前端路由的本质&#xff0c;是监听 url 地址或 hash 值的改变&#xff0c;来切换渲染对应的页面组件 前端路由分为两种模式 hash 模式 history 模式 两种模式的对比 2、hash 模式 &#xff08;1&#xff09;hash 定义 hash 模式是一种把前端路由的路…

【运维笔记】VM 记录一次centos虚拟机和宿主机之间ping不通的问题

问题描述 环境&#xff1a;centos7&#xff0c;静态ipVM版本&#xff1a;VMware Workstation 16 pro&#xff0c;网络为nat映射模式问题&#xff1a; 一开始&#xff0c;虚拟机可以ping通宿主机&#xff0c;也可以ping通&#xff0c;也可以ping通外网&#xff08;如 ping www.…

HarmonyOS(二十)——管理应用拥有的状态之LocalStorage(页面级UI状态存储)

LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内&#xff0c;在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器&#xff1a;LocalStorageProp和LocalS…