0

我遇到了精灵移动的问题,我不知道如何处理它。

当我为我的玩家精灵设置一个目的地时(通过点击屏幕),它会让玩家朝着那个方向移动。不幸的是,玩家有点……摇摆不定。他在路上有点颤抖。

我已经建立了一个仅使用图形基元 (graphics.fillRect(x,y,w,h)) 的测试项目,它真的很容易看到。这是一个不使用视频/gif的示例:

吴

我的代码看起来像这样

public void tick() {

    if (InputHandler.leftClick.heldDown) {
        dest.setLocation(InputHandler.leftClick.xPos, InputHandler.leftClick.yPos);
    }

    direction.setLocation(dest.getX() - position.x, dest.getY() - position.y);
    direction.normalize();
    position.add(direction.multiply(velocity));
}

这是一个非常基本的运动系统,因为我在其他地方也遇到了同样的问题,我想在更可控的环境中处理它们。

最奇怪的是,当玩家到达时,他仍然只是坐在一个点上,疯狂地发抖。

任何人都可以帮忙吗?

4

1 回答 1

0

是不是有点偏差?在您所说的“点击屏幕”和heldDown. 你读过鼠标事件处理程序吗?但我看到你想逐个滴答作响。如果路径发生变化,如果有一个布尔标志会更清楚地提醒您。那么这个部分看起来像

if (leftclicked) {
    dest.setLocation(InputHandler.leftClick.xPos, InputHandler.leftClick.yPos);
    leftclicked = false;
}
...

严格来说,在物理学中,速度是一个向量。它既有方向,也有大小。如果您打算将其仅视为物体可以移动的速度,并立即转动,那么接下来的三行应该没问题,尽管可读性似乎可以提高。(你必须确定所有辅助方法都在做什么。我可能更愿意在一个地方做任何需要的计算。)

但是我怀疑你确实有velocity像矢量这样的东西。这里有一些动量的概念。我认为该multiply()方法的实现很奇怪。如果它将角度velocitydirection行为角度相加/组合,则会产生这样的结果。拥有动力方面很酷,但如果需要,您应该真正考虑如何去做。

另一种解释是,您显示的代码按预期工作,沿着黑线的方向缓慢移动,但代码的其他部分与position. 我们没有得到关于抵达时发生的事情的照片......

关于可读性的另一件事。这非常重要......“非常非常基本”的东西可能是错误的沼泽,没有简单的组织步骤。我不得不多次重写实现,因为我过分渴望并错过了设计。看起来你在我的祸根中做得很好,“一个方法/对象做一件事(好)”的原则,但遇到了麻烦......命名,所有的事情。示例:direction.setLocation()现在,方向没有位置。重复:方向没有位置。此外,方向不需要标准化 - 它们没有长度。

反而:

direction = new Direction(dx, dy);
position.add(direction.multiply(MOVEMENT_SPEED));//assuming constant speed

在哪里

//sensible encapsulation of "direction"
class Direction {
    double angle;//angle in degrees

    //constructs a direction from cartesian coordinates
    Direction(int x, int y){
        angle = Math.toDegrees(Math.atan((double)y/x));
    }

    //create a vector of specified length in this direction
    java.awt.Point multiply(double amt){
        return new java.awt.Point(amt*Math.cos(angle), amt*Math.sin(angle))
    }
    ...
}

嗯长答案......请在未来尝试清晰的代码和问题!:)

于 2013-09-04T06:36:45.163 回答