Java游戏-处理线性运动

Java游戏-处理线性运动,java,game-physics,Java,Game Physics,所以,我正在尝试用LWJGL制作一个游戏,它似乎对我来说很好。尽管如此,我在屏幕上移动实体时遇到了一些问题。我想让它以相同的速度从一点移动到另一点。此外,我正在根据实体移动的方向设置精灵的动画 但是!我有一些问题: 1#它会闪烁,因为移动是由修改器定义的:delta(用于使FPS定义的移动平滑)。事实上,它从未真正到达它的点(因为它重新计算,并且从未到达该位置)。我怎样才能解决这个问题 2#当两名玩家加入同一服务器时,我的角色在速度最快的计算机上运行得更快。我想这是因为FPS,怎么解决呢 pri

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

但是!我有一些问题:

1#它会闪烁,因为移动是由修改器定义的:delta(用于使FPS定义的移动平滑)。事实上,它从未真正到达它的点(因为它重新计算,并且从未到达该位置)。我怎样才能解决这个问题

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);
}
私有字符串名称;
专用浮动位置X,位置Y;//现在的
专用int targetx,targety;//目标
私有整数dx,dy;//方向
私有int pointx,pointy;//方向
私人浮动速度;
私人雪碧;
公共实体(字符串名称、int-positionx、int-positiony、Sprite-Sprite){
this.name=名称;
该速度=0.1f;
这个位置x=720;
这个位置y=450;
this.targetx=1000;//修复此问题
this.targety=10;//这用于测试。
this.sprite=精灵;
该值为0.dx=0;
这是0.dy=0;
}
//双距离=数学sqrt((vx*vx)+(vy*vy));
公共无效移动(长三角){
如果(位置X<目标X){
dx=1;
点x=1;
}否则如果(位置X>目标X){
dx=-1;
点x=-1;
}否则{
dx=0;
}
如果(位置Y目标){
dy=-1;
尖头=-1;
}否则{
dy=0;
}
//设置动画:
如果(位置x==targetx&&positiony==targety){
if(pointx0){
设置动画(6,2100);//站在右边
}else if(pointy0){
sprite.setAnimation(4,2100);//站下来
}
}否则{
if(pointx0){
设置动画(2,2100);//向右行走
}else if(pointy0){
sprite.setAnimation(0,2100);//向下行走
}
}
//这里有动静。
位置x+=dx*增量*速度;
位置y+=dy*δ*速度;
系统输出打印LN(dx*增量*速度);
设置位置((内部)位置X,(内部)位置Y);
}
1#它会闪烁,因为移动是由修改器定义的:delta(用于使FPS定义的移动平滑)。事实上,它从未真正到达它的点(因为它重新计算,并且从未到达该位置)。我怎样才能解决这个问题

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

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);
}
如果你使用计时器,答案与问题1相同。每个玩家将以相同的速度移动(因为每个玩家所用的时间是相同的)

底线:

fps是可变的,而每个人的运行时间都是相同的

哦,对不起,我不是指FPS。Delta是最后一帧的渲染时间,我将其用作修改器。渲染最后一帧的时间越长,增量越大,因此移动时间越长。那不是和计时器一样好吗?否则,如果不使计时器闪烁更多(1000/60=每帧16毫秒,如果计时器每50毫秒移动一次,它就会闪烁),我就看不清如何准确地使用计时器。我实现了:
if(Math.abs(positionx-targetx)…这解决了闪烁问题,但这能解决我现在的网络问题吗?如果你有一个中央服务器,让服务器处理移动,让玩家发送他们当前的方向。如果为移动设置了计时器,那么cpu速度更快的玩家应该不能移动得更快,因为所有玩家都有相同的时间r-移动间隔。