设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 288|回复: 4
打印 上一主题 下一主题

[综合信息] 通过代数灵活设置rpgmaker行走图的图片名和读取位置

[复制链接]

Lv2.观梦者

梦石
0
星屑
923
在线时间
100 小时
注册时间
2025-2-15
帖子
52
跳转到指定楼层
1
发表于 2025-10-11 18:33:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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)

1.png

Lv2.观梦者

梦石
0
星屑
923
在线时间
100 小时
注册时间
2025-2-15
帖子
52
2
 楼主| 发表于 2025-10-12 10:28:40 | 只看该作者
◆脚本:this.wait(this.eventId());
◆注释:1楼说了那么多,如果没有耐心去看的话,
:  :直接在characters文件夹方法1.png和2.png
:  :然后1号事件页和2号事件页都这样设置,
:  :就可以看到它们各自读取他们编号的图片了。
:  :
:  :至于为什么不直接指定文件名,因为复制粘贴就可以搞定,好像可以配合下面这些插件。
◆注释:在 NRP 磁贴上自动生成事件 - NRP_TileToEvent.js
:  :https://plugin-mz.fungamemake.com/archives/2860
:  :MNKR SAN 自动随机映射生成 - MNKR_SAN_MapGenerator.js
:  :https://plugin-mz.fungamemake.com/archives/1397
:  :动态事件生成 - EventReSpawn.js
:  :https://plugin-mz.fungamemake.com/archives/212
◆脚本:i = this.eventId();
:  :ImageManager.loadCharacter = function(filename) {
:  :    filename = i
:  :    return this.loadBitmap("img/characters/", filename);
:  :};
:  :$gameMap.event(this.eventId()).setImage("i",0)
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
923
在线时间
100 小时
注册时间
2025-2-15
帖子
52
3
 楼主| 发表于 2025-10-26 23:50:29 | 只看该作者
$gameVariables.setValue(this.eventId(), 95);
可以使用事件指令 ◆变量操作:#0001 = 95 指定,那就是可以跟下面这个脚本框放在一起,也可以不放在一起,这样就可以很灵活的操作了。
什么条件下本事件编号的那个变量等于几,什么条件下变量值增加或减少,变量值在0到95的时候就自动显示哪个位置的图像。
另外,这个变量值可以大于95,这样就可以让图片消失了。
还有就是 k = Math.floor(($gameVariables.value(1)%12)/3+1)*2; 这个可以改成 k = 把2、4、6、8的数字改成其他数字,比如3啊,比如5.5啊之类的,这样显示的图片就不是正对着那几行默认位置了,这个发现虽然好像没用,但是说不定什么时候会被用到呢。

/*
i 图片名   
j 图片区位0 - 7   
k 行走图朝向下上左右2 4 6 8   
l 图片定位的左中右0 1 2
*/
$gameVariables.setValue(this.eventId(), 95);

i = this.eventId();
j = Math.floor(($gameVariables.value(1)/12));
k = Math.floor(($gameVariables.value(1)%12)/3+1)*2;
l = Math.floor($gameVariables.value(1)%12%3);

ImageManager.loadCharacter = function(filename) {
    filename = i;
    return this.loadBitmap("img/characters/", filename);
};

$gameMap.event(this.eventId()).setImage("i",j);  //图片名和0到7的区块
$gameMap.event(this.eventId()).setDirection(k);   //图片的下上左右2468
$gameMap.event(this.eventId())._originalPattern = l;    //图片的左中右012

if($gameVariables.value(this.eventId()) > 95){
   $gameMap.event(this.eventId())._through = true
} else {
$gameMap.event(this.eventId())._through = false
}  //如果本事件编号变量的值大于95,那么本事件就可以穿透,否则不可以穿透。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
923
在线时间
100 小时
注册时间
2025-2-15
帖子
52
4
 楼主| 发表于 7 天前 | 只看该作者
◆如果:玩家 朝向 上
  ◆脚本:$gameVariables.setValue(this.eventId(),$gameVariables.value(this.eventId()) + 1);
  ◆等待:10帧
  ◆
:结束分支
◆如果:玩家 朝向 下
  ◆脚本://$gameVariables.setValue(this.eventId(),$gameVariables.value(this.eventId()) - 1);
  :  :$gameVariables.setValue(this.eventId(),0);
  ◆等待:10帧
  ◆
:结束分支
3楼的脚本配合上面的这个设置试了一下(并行执行),会出现需要两次切换图片才到正确图片的情况。2号事件页(玩家接触)配合下面这个也试了一下。
◆数值输入处理:#0001, 2 位
原因是在rmmz_objects.js的Game_Event.prototype.setupPageSettings函数里有下面这两行代码,originalPattern这个原始图案在之前测试的时候是正常的,在这里把$gameMap.event(this.eventId())._originalPattern = l; 改成 $gameMap.event(this.eventId()).setPattern(l); 就可以了。
        this._originalPattern = image.pattern;
        this.setPattern(image.pattern);

还有就是那三行里面的$gameVariables.value(1)这个,是因为一直都在用1号事件页来测试才这样写的,
改成$gameVariables.value(this.eventId())才能真正的本事件、本事件编号的变量、本事件编号ID的图案这个样子。
把改好的脚本放到5楼吧。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
923
在线时间
100 小时
注册时间
2025-2-15
帖子
52
5
 楼主| 发表于 7 天前 | 只看该作者
本帖最后由 写给妖精的情诗 于 2025-11-2 17:36 编辑

this.wait(this.eventId());   
/*
这个等待本事件编号的多少帧,是因为多个事件页同一帧执行读取图像的时候会读取同一个图像。
要是直接在原始代码那里修改或者是写插件的话,或许就不需要这个等待几帧了。
*/

/*
在这里如果怎么样,就让本事件编号的那个变量值等于几,如果怎么样就加一减一。
$gameVariables.setValue(this.eventId(),$gameVariables.value(this.eventId()) + 1);
$gameVariables.setValue(this.eventId(), 0);

if(){
}else if(){
}else if(){
}else{
}

switch(变量或表达式) {
    case 常量1:
        语句块1;
        break;
    case 常量2:
        语句块2;
        break;
    ...
    case 常量n:
        语句块n;
        break;
    default:
        语句块n+1;
}
*/


上面的放在上一个脚本框,也可以放在事件指令的分支条件那里。
下面的放在下一个脚本框那里。


/*
i 图片名   
j 图片区位0 - 7   
k 行走图朝向下上左右2 4 6 8   
l 图片定位的左中右0 1 2
*/

i = this.eventId();
j = Math.floor(($gameVariables.value(this.eventId())/12));
k = Math.floor(($gameVariables.value(this.eventId())%12)/3+1)*2;
l = Math.floor($gameVariables.value(this.eventId()%12)%3);

ImageManager.loadCharacter = function(filename) {
    filename = i;
    return this.loadBitmap("img/characters/", filename);
};

$gameMap.event(this.eventId()).setImage("i",j);  //图片名和0到7的区块
$gameMap.event(this.eventId()).setDirection(k);   //图片的下上左右2468  
$gameMap.event(this.eventId()).setPattern(l);   //图片的左中右012

if($gameVariables.value(this.eventId()) > 95){
   $gameMap.event(this.eventId())._through = true
} else {
   $gameMap.event(this.eventId())._through = false
}  //如果本事件编号变量的值大于95,那么本事件就可以穿透,否则不可以穿透。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-11-3 10:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表