古树旋律 发表于 2023-2-18 09:24:48

使敌群中的敌人变为随机敌人

这一部分的代码修改涉及到了很多知识点。

以RMMZ为例,首先找到关于敌群的代码:
/** 设置* @param {number} troopId 敌群id* @description 清除内容,设置敌群id,然后根据敌群数据设置每一个敌人,然后制作/设置唯一名称*/
Game_Troop.prototype.setup = function(troopId) {
    this.clear(); //清空以前的
    this._troopId = troopId;//暂存/转存 为局部变量
    this._enemies = []; //定义类变量数组#是否可以省略前缀this.??
    for (const member of this.troop().members) {
                //循环 (常量 临时变量?? of xxxb被迭代的数组??) {执行的代码 }
      if ($dataEnemies) { //如果敌人-id不为空
            const enemyId = member.enemyId; //获取id和坐标
            const x = member.x;
            const y = member.y;
            const enemy = new Game_Enemy(enemyId, x, y); //新键敌人并暂存(通过id和坐标获取本体),这一行是本贴的重点!!
            if (member.hidden) { //如果为隐藏
                enemy.hide(); //隐藏的方法(开启隐藏开关)
            }
            this._enemies.push(enemy); //堆栈进 (类变量)_敌群数组里
      }
    }
    this.makeUniqueNames();//制作/设置唯一名称*/
};
可以看到const enemy = new Game_Enemy(enemyId, x, y);就是读取数据库中的敌人ID并且放在对应的X、Y坐标上。那如果做到敌人随机,只需要做到ID随机就可以了。
但如果只是简单的将enemyId替换成random()函数,就会导致整个游戏的敌群、敌人都随机,这并不是我们想要的结果,因为不可控,而且无法指定敌人。
我们可以从数组方面入手,将需要进行随机抽取的敌人ID放入数组中,然后把enemyId改成从数组中抽取就可以了。

我们可以先定义一个函数:
function selectEnemyId(enemyArray) {
      if (!enemyArray.meta.RandomEnemy) {
            return null;
      };
//定义函数名selectEnemyId,如果数据库中敌人的备注栏没有指定的RandomEnemy字符串,则返回null
      const pool = enemyArray.meta.RandomEnemy.split(',').map(Number);
//将数据库中敌人的备注栏RandomEnemy中出现的数字使用map函数变为数组,数组名为pool
      return Number(pool);
//length函数得到这个数组的长度,Math.randomInt来根据长度随机选取数组的一个元素序号,pool[序号]即为选中的敌人ID
//最后使用Number来强制转换成数字格式
    };
看懂了这个函数之后,我们再来修改之前的new Game_Enemy部分,改成这样:
const randomEnemyId = selectEnemyId($dataEnemies);
                const enemy = new Game_Enemy(randomEnemyId || member.enemyId, member.x, member.y);
实例如图,在图片1中,ID为14的敌人,备注栏中写入了1,6,7,8,9,10,11,12这几个数字。图2中,将ID为14的敌人放入敌群,战斗测试,可以看到图3图4的敌人是不同的。
如果各位还是不会修改,可以直接下载已经修改好的js文件,放入插件文件夹中启用即可。MZ和MV是同样适用的。



金色邦邦 发表于 2023-2-20 08:54:26

看起来不错的样子

三姐 发表于 2023-2-20 11:17:11

这个得配合敌人等级会更好吧~
页: [1]
查看完整版本: 使敌群中的敌人变为随机敌人