| 赞 | 2 |
| VIP | 0 |
| 好人卡 | 0 |
| 积分 | 9 |
| 经验 | 0 |
| 最后登录 | 2025-11-2 |
| 在线时间 | 100 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 923
- 在线时间
- 100 小时
- 注册时间
- 2025-2-15
- 帖子
- 52
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 写给妖精的情诗 于 2025-10-26 23:23 编辑
以MZ版为例,MV版应该是也可以,下面这些都是随便试出来的,没用仔细整理和严谨测试,不一定准确。
$gameMap.event(this.eventId()或者是第几号事件页).setImage("图片名",在0到7里面8选一)
$gameMap.event(this.eventId()或者是第几号事件页).setDirection(按照8、2、4、6来设置上下左右的方向);
$gameMap.event(this.eventId()或者是第几号事件页)._originalPattern = 2 //0、1、2分别是左中右
$gameMap.event(this.eventId()或者是第几号事件页).setWalkAnime(true或者是false、0、1来设置步行动画);
$gameMap.event(this.eventId()或者是第几号事件页).setStepAnime(true或者是false、0、1来设置踏步动画,也算是呼吸动画);
上面这个脚本可以控制哪个NPC显示哪张图片的哪个位置,但是图片名必须直接写入,不能使用代数来灵活设置,比如输入计算公式和引入代数。
一开始搜索setImage以为对下面这段代码修改一下就可以了。
Game_CharacterBase.prototype.setImage = function(
characterName,
characterIndex
) {
this._tileId = 0;
this._characterName = characterName;
this._characterIndex = characterIndex;
this._isObjectCharacter = ImageManager.isObjectCharacter(characterName);
};
后面搜索characterName以为对下面这段进行修改就可以根据编号来设置每个数据库这里角色的图像(没有测试)。
Game_Actor.prototype.setCharacterImage = function(
characterName,
characterIndex
) {
this._characterName = characterName;
this._characterIndex = characterIndex;
};
接着对第一段的那一段代码进行修改测试,
(就是在Game_CharacterBase.prototype.setImage = function 里面直接测试characterName = "1"和characterName = 1以及输入代数)
然后跳出了
TypeError
filename.split is not a function
这个报错,找到
Utils.extractFileName = function(filename) {
return filename.split("/").pop();
};
这段代码之后才想起来搜索 filename ,但是看到结果太多了,想着搜索一下png,才找到了关键代码。
//这个好像是正常的,
//Utils.encodeURI(2) 这里的2好像是必须要img\characters这里必须要有这个图片,
//好像必须要纯数字命名的,12345之类的都可以,
//使用英文好像会不能识别,带有-符号_符号好像也是不能识别或者是报错,
//可能是因为this.eventId()这里的编号是数字,字符串和数字可能是分开的吧。
ImageManager.loadBitmap = function(folder, filename) {
if (filename) {
//x = 12
const url = folder + Utils.encodeURI(x) + ".png";
return this.loadBitmapFromUrl(url);
} else {
return this._emptyBitmap;
}
};
$gameMap.event(this.eventId()).setImage("this.eventId()",0)
//这个好像也是正常的
ImageManager.loadBitmap = function(folder, filename) {
if (filename) {
const url = folder + Utils.encodeURI(12) + ".png";
return this.loadBitmapFromUrl(url);
} else {
return this._emptyBitmap;
}
};
i = this.eventId()
$gameMap.event(this.eventId()).setImage("i",0)
◆注释:印象中好像上面两个是可以的,好像是放到共通事件那里试了一下,然后就好像失效了。
: :不知道是不是多个事件同时调用同一个共通事件,然后this.eventId()这个编号都是不一样的,是不是会把数据被污染导致失效阿。
: :后来在最上面加上i = this.eventId()就正常了。
: :或许可以在原始代码那里分别搜索 setImage 和 loadBitmap 然后if一下,
: :通过判断是不是target.isActor 角色 target.isEvent 事件 target.isParty 队伍 target.Player 玩家这里的哪一个来分开设置。
◆注释:另外,好像是直接复制粘贴NPC事件页的话,
: :如果触发条件的玩家接触好像是正常的,但是并行执行的话,可能是同时执行相同的代码造成数据污染,会让不同的NPC显示同一张图片。
: :或许可以加一个等待不同的帧数来分开他们。
i = this.eventId()
//这个好像是正常的,好像本来不需要上面这个的,放到共通事件那里试了一下就需要写上面这一行了。
//Utils.encodeURI(2) 这里的2好像是必须要img\characters这里必须要有这个图片,
//好像必须要纯数字命名的,12345之类的都可以,
//使用英文好像会不能识别,带有-符号_符号好像也是不能识别或者是报错,
//可能是因为this.eventId()这里的编号是数字,字符串和数字可能是分开的吧。
ImageManager.loadBitmap = function(folder, filename) {
if (filename) {
const url = folder + Utils.encodeURI(i) + ".png";
return this.loadBitmapFromUrl(url);
} else {
return this._emptyBitmap;
}
};
//$gameMap.event(this.eventId()).setImage("/*this.eventId()*/",0)
$gameMap.event(this.eventId()).setImage("2",0)
◆注释:上面这个和下面这个好像都是可以的,但是都需要在前面加一个 this.wait(this.eventId()) 的脚本框
i = this.eventId()
ImageManager.loadCharacter = function(filename) {
filename = i;
return this.loadBitmap("img/characters/", filename);
};
$gameMap.event(this.eventId()).setImage("this.eventId()",0)
总之就是,上面有几个好像都可以在显示图片名这里引入代数。
只要可以引入代数,就可以在characters文件夹放入1.png、2.png、3.png和1a.png、1b.png这些图片,通过this.eventId()或者是计算公式之类的方式灵活设置图片名了。
只是,好像是单个事件页这样搞没用问题,如果多个事件页或者是共通事件那里这样搞的话,好像就要在上面加一个下面这个等待多少帧了。
◆脚本:this.wait(this.eventId()) //这个等待多少帧需要跟显示行走图的脚本放在不同的脚本框,因为放在一起的话,好像会同时执行。
: ://不同事件页显示行走图的脚本同时执行的话,好像就会互相混肴了。
: ://分开执行的话,由于每个事件页的编号都是不一样的,每一帧都执行一个就不会搞混了。
0到7这8个分区,分别为
红、橙、黄、白、
青、蓝、绿、紫、
这8个颜色,就可以用红8、黄6、青12、这样的说法来测试精准定位了。
另外,还需要精准读取图片的哪个位置。
就是根据上面这个图片的数字公式化的获得下面这张图片的定位信息。
搜索 JavaScript 向下取整和取余
js 除法取整数、取余数的方法-CSDN博客
blog.csdn.net/qq_41353397/article/details/120123235
95/12的整数是7,所以显示文件那里下面这样写就好了。
i = this.eventId();
ImageManager.loadCharacter = function(filename) {
filename = i
return this.loadBitmap("img/characters/", filename);
};
$gameMap.event(this.eventId()).setImage("i",7)
95/12的余数是11,就是2.png的那个11,
也是3.png里朝向中2468这下左右上的8,
还是3.png里定位中012这左中右的2。
那么这11能通过怎样的公式跟8和2关联起来呢,
11/3的整数是3,(3+1)*2=8
11/3的余数是2,直接使用就好了。
◆变量操作:#0001 = 95
◆变量操作:#0001 /= 12
◆文本:无, 无, 窗口, 底部
: :95除以12的整数等于\v[1]
◆变量操作:#0001 = 95
◆变量操作:#0001 %= 12
◆文本:无, 无, 窗口, 底部
: :95除以12的余数等于\v[1]
◆变量操作:#0001 /= 3
◆变量操作:#0001 += 1
◆变量操作:#0001 *= 2
◆文本:无, 无, 窗口, 底部
: :变量1除以3加一之后再诚意2的得出的行走图行数位置是\v[1]
◆变量操作:#0001 = 95
◆变量操作:#0001 %= 12
◆变量操作:#0001 %= 3
◆文本:无, 无, 窗口, 底部
: :通过变量1除以3的余数得出行走图左中右位置是\v[1]
上面测试了一下是可以的,但是公式化的东西是需要随机多试几次来增加可信度的,所以又试了下面这个。
◆变量操作:#0001 = 1
◆变量操作:#0001 /= 12
◆文本:无, 无, 窗口, 底部
: :1除以12的整数等于\v[1]
◆变量操作:#0001 = 1
◆变量操作:#0001 %= 12
◆文本:无, 无, 窗口, 底部
: :1除以12的余数等于\v[1]
◆变量操作:#0001 /= 3
◆变量操作:#0001 += 1
◆变量操作:#0001 *= 2
◆文本:无, 无, 窗口, 底部
: :变量1除以3加一之后再诚意2的得出的行走图行数位置是\v[1]
◆变量操作:#0001 = 1
◆变量操作:#0001 %= 12
◆变量操作:#0001 %= 3
◆文本:无, 无, 窗口, 底部
: :通过变量1除以3的余数得出行走图左中右位置是\v[1]
经过了上面的两次测试之后,就需要在脚本框写代码了。
下面这个解决了图片名,但是发现索引Index好像也需要重新写,先睡了,有空再来更新。
ImageManager.loadCharacter = function(filename) {
filename = i;
return this.loadBitmap("img/characters/", filename);
};
$gameMap.event(this.eventId()).setImage("i",j);
哎,这么多天都没管这个,今天有空再来看一看,原来是矮凳子绊倒人啊,◆变量操作:#0001 += 95 这么明显的错误都没有看到,我说怎么图片消失掉了呢。
改成了 ◆变量操作:#0001 = 95 这样就可以了,跟j跟索引Index都没关系。
把整理好的东西放在3楼吧。
rpgmaker更改事件页图像好像有两个地方,
第一个是事件指令第二页、设置移动路线的更改图像。
这个好像只能指定横4竖2的八分之一,在js文件夹 ROUTE_CHANGE_IMAGE 就能找到 rmmz_objects.js 里的那两个相关代码。
第二个是事件页本身的显示图像,上面这个的有限度好像是高于这个,可以覆盖掉这个图像。
通过在上面这里找到 this.setImage(params[0], params[1]); 之后,搜索 setImage 就能找到相关代码了。
好像是 Game_Event.prototype.setupPageSettings 函数里面的 this.setImage(image.characterName, image.characterIndex); 好像就是关键代码。
或者是分别搜索 characterName 和 characterIndex ,找到的那些好像就是了。
$gameMap.event(this.eventId())._pageIndex 是获得本事件现在正在执行的是几号分页面的脚本
然后找到了下面这段代码
Game_Event.prototype.page = function() {
return this.event().pages[this._pageIndex];
};
但是试了一下下面这个脚本好像是不行的,一时之间不知道怎么写脚本才能更改事件页的图像。
$gameMap.event(this.eventId()).pages(0).setImage(Actor1,1)
后面发现好像是不需要pages(0)这个第几页面的,应该都是显示当前页面的,像是下面这个脚本就可以了。
$gameMap.event(this.eventId()).setImage("Actor1",1)
//在括号里按照8、2、4、6来设置上下左右的方向,好像是 设置事件位置 这个事件指令的脚本
$gameMap.event(this.eventId()).setDirection(2);
//改写原始图案位置,0到2分别是左中右
$gameMap.event(this.eventId())._originalPattern = 2
//步行动画,默认移动时才起效。括号里面可以说数字1或者是1以上和true都是真,0和false都是假
$gameMap.event(this.eventId()).setWalkAnime(true); //这个步行动画先放着,现在的测试是精准定位。
//踏步动画,默认等待时才起效。括号里面可以说数字1或者是1以上和true都是真,0和false都是假
$gameMap.event(this.eventId()).setStepAnime(true); //这个呼吸动画或者是踏步动画先放着,现在的测试是精准定位。
还有就是不小心发现了下面这些脚本
$gameTemp.requestAnimation([this.character(0)], 36,0)
//$gameTemp.requestAnimation([$gameMap.event(this.eventId())], 36,0)
MZ版的36号动画是歌曲,缩小后也挺好看的,上面这个和下面这个是播放的方向是不一样的。
//$gameTemp.requestAnimation([this.character(0)], 36,1)
$gameTemp.requestAnimation([$gameMap.event(this.eventId())], 36,1)
$gameMap.event(this.eventId()).setTileImage(5);
//上面这个是让本事件变成B图块的5号图块。。。下面这样就是4个图块组成的城堡,需要预先设置4个事件页。
$gameMap.event(this.eventId()).setTileImage(4*8);
$gameMap.event(this.eventId()+1).setTileImage(4*8+1);
$gameMap.event(this.eventId()+2).setTileImage(5*8);
$gameMap.event(this.eventId()+3).setTileImage(5*8+1); |
-
1.png
(200.94 KB, 下载次数: 1)
|