Java2D自上而下游戏中的流畅移动
我相信其他人也有同样的问题,但在大量的谷歌搜索之后,我找不到任何完全相关的东西 我正在使用Java2D制作一个2D自上而下的游戏。我有单独的渲染和物理线程。 移动基于鼠标,计算采用以下形式: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
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