古树旋律 发表于 2023-2-17 10:46:30

关于战斗中角色向前移动一步的那些事



如图所示,MZ和MV在横板战斗中,角色在选择行动和执行行动这两处,会向前移动一步。
以MZ为例,可以在rmmz_sprites.js找到这一段:
Sprite_Actor.prototype.shouldStepForward = function() {
    return this._actor.isInputting() || this._actor.isActing();
};
_actor.isInputting即为选择行动时,_actor.isActing即为执行行动时。所以如果只想在行动的时候向前移动只需要改成如下即可:
Sprite_Actor.prototype.shouldStepForward = function() {
    return this._actor.isInputting();
};
这样在CTB等模式中,画面就会精简很多,不会角色乱跳了。

再进阶一下,搜索shouldStepForward,可以看到另一处有以下代码:
/**更新目标位置 */
Sprite_Actor.prototype.updateTargetPosition = function() {
    if (this._actor.canMove() && BattleManager.isEscaped()) {
      this.retreat();
    } else if (this.shouldStepForward()) {/** 需要前进*/
      this.stepForward();//(左)前进48像素
    } else if (!this.inHomePosition()) {/** 不 是处于本位(SV图初始站立位置)*/
      this.stepBack();//返回本位(4次(右)慢走12像素)
    }
};
继续深挖搜索stepForward,找到以下代码:
/**步骤推进 */
Sprite_Actor.prototype.stepForward = function() {
    this.startMove(-48, 0, 12);/** 开始移动*(x坐标,y坐标,持续时间/帧)*/
};

/**步骤返回 */
Sprite_Actor.prototype.stepBack = function() {
    this.startMove(0, 0, 12);/** 开始移动*(x坐标,y坐标,持续时间/帧)*/
};

/**撤退 */
Sprite_Actor.prototype.retreat = function() {
    this.startMove(300, 0, 30);/** 开始移动*(x坐标[从当前点开始计算位置,而不是屏幕0,0点],y坐标,持续时间/帧)*/
};
这些数字就是角色位移距离和持续时间。

继续深挖startMove,找到系统定义的函数:
Sprite_Battler.prototype.startMove = function(x, y, duration) {
    if (this._targetOffsetX !== x || this._targetOffsetY !== y) {
      this._targetOffsetX = x;
      this._targetOffsetY = y;
      this._movementDuration = duration;
      if (duration === 0) {
            this._offsetX = x;
            this._offsetY = y;
      }
    }
};
我们可以打开思路,用这个函数照葫芦画瓢,做一个角色移动到画面中心位置,突出重点等等之类的玩法了。
页: [1]
查看完整版本: 关于战斗中角色向前移动一步的那些事