赞 | 35 |
VIP | 0 |
好人卡 | 0 |
积分 | 72 |
经验 | 0 |
最后登录 | 2024-11-5 |
在线时间 | 472 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 7188
- 在线时间
- 472 小时
- 注册时间
- 2021-12-4
- 帖子
- 511
|
前两天试着玩了一下VisuStella的范例项目,我目前感觉所谓八方向插件的核心功能有三点:
1. 玩家控制的主角八方向行走,比如说同时按下两个垂直的方向键会斜着走(rmva作品king exit就是这样),或者按下小键盘1379会斜着走。
2. 人物(主要是主角)静止时的【逻辑朝向】也有8种而不是4种,体现在可以用确定键触发斜向的事件(x和y都相差1),甚至隔着斜向的柜台触发事件(x和y都相差2)。
3. 行走图也有8个方向而不是4个,从而使得静止时的8个朝向能直接看出来(否则比如说你看到主角是朝右的,但逻辑上它可能朝着右上或右下)。
而rm自带的斜向移动则只能用于【设置移动路线】指令,并且静止时朝向以及行走图依然只有4个方向。
我对楼主的建议是,如果只想要事件的【八方向移动】而不需要【八方向行走图】或者它们在静止时的【8个逻辑朝向】,那么应该放弃相关插件……
那好,问题就变成了,如何让事件的随机移动以及靠近/远离主角【包含斜向】而不是【只有横竖】。
rpg.objects.js的第7800行左右有这样几个函数:
Game_Character.prototype.moveRandom = function() {
const d = 2 + Math.randomInt(4) * 2;
if (this.canPass(this.x, this.y, d)) {
this.moveStraight(d);
}
};
Game_Character.prototype.moveTowardCharacter = function(character) {
const sx = this.deltaXFrom(character.x);
const sy = this.deltaYFrom(character.y);
if (Math.abs(sx) > Math.abs(sy)) {
this.moveStraight(sx > 0 ? 4 : 6);
if (!this.isMovementSucceeded() && sy !== 0) {
this.moveStraight(sy > 0 ? 8 : 2);
}
} else if (sy !== 0) {
this.moveStraight(sy > 0 ? 8 : 2);
if (!this.isMovementSucceeded() && sx !== 0) {
this.moveStraight(sx > 0 ? 4 : 6);
}
}
};
Game_Character.prototype.moveAwayFromCharacter = function(character) {
const sx = this.deltaXFrom(character.x);
const sy = this.deltaYFrom(character.y);
if (Math.abs(sx) > Math.abs(sy)) {
this.moveStraight(sx > 0 ? 6 : 4);
if (!this.isMovementSucceeded() && sy !== 0) {
this.moveStraight(sy > 0 ? 2 : 8);
}
} else if (sy !== 0) {
this.moveStraight(sy > 0 ? 2 : 8);
if (!this.isMovementSucceeded() && sx !== 0) {
this.moveStraight(sx > 0 ? 6 : 4);
}
}
};
可以看到其中具体调用的都是横竖移动(moveStraight),横竖移动的参数可以填 2 4 6 8 这四个数字表示【下 左 右 上】。
那么我们只要修改这几个函数的逻辑,使得某些情况下调用的是斜向移动(moveDiagonally)即可,斜向移动要填两个参数,第一个是4或6,第二个是2或8。
举个例子:当前某个怪物在主角的(x+4,y+10)位置,如果让它一直向主角移动,那么rm默认的行为很可能是【先向上6步,然后左上左上左上左上锯齿形靠近玩家】。
而如果对上述函数的逻辑修改足够恰当,就能做出【先向左上斜走4步,然后再直线向上6步撞到主角】的效果,也更符合现实。 |
|