文章目录

  • 1 窗口基类的图片描画接口
    • 1.1 Face描画接口
    • 1.2 Icon描画接口
  • 2 描画自定义图片

1 窗口基类的图片描画接口

RPG Maker mv框架中的窗口基类(Window_Base)提供了两个用来在窗口上描画图片的接口:

  • drawFace
  • drawIcon

当我们设计出一个基于窗口基类的窗口类后,就可以使用这两个接口在我们新窗口上描画我们的图片。不过看名字也知道,这俩接口不是什么都能画的,一个是用来话头像的(drawFace),另一个是用来话图标的(drawIcon)。

我们先来看看什么是Face和Icon:

  • Face指的是存放与下面固定路径中的图片,图片中头像的大小,排列方式都是RPG Maker mv规定好的:

img\faces

来个Face图片的例子:

  • Icon指的是存放在下面固定路径中特定的图片,图片中头像的大小,排列方式都是RPG Maker mv规定好的:

img\system\IconSet.png

Icon图片的内容如下:

如果想要随心所欲的画自己的图片,只能使用更底层的接口,这个后面再说。

1.1 Face描画接口

Window_Base.prototype.drawFace = function(faceName, faceIndex, x, y, width, height) {width = width || Window_Base._faceWidth;height = height || Window_Base._faceHeight;var bitmap = ImageManager.loadFace(faceName);var pw = Window_Base._faceWidth;var ph = Window_Base._faceHeight;var sw = Math.min(width, pw);var sh = Math.min(height, ph);var dx = Math.floor(x + Math.max(width - pw, 0) / 2);var dy = Math.floor(y + Math.max(height - ph, 0) / 2);var sx = faceIndex % 4 * pw + (pw - sw) / 2;var sy = Math.floor(faceIndex / 4) * ph + (ph - sh) / 2;this.contents.blt(bitmap, sx, sy, sw, sh, dx, dy);
};
  • faceName Face所在图片的名称(去掉扩展名.png)
  • faceIndex Face所在位置,一般一张图片里有8张Face,编号从0~7
  • x 描画位置的x坐标,这里的位置是相对于窗口基类contents成员来说的,就是在contents成员上画的位置
  • y 描画位置的y坐标,这里的位置是相对于窗口基类contents成员来说的,就是在contents成员上画的位置
  • width Face图像的宽
  • height Face图像的高

下面来个例子:

//=============================================================================
// Window_Friendliness_List
//
// 友好度展示窗口
//=============================================================================
function Window_Friendliness_List() {this.initialize.apply(this, arguments);
};Window_Friendliness_List.prototype = Object.create(Window_Selectable.prototype);
Window_Friendliness_List.prototype.constructor = Window_Friendliness_List;Window_Friendliness_List.prototype.initialize = function(x, y) {var width = this.windowWidth();var height = this.windowHeight();Window_Selectable.prototype.initialize.call(this, x, y, width, height);this.NPCList = [{"faceName":"Actor2","faceIndex":6,"name":"卡洛琳"},{"faceName":"Actor1","faceIndex":2,"name":"斯洛特"},{"faceName":"People2","faceIndex":7,"name":"希尔"},{"faceName":"伊莉莎(普通)","faceIndex":0,"name":"伊莉莎"},{"faceName":"People4","faceIndex":1,"name":"夏莉"},{"faceName":"Actor1","faceIndex":4,"name":"沙兰特"}];
};Window_Friendliness_List.prototype.drawItem = function(index) {this.drawItemImage(index);
};Window_Friendliness_List.prototype.drawItemImage = function(index) {var rect = this.itemRect(index);var faceName = this.NPCList[index]["faceName"];var faceIndex = this.NPCList[index]["faceIndex"];this.drawFace(faceName, faceIndex, rect.x + 1, rect.y + 1, Window_Base._faceWidth, Window_Base._faceHeight);
};

在上面的例子中,我们首先创建了一个友好度展示用的窗口函数Window_Friendliness_List,继承于Window_Selectable对象的。 Window_Selectable对象继承自Window_Base对象,因此我们的友好度展示窗口对象最终继承于Window_Base对象。

通过new方法创建Window_Friendliness_List窗口对象时,Window_Friendliness_List.prototype.initialize会被调用,通过Window_Friendliness_List.prototype.initialize方法完成友好度展示窗口对象的内部数据构造。可以看到Window_Friendliness_List对象内部维护了一个NPCList,其实是所展示列表中各NPC头像图片的信息。

Window_Selectable对象有个refresh()方法,这个方法会调用Window_Friendliness_List.prototype.drawItem,而Window_Friendliness_List.prototype.drawItem会调用Window_Friendliness_List.prototype.drawItemImage,在Window_Friendliness_List.prototype.drawItemImage中我们通过drawFace()接口完成头像的描画。
Window_Selectable对象的refresh()方法其实是在友好度展示场景对象中触发调用的,例子中没有展示上层场景对象的代码。

1.2 Icon描画接口

Window_Base.prototype.drawIcon = function(iconIndex, x, y) {var bitmap = ImageManager.loadSystem('IconSet');var pw = Window_Base._iconWidth;var ph = Window_Base._iconHeight;var sx = iconIndex % 16 * pw;var sy = Math.floor(iconIndex / 16) * ph;this.contents.blt(bitmap, sx, sy, pw, ph, x, y);
};
  • iconIndex Icon在IconSet.png图片中的位置索引,注意空白的部分也是要参与编号的
  • x 描画位置的x坐标,这里的位置是相对于窗口基类contents成员来说的,就是在contents成员上画的位置
  • y 描画位置的y坐标,这里的位置是相对于窗口基类contents成员来说的,就是在contents成员上画的位置

2 描画自定义图片

我们可以看到通过上面介绍的接口只能画RPG Maker mv框架规定好大小的图片(Face和Icon),当然我们也可以按照Face和Icon的大小要求自己创建图片放到指定的目录下使用,但是当我们需要按照自己的需要画其它大小内容的图片时就不行了。

那么到底有没有其他方法可以描画自定义图片呢?答案当然是有。

我们观察drawFace和drawIcon接口发现,最终描画时都调用了blt方法。这个blt方法属于this.contents,而contents所指向的就是Bitmap对象。到这里我们终于认识到这些图片都是描画在哪里的了。没错,就是在一个几乎占满窗口的大Bitmap对象上画的。
我们来看一下它的实现:

Bitmap.prototype.blt = function(source, sx, sy, sw, sh, dx, dy, dw, dh) {dw = dw || sw;dh = dh || sh;if (sx >= 0 && sy >= 0 && sw > 0 && sh > 0 && dw > 0 && dh > 0 &&sx + sw <= source.width && sy + sh <= source.height) {this._context.globalCompositeOperation = 'source-over';this._context.drawImage(source._canvas, sx, sy, sw, sh, dx, dy, dw, dh);this._setDirty();}
};
  • source 一个Bitmap对象,这个对象中包含所要描画图片数据。它一般是通过ImageManager全局对象的一系列load方法得到的:
    - loadSystem
    - loadFace
    - loadIcon
    - … …

  • sx 要描画的部分在图片中的位置的x坐标

  • sy 要描画的部分在图片中的位置的y坐标

  • sw 要描画的部分的宽

  • sh 要描画的部分的高

  • dx 目标位置的x坐标,相对于contents所指向的Bitmap对象来说

  • dy 目标位置的y坐标,相对于contents所指向的Bitmap对象来说

  • dw 目标的宽

  • dh 目标的高

我们可以通过Bitmap对象的blt方法来描画自定义图片,当然要描画的图片其实可以放在下面几个目录的任意一个中,那么在创建被描画Bitmap对象时就要调用对应位置的load方法:

图片位置 load方法
img/animations/ ImageManager.loadAnimation
img/battlebacks1/ ImageManager.loadBattleback1
img/battlebacks2/ ImageManager.loadBattleback2
img/enemies/ ImageManager.loadEnemy
img/characters/ ImageManager.loadCharacter
img/faces/ ImageManager.loadFace
img/parallaxes/ ImageManager.loadParallax
img/pictures/ ImageManager.loadPicture
img/sv_actors/ ImageManager.loadSvActor
img/sv_enemies/ ImageManager.loadSvEnemy
img/system/ ImageManager.loadSystem
img/tilesets/ ImageManager.loadTileset
img/titles1/ ImageManager.loadTitle1
img/titles2/ ImageManager.loadTitle2

上面的文件路径其实根据具体的用处定义的,根据名称基本上能猜出来用来放置何种类型的图片的。
我们在放置自定义图片时可以按照框架赋予的含义来选择路径,这样也方便我们自己管理图片资源。

RPG Maker mv框架代码解析之窗口图片显示相关推荐

  1. RPG Maker mv框架代码解析之窗口文字显示

    目录 窗口文字显示 字体的颜色 通常色 系统色 危机色 死亡色 计量器背景色 血量计量器色1 血量计量器色2 魔法计量器色1 魔法计量器色2 魔法消耗色 力量上升色 力量下降色 技能值计量器色1 技能 ...

  2. RPG Maker mv框架代码解析之Sprite_Button

    1 Sprite_Button rpg maker mv框架中的按钮组件,一般作为窗口组件的成员使用. 2 原型 Sprite 3 方法 3.1 update callback,Sprite_Butt ...

  3. RPG Maker MV插件系统详解与如何编写插件

    最新发布rmmv和以往的版本最大不同就是脚本系统了,整个脚本系统采用html5的javascript编写.和以往的ruby脚本简直天翻地覆 这也是为了实现跨平台运行,也是前所未有的高度编程自由,所有游 ...

  4. RPG Maker MV 踩坑一 新仙剑菜单

    RMMV中菜单UI修改出现的错误 RMMV--灵儿续传 鬼畜主菜单 多菜单选中问题 其他问题 学习的教程 最终结果 接下来的要踩的坑 RMMV--灵儿续传 本人计划进入游戏行业的萌新,以前玩过新仙剑- ...

  5. 修改rpg maker mv的几种上限2020-05-25

    关于rpg maker mv五种不会编程也能学会的突破上限的方法 声明,出现意外概不负责,如有简便方法欢迎评论. 以下方法建议用记事本打开,设置好后建议重新打开项目工程 修改变量上限 Map编号是自己 ...

  6. RPG Maker MV游戏解包

    该文章最新版本请前往:https://www.crowsong.xyz/127.html 前言 使用Petschko's RPG-Maker-MV File-Decrypter进行解包 使用Petsc ...

  7. 【RPG Maker MV】RPG游戏《机器人养成记》制作笔记 - 制作背景和引擎选择

    想让更多的人了解人工智能,学会机器学习,但机器学习本身有太高的入门门槛,导致很多人望而却步.因此一直在想办法让机器学习变得简单.有趣一些.做过一些尝试:比如用动画的形式介绍机器学习原理(点击查看),通 ...

  8. 写一个rpg maker mv 脚本,功能是让玩家在游戏开始时候可以自己捏脸

    很抱歉,我并不会编写代码,但是我可以提供一些指导. 在RPG Maker MV中,你可以使用脚本编写一个"脸部编辑器"功能,允许玩家在游戏开始时进行自定义.你可以使用一些图像处理库 ...

  9. 记一次完整的RPG Maker MV游戏逆向系列第四篇

    前言 阅读本篇前请先看之前的几篇分析噢,不然可能会缺失一些前置知识 这篇还是讲 RPG Maker MV 的游戏分析,主要是如何分析一种通过 GameusQuestSystems.js 的加密手段 工 ...

最新文章

  1. Single Shot Multibox Detection (SSD)实战(下)
  2. 1、Reactive Extensions for .NET(译)
  3. javascript-----DOM文档对象模型
  4. 数据库开发——MySQL——存储引擎
  5. 全国计算机等级考试题库二级C操作题100套(第95套)
  6. Android之Lollipop DevicePolicyManager学习(上)
  7. php语句过滤掉html标签_php过滤html标签
  8. c语言链表内存分配失败,链表的C语言实现之动态内存分配
  9. ios 控件徽章_一行代码给你的控件加上徽章(Badge)
  10. 安装SQL Server Express和SQL Server Management Studio
  11. tomcat按日期分割日志(官网文档推荐实现)
  12. 常用的ASCII码值
  13. 常用 MQTT 客户端库简介
  14. 生信技能树linux虚拟机,Linux 20题-生信技能树
  15. javasript |仿百度换肤效果
  16. excel表格显示无法连接服务器,excel中表格无法连接数据库-EXCEL 连接SQL SERVER数据库显示无法连接...
  17. PSCAD中的频变参数线路模型(Frequency-Dependent (Phase) Line Model)
  18. 算法入门——数组,链表,选择排序
  19. 一个springboot 项目a集成另一个springboot 项目b
  20. 一次jdk1.7升级jdk1.8后导致redis运行时blocked_clients过多问题解决

热门文章

  1. Docker系列技术分享、容器技术和Docker
  2. Anycloud平台LOGO生成方法
  3. 五维图matlab,五维立体图,怎么画五维图(即以五边形反映各项水平)
  4. 软件测试用例的实际结果,软件测试结果归纳与分析
  5. 统计年鉴 excel
  6. 台式计算机怎么强制关机,电脑怎么强制关机(关机方法都在这)
  7. c语言 菜单选择,设计一通过 c语言 个简单实用的菜单,通过菜单选择不同的菜单项并实现相应的功能。...
  8. mysql plus多表关联_结合mybatis-plus 实现实体操作多表关联查询
  9. vue3 项目搭建以及使用
  10. vue移动端pdf在线预览,并实现手势缩放、移动