这一部分的代码修改涉及到了很多知识点。
以RMMZ为例,首先找到关于敌群的代码:
[JavaScript] 纯文本查看 复制代码 /** 设置* @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[member.enemyId]) { //如果敌人-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改成从数组中抽取就可以了。
我们可以先定义一个函数:
[C++] 纯文本查看 复制代码 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[Math.randomInt(pool.length)]);
//length函数得到这个数组的长度,Math.randomInt来根据长度随机选取数组的一个元素序号,pool[序号]即为选中的敌人ID
//最后使用Number来强制转换成数字格式
};
看懂了这个函数之后,我们再来修改之前的new Game_Enemy部分,改成这样:
[JavaScript] 纯文本查看 复制代码 const randomEnemyId = selectEnemyId($dataEnemies[member.enemyId]);
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是同样适用的。
|