3

所以,我正在尝试用 LWJGL 制作游戏,它似乎对我来说很好用。虽然,我在屏幕上移动我的实体时遇到了一些问题。我想让它以相同的速度从一个点到另一个点。另外,我正在根据实体移动的方向为我的精灵设置动画。

但!我有一些问题:

1#它闪烁是因为运动被定义了一个修饰符:delta(使FPS定义的平滑运动)。实际上,它从未真正达到它的目的(因为它会重新计算并且从未达到该位置)。我该如何解决这个问题?

2#当2个玩家加入同一个服务器时,我的角色在最快的电脑上跑得更快。我认为这是因为 FPS,如何解决?

private String name;
private float positionx,positiony; // Current
private int targetx,targety; // Target
private int dx, dy; // Direction
private int pointx, pointy; // Direction
private float speed;
private Sprite sprite;

public Entity(String name, int positionx, int positiony, Sprite sprite){
    this.name = name;
    this.speed = 0.1f;
    this.positionx = 720;
    this.positiony = 450;
    this.targetx = 1000; // fix this
    this.targety = 10; // this for testing.
    this.sprite = sprite;
    this.dx = 0;
    this.dy = 0;
}
//double distance = Math.sqrt((vx * vx) + (vy * vy));
public void move(long delta){
    if(positionx < targetx){
        dx = 1;
        pointx = 1;
    }else if(positionx > targetx){
        dx = -1;
        pointx = -1;
    }else{
        dx = 0;
    }

    if(positiony < targety){
        dy = 1;
        pointy = 1;
    }else if(positiony > targety){
        dy = -1;
        pointy = -1;
    }else{
        dy = 0;
    }


    //Set animations:
    if(positionx==targetx && positiony==targety){
        if(pointx<0){
            sprite.setAnimation(5, 2, 100); // Standing left
        }else if(pointx>0){
            sprite.setAnimation(6, 2, 100); // Standing right
        }else if(pointy<0){
            sprite.setAnimation(7, 2, 100); // Standing up
        }else if(pointy>0){
            sprite.setAnimation(4, 2, 100); // Standing down
        }
    }else{
        if(pointx<0){
            sprite.setAnimation(1, 2, 100); // Walking left
        }else if(pointx>0){
            sprite.setAnimation(2, 2, 100); // Walking right
        }else if(pointy<0){
            sprite.setAnimation(3, 2, 100); // Walking up
        }else if(pointy>0){
            sprite.setAnimation(0, 2, 100); // Walking down
        }
    }
    //movement here.
    positionx += dx*delta*speed;
    positiony += dy*delta*speed;

    System.out.println(dx*delta*speed);

    sprite.setPosition((int)positionx, (int)positiony);
}
4

1 回答 1

2

1#它闪烁是因为运动被定义了一个修饰符:delta(使FPS定义的平滑运动)。实际上,它从未真正达到它的目的(因为它会重新计算并且从未达到该位置)。我该如何解决这个问题?

如果存储它移动的点 A 和点 B,则可以设置时间间隔。每个时间间隔都会经过一段设定的距离,如果在一次迭代中物体走得太远,您可以为 B 点设置其坐标。这可以通过计时器轻松完成。这样,经过一定时间后,它将位于您指定的位置。

2#当2个玩家加入同一个服务器时,我的角色在最快的电脑上跑得更快。我认为这是因为 FPS,如何解决?

如果您使用计时器,答案与问题 #1 相同。每个玩家将以相同的速度移动(因为每个玩家的经过时间相同)。

底线:
fps是可变的,而每个人的经过时间都是相同的。

于 2013-07-30T18:18:03.993 回答