我怎样才能得到我的;“敌人”;追逐",;目标JAVA

我怎样才能得到我的;“敌人”;追逐",;目标JAVA,java,position,action,move,Java,Position,Action,Move,我一直在尝试编写一个朋友给我的半成品简单java游戏(我想尝试学习编码,所以他给了我一个编程课上的老作业)。 他告诉我试着用他给我的两个类,一个主类和一个子类来构建一个游戏 到目前为止,我已经完成了所有的工作,除了找到一种方法让我的敌人职业朝着目标前进,而不管它的位置如何。我可以让它总是朝着一个固定的方向移动,如果我把它设置得很好的话,但是我希望能够找到目标的位置,不管它在哪里,并且朝着目标前进 代码需要在敌人下的peformation方法中写入 如果有人愿意解释我是如何做到这一点的,那将是非常

我一直在尝试编写一个朋友给我的半成品简单java游戏(我想尝试学习编码,所以他给了我一个编程课上的老作业)。 他告诉我试着用他给我的两个类,一个主类和一个子类来构建一个游戏

到目前为止,我已经完成了所有的工作,除了找到一种方法让我的敌人职业朝着目标前进,而不管它的位置如何。我可以让它总是朝着一个固定的方向移动,如果我把它设置得很好的话,但是我希望能够找到目标的位置,不管它在哪里,并且朝着目标前进

代码需要在
敌人
下的
peformation
方法中写入

如果有人愿意解释我是如何做到这一点的,那将是非常合适的,甚至你可以把我链接到另一篇文章,解释如何做我想做的事情

先谢谢你

GameManager(主)类:

我的目标(子)类:


如果只想将修改限制在performAction方法上,那么当前代码是不可能的

1) 敌人无法接近(看到)目标的坐标。这意味着代码无法找到通往目标的道路,因为它没有目标位置的X和Y。 2) 要解决这个问题,你需要敌人能够看到目标的X和Y。最快的方法是在GameManager类中使用返回存储的目标对象。然后,您可以修改您的敌人,以存储对创建它的GameManager的引用

游戏经理:

public Goal getGoal() {
    return goal;
}
敌人:

 private GameManager gameManager;

 public Enemy (GameManager gameManager, int x, int y) {
        ...
        this.gameManager = gameManager;
 }
最后一步是从存储的gameManager中获取目标对象,并使用其X和Y执行一些逻辑(这将在Performation方法中执行):

我相信你会知道如何处理这些数字,并知道如何从那里朝着目标前进

@编辑
如果不是-敌人和目标,然后相应地选择valX和/或valY。

在您的方法
性能中,您当前正在分别更改x和y位置,每次调用该方法时将其增加1

这将使你的敌人在x方向移动1个单位,在y方向移动1个单位

相反,您希望将角色朝着目标的方向移动。这更像是一个数学问题,而不是编程问题,但让我们试一试:

你有两个职位:

你的敌人有一个姿势,你的目标也有同样的姿势

你现在想让你的敌人朝着目标的方向移动。所以你可以计算一个向量,用它连接这两点

然后,通过规范化向量并用速度进行标量乘法,将向量的长度更改为敌人可以移动的速度(可能用字段定义)

因此,对于给定的速度
S
,这给出了完整的公式:

现在让我们将其转换为代码。在你的
敌人
类的构造函数中,将
游戏管理器
保存为一个字段,这样你就可以调用它的
getGoal
方法

因此,我们添加了一个字段
private GameManager GameManager
,并在构造函数中执行
this.GameManager=GameManager
来存储引用

此外,我们还添加了一个字段
private double speed=2
,用于计算

然后我们改变
性能
方法来实现我们的公式。大概是这样的:

public void performAction()
{
    // Calculate our P_g - P_e
    double dX = gameManager.getGoal().getX() - valX;
    double dY = gameManager.getGoal().getX() - valX;

    // Calculate its length to normalize it
    double divider = Math.sqrt(dX * dX + dY * dY);

    // Normalize it
    dX /= divider;
    dY /= divider;

    // Do a scalar multiplication with our speed
    dX *= speed;
    dY *= speed;

    valX += dX;
    valY += dY;
}

我们在这里遇到的唯一问题是,我们正在向整数值
valX
valY
添加双值,因此通常可能会将它们更改为双值,否则您可能会遇到敌人根本无法移动的问题。

一个非常简单的实现:

public void performAction()
{
    valX += Math.signum(gameManager.getGoal().getX() - valX);
    valY += Math.signum(gameManager.getGoal().getX() - valX);
}

你们两个班都有。所以你需要根据这些来检查方向
goal.getX()-player.getX()
将根据负值、零值或正值为您提供
X
方向。与
Y
相同。如果您能向我们提供更多关于您可以使用a做什么的信息,那么回答会更简单;)我相信这一点:这一部分与让我将球门的x和y线连接到主要敌人职业有关,我只想朝着球门的位置前进(即使它保持静止,如果我要移动,敌人仍然应该朝着球门前进)。我还认为它需要用变形方法编写,但不能100%确定你刚才链接的是计算你的敌人是否真的达到了目标,因此你可以调用
die
方法并将其从游戏中移除。老实说,将你的角色移动到那里的逻辑非常相似。嘿,谢谢你花时间回复。我被告知要正确地执行此操作,我不应该更改GameManager类中的任何代码,尽管它不必用pefromAction编写,这正是我的想法。关于让敌方职业能够阅读目标职业,我想了很多,也想不出怎么做,虽然你给敌方职业和目标职业的信息在理论上应该有用,如果我能在不改变游戏管理器等级的情况下管理它,如果你能修改目标职业,有一种方法可以绕过它,使目标类的X和Y保持静态:
static int posX然后在敌方类中执行
Goal.posX
以获得目标的X。这仅在你没有多个目标且不被鼓励的情况下有效。看:啊,是的,我可以改变除GameManager以外的任何其他职业,无论我觉得合适与否,我相信我理解你的意思,我会尝试一下。谢谢,阿洛蒂刚刚给了这个机会,除了“gameManager.getGoal()”以外的所有东西都能用。出于某种原因,这给了我一个错误:/下面是错误消息:@yasbilc请看卡米尔的答案f
 private GameManager gameManager;

 public Enemy (GameManager gameManager, int x, int y) {
        ...
        this.gameManager = gameManager;
 }
int goalX = gameManager.getGoal().getX();
int goalY = gameManager.getGoal().getY();

...some logic to calculate the direction here...
public void performAction()
{
    // Calculate our P_g - P_e
    double dX = gameManager.getGoal().getX() - valX;
    double dY = gameManager.getGoal().getX() - valX;

    // Calculate its length to normalize it
    double divider = Math.sqrt(dX * dX + dY * dY);

    // Normalize it
    dX /= divider;
    dY /= divider;

    // Do a scalar multiplication with our speed
    dX *= speed;
    dY *= speed;

    valX += dX;
    valY += dY;
}
public void performAction()
{
    valX += Math.signum(gameManager.getGoal().getX() - valX);
    valY += Math.signum(gameManager.getGoal().getX() - valX);
}