Java2D自上而下游戏中的流畅移动

Java2D自上而下游戏中的流畅移动,java,2d,Java,2d,我相信其他人也有同样的问题,但在大量的谷歌搜索之后,我找不到任何完全相关的东西 我正在使用Java2D制作一个2D自上而下的游戏。我有单独的渲染和物理线程。 移动基于鼠标,计算采用以下形式: isMoving = false; // Sets initial distance moved to 0 playersMoveX = 0; playersMoveY = 0; // If player clicks, determines the distanc

我相信其他人也有同样的问题,但在大量的谷歌搜索之后,我找不到任何完全相关的东西

我正在使用Java2D制作一个2D自上而下的游戏。我有单独的渲染和物理线程。 移动基于鼠标,计算采用以下形式:

    isMoving = false;
    // Sets initial distance moved to 0
    playersMoveX = 0;
    playersMoveY = 0;

    // If player clicks, determines the distance to click
    if (MainGame.movement)
    {
        distanceX = MouseClass.changeInX;
        distanceY = MouseClass.changeInY;

        moveMarker();
    }

    // Prevents divide by zero error, and prevents variables from becoming negative
    if (distanceX < 0)
        distanceX = 0;
    if (distanceY < 0)
        distanceY = 0;
    if (distanceX == 0 && distanceY == 0)
        return;

    // Sets the speed that the player moves (player moves a distance of moveFactor each cycle)
    if (Player.sprint)
        moveFactor = 2;
    else
        moveFactor = 1;

    double sumDistance = Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2));
    double deltaX = (moveFactor * distanceX / sumDistance) * dT; 
    double deltaY = (moveFactor * distanceY / sumDistance) * dT;
    // Determines distance moved in x and y directions by using the ration of distanceX to distanceY
    if (MouseClass.mousePositionX > GUI.fullScreenWidth / 2 - 1 && preventCollision(0, npcs, buildings, objects))
    {
        playersMoveX += deltaX;
    }
    else if (preventCollision(1, npcs, buildings, objects))
    {
        playersMoveX -= deltaX;
    }
    if (MouseClass.mousePositionY > GUI.fullScreenHeight / 2 + 5 && preventCollision(2, npcs, buildings, objects))
    {
        playersMoveY += deltaY;
    }
    else if (preventCollision(3, npcs, buildings, objects))
    {
        playersMoveY -= deltaY;
    }
    // Accounts for movement in the distance to the click
    distanceX -= deltaX;
    distanceY -= deltaY;
    if (deltaX != 0 || deltaY != 0)
        isMoving = true;
isMoving=false;
//将初始距离设置为0
playersMoveX=0;
playersMoveY=0;
//如果玩家单击,则确定要单击的距离
if(MainGame.movement)
{
距离X=鼠标类.changeInX;
距离Y=鼠标类.changeInY;
moveMarker();
}
//防止被零除错误,并防止变量变为负值
如果(距离X<0)
距离x=0;
如果(距离<0)
距离y=0;
if(distanceX==0&&distanceY==0)
返回;
//设置玩家移动的速度(玩家每循环移动距离为moveFactor)
if(Player.sprint)
移动因子=2;
其他的
移动因子=1;
双求和距离=Math.sqrt(Math.pow(distanceX,2)+Math.pow(distanceY,2));
双deltaX=(移动因子*距离X/相距)*dT;
双三角=(移动因子*距离/相距)*dT;
//通过使用距离x与距离y的比率确定在x和y方向上移动的距离
if(MouseClass.mousePositionX>GUI.fullScreenWidth/2-1&&preventCollision(0、NPC、建筑物、对象))
{
PlayerMovex+=deltaX;
}
否则如果(防止碰撞(1、NPC、建筑物、物体))
{
playersMoveX-=deltaX;
}
if(MouseClass.mouseposition>GUI.fullScreenHeight/2+5&&preventCollision(2,NPC,建筑物,对象))
{
playersMoveY+=三角洲;
}
否则如果(防止碰撞(3,NPC,建筑物,物体))
{
playersMoveY-=三角洲;
}
//说明在与单击的距离内的移动
距离x-=deltaX;
距离-=三角洲;
如果(deltaX!=0 | | deltaY!=0)
isMoving=真;
然后,我从每个对象的x中减去playersMoveX,从每个对象的y中减去playersMoveY。 我试着调整物理计算的速度,当它只渲染60帧时,达到每秒80帧以上,没有变化

问题

当玩家移动时,物体会反弹。玩家在屏幕上居中,所以其他一切都与之相关。因为我使用的是双精度,所以我处理舍入的方法总是用Math.floor()进行舍入

我从每个对象的x中减去playersMoveX,从每个对象的y中减去playersMoveY

这似乎不是一个好的设计,很可能是您的问题的根源。查看
Graphics
类中的翻译方法(我假设这就是你用来绘制的),因为你真正想要的是翻译透视图,而不是所有可能的东西:

g.translate(playersMoveX, playerMoveY); // or some variation to center the player