/*:
* @target MZ
* @plugindesc Show Main Actor In Map for RPG MAKER MZ
* @author lemonhall
*
* @command showMainActorInMap
* @text Show Main Actor In Map
* @desc Displays the Actor Image In Map
*
* @arg url
* @type string
* @text URL
* @desc URL to be loaded in the web viewer.
* @default https://www.example.com
*
*
* @help
* Displays the Actor Image In Map, use the plugin command "Show Main Actor In Map" in events.
*/
(() => {
//这个pluginName必须和文件名是同名的哈
const pluginName = "ShowMainActorInMap";
const parameters = PluginManager.parameters(pluginName);
//这个是插件里的命令名,可以有多个的
PluginManager.registerCommand(pluginName, "showMainActorInMap", args => {
//console.log("插件:showMainActorInMap开始运行");
// Show Picture
// Game_Interpreter.prototype.command231 = function(params) {
// const point = this.picturePoint(params);
// // prettier-ignore
//[1, "Actor1_8", 0, 0, 0, 100, 100, 255, 0]
//实际调用的时候给的参数是这些:
//params[0] = 1
//params[1] = Actor1_8
//params[2] = 0
// point.x
// point.y
//params[6] = 100
//params[7] = 100
//params[8] = 255
//params[9] = 0
//猜测的意义是:params[0]代表的是图片的编号,1,pictureId
////params[1] 是图像的文件名了Actor1_8,name
//params[2],原型函数里是origin,这里给的是0,但看了界面没猜出来是啥意思,我改改再试试
//[1, "Actor1_8", 1, 0, 0, 100, 100, 255, 0],我试了一下,如果是中心的话,这里就是1
//看来这应该是个坐标系的东西,可以再试试,这东西好说
//x,y就不说了
//scaleX, scaleY, opacity, blendMode
//params[6] 对应的就是x的缩放率
//params[7] 对应的就是y的缩放率
//params[8] 透明度,直接就是255,不透明
//params[9] 混合模式,为0
// $gameScreen.showPicture(
// params[0], params[1], params[2], point.x, point.y,
// params[6], params[7], params[8], params[9]
// );
// return true;
// };
// prettier-ignore
// Game_Screen.prototype.showPicture = function(
// pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode
// ) {
// const realPictureId = this.realPictureId(pictureId);
// const picture = new Game_Picture();
// picture.show(name, origin, x, y, scaleX, scaleY, opacity, blendMode);
// this._pictures[realPictureId] = picture;
// };
// Game_Screen.prototype.picture = function(pictureId) {
// const realPictureId = this.realPictureId(pictureId);
// return this._pictures[realPictureId];
// };
//如果是在战斗场景,就返回一经过了加工的id
// Game_Screen.prototype.realPictureId = function(pictureId) {
// if ($gameParty.inBattle()) {
// return pictureId + this.maxPictures();
// } else {
// return pictureId;
// }
// };
// Erase Picture
// // 擦除图片
// Game_Interpreter.prototype.command235 = function(params) {
// console.log("擦除图片入参:",params[0]); //就是id
// $gameScreen.erasePicture(params[0]);
// return true;
// };
//本插件其实就是给地图增加一个立绘显示效果
//这样调用,直接报错了,看来这个pictureId是有问题的
//等于是给$gameScreen的_pictures[72]私有对象上,绑定了一个文件名为:Actor1_8
//的图像,然后坐标系为0,左上角
//x坐标为496,y坐标为112
//x缩放为50%,y缩放为50%
//不透明度为255
//混合模式为0
var actorMainPicX = 496;
var actorMainPicY = 112;
var actorMainScaleX = 50;
var actorMainScaleY = 50;
var hp = $gameActors.actor(1)._hp;
//等于说这就是底图
$gameScreen.showPicture(72, "Actor1_8", 0,
actorMainPicX, actorMainPicY,
actorMainScaleX, actorMainScaleY,
255, 0);
if(hp<534){
//这是第一层,战损效果
$gameScreen.showPicture(73, "Actor1_8_dirty", 0,
actorMainPicX, actorMainPicY,
actorMainScaleX, actorMainScaleY,
255, 0);
}
//这是第一层,战损效果
if(hp>534){
//擦除战损层图片就好了
$gameScreen.erasePicture(73);
}
//console.log(name, origin, x, y, scaleX, scaleY, opacity, blendMode);
// Actor1_8 0 0 0 0 100 100 255
//console.log($gameScreen);
//玩家的状态是:$gameActors.actor(1)_hp就能拿到了;
});
})();先贴代码
然后说一下效果:

RMMZ里玩家的数据很好获取
$gameActors.actor(1),就这个就是第一个玩家的对象了
然后console里面看对象状态就好了
1、数据库-->类型--->装备类型

我增加了一个特殊
2、然后在数据库-->防具里,增加了一个门禁卡

3、然后事件编辑器里

这就可以增加物品了;
4、然后装备栏里就可以装备新的门禁卡了

5、门禁卡就可以作为某种开关了

id为101就是门禁卡了

接着插件里就可以根据各种装备的状态来显示立绘图片了
这就是需要和美工商量好的事情了

这里是战损的效果
只是示意图,我毕竟不是美工,这之后要探索AI怎么实现这部分的
实际上我就是打开了人物立绘的图片,用GIMP

然后在人物立绘基础上做了画了几笔,做了一个透明的PNG图像并重命名

接着就是核心的图片叠加
它的这个绘制就是按层叠加上去就完事儿了
5、优化点:
我估计可以给这些层再加上判断语句,如果已经绘制过的,那么那个pictureId的数组里面是有值的,那就不重复绘制,这里肯定能优化
根据装备来显示对应图片
根据装填来显示对应图片
就这么点小技巧

另外当前走的是事件并行处理
这个其实有问题
如果初始不是这张地图这立绘还不触发了不成?
所以需要看看怎么搞,另外这个立绘系统还需要整个开关
基础原理现在没问题了
其实很简单的一个东西,甚至加上眨眼,以及左顾右盼都是美工和一些状态值判断的小事儿
日本人写的那些插件搞得真是无比之复杂
7、未来的一些工作
战斗立绘和菜单立绘看怎么解决