创造一个敌对的暴民

所以我目前正在开发一个2D俯视图java游戏。 我有一个叫做“突变体”的怪物,目前什么都不做。 它会生成一个随机数,并根据该数字向该方向移动几个像素。 当玩家靠近时,我正试图弄清楚如何使突变体跟随玩家的x和y坐标。

这是我的突变现在做的:

int xa = 0; int ya = 0; move = generator.nextInt(50) + 1; if(move == (50)) ya = (random.nextInt(3) - 1) * random.nextInt(2); if (!hasCollided(xa, ya)) if(move == 40) ya = (random.nextInt(3) - 1) * random.nextInt(2); if (!hasCollided(xa, ya)) if(move == 30) xa = (random.nextInt(3) - 1) * random.nextInt(2); if (!hasCollided(xa, ya)) if(move == 20) xa = (random.nextInt(3) - 1) * random.nextInt(2); if (!hasCollided(xa, ya)) if(xa != 0 || ya != 0) { move(xa, ya); isMoving = true; } else { isMoving = false; } 

有谁知道如何让暴民模仿对玩家的敌意? 我还没有实施一个卫生系统,我只在暴民的AI工作

一个非常简单的解决scheme可能是将突变体的x和y位置与玩家的x和y位置进行比较。

 Example: Player at {10, 10}, Mutant at {0, 0} if (mutant.x < player.x) mutant.x += amountToMove; else if (mutant.x > player.x) mutant.x -= amountToMove; if (mutant.y < player.y) mutant.y += amountToMove; else if (mutant.y > player.y) mutant.y -= amountToMove; 

这总是将怪物向玩家移动,但是您可能需要分割在x轴和y轴之间移动的量,因此它不会在纯粹的垂直或水平运动中以对角方向移动得更快。

 totalDistance = xDistance + yDistance; xSpeed = amountToMove * (xDistance / totalDistance); //uses proportion of xDistance to set proportion of speed. ySpeed = amountToMove * (yDistance / totalDistance); //same for yDistance 

突变体可以在一定范围内获得对玩家的参考。 例如,可以检查突变体和玩家之间的每一帧(或更less)的范围。 当突变体在特定范围内时,突变体可以获取玩家作为目标。

如何expression,取决于你,但一个简短的版本可能是:

 bool isHostile = true Entity target = player 

或者可能是一个临时的解决

 int targetX = player.x // needs updated every frame, as player moves int targetY = player.y 

在突变者将玩家作为目标之后,突变者可以移动到玩家身边。 一个被称为“归一化vector”的mathalgorithm对于计算在给定方向上移动多less是有用的。 没有一个标准化的vector,你会遇到一个经典的问题,那就是对角线移动比左/右或者上/下移动快得多。 以下是确定移动方向的一些伪代码,以及移动的方式:

  // xDiff and yDiff would be the length of the line between mutant and player var xDiff = target.x - npc.x var yDiff = target.y - npc.y // unitVector is a line which is 1.0 units long and points from mutant to player var unitVector = math.normalizeVector(xDiff, yDiff) // move along the line from mutant to player npc.x += unitVector.x * npc.speed * delta npc.y += unitVector.y * npc.speed * delta 

在上面的代码中,target是玩家,npc是你的突变体。 现在你可以忽略/去掉delta,也可以input一些testing号码来提高速度 – 但是可能以后会有一些话题叫做“frame independent movement”。

normalizeVector的近似math公式为:

  length = Math.sqrt((x * x) + (y * y)) var xComponent = x / length var yComponent = y / length 

这会将[+ 1,+ 1]的x,y运动转换为[0.707106781186547,0.707106781186547]这样的数字,这是一个丑陋的数字集合,但是会带有正确的运动量。 我会注意到,如果x和y都为0(这会被零除),这个特定的方程将会出错。 如果你正在使用math或游戏库,它可能已经有了这样的function。

正如DoubleDouble所说,那么你可以在上面覆盖更复杂的行为,例如:

  • 有限的感觉范围,例如只在暴徒附近或领先时攻击玩家。
  • 播放声音,animation和/或改变运动风格,当玩家被看到反馈给玩家。
  • 根据当前速度预测玩家未来的位置。
  • 一个简单的状态机,例如怪物巡逻或随机行动,直到玩家被看见。