在JAVA上将2D播放器位置A转换为B

在JAVA上将2D播放器位置A转换为B,java,2d,tile,Java,2d,Tile,我在尝试找出如何将我的玩家的位置翻译或“动画化”到新的互动程序时遇到问题,我正在做以下工作: if (input.right){ x += 1; 现在我在听key.inputs,然后是x++/x,或者y++/y,在我的播放器位置上,这让他一个像素一个像素地移动,但是我希望我的播放器只需点击一次键就可以准确地移动到下一个磁贴(32像素),就像是随着时间的推移从播放器的磁贴位置到下一个磁贴位置的线性过渡一样 类似(我认为是伪代码…) 我还是搞

我在尝试找出如何将我的玩家的位置翻译或“动画化”到新的互动程序时遇到问题,我正在做以下工作:

            if (input.right){
                x += 1;
现在我在听key.inputs,然后是x++/x,或者y++/y,在我的播放器位置上,这让他一个像素一个像素地移动,但是我希望我的播放器只需点击一次键就可以准确地移动到下一个磁贴(32像素),就像是随着时间的推移从播放器的磁贴位置到下一个磁贴位置的线性过渡一样

类似(我认为是伪代码…)

我还是搞不懂这种事情背后的逻辑

一个例子是名为胫骨的游戏中的动作。

现在我的一些代码(与玩家相关)


我要做的是在player类中声明两个int字段:

private float xToMove = 0;
private float yToMove = 0;
然后,在输入事件下:

if (input.down && yToMove == 0)  
    yToMove = -32;
if (input.up && yToMove == 0)    
    yToMove = 32;
if (input.left && xToMove == 0) 
    xToMove = -32;
if (input.right && xToMove == 0) 
    xToMove = 32;
最后,在玩家类的更新方法中:

public void update()
{
    if (xToMove > 0)
    {
        xToMove--;
        x++;
    }
    if (xToMove < 0)
    {
        xToMove++;
        x--;
    }
    if (yToMove > 0)
    {
        yToMove--;
        y++;
    }
    if (yToMove < 0)
    {
        yToMove++;
        y--;
    }
}
在某个地方,您应该计算每帧要移动的像素数。您可以创建一个calculateSpeed()方法,也可以直接将其放入构造函数或其他什么东西中。这取决于你是否想在比赛中改变速度

float speed = 32f / (fps * (period / 1000f));  //fps should be obtained dynamically and should be a float
然后,当您更新时,应执行以下操作:

if (xToMove > 0)
{
    xToMove -= speed;
    x += speed;
    if (xToMove <= 0)
    {
        //Set these guys to nice even numbers to prevent problems
        xToMove = 0;
        x = (float) Math.round(x);
    }
}

这里需要更多关于你如何实际表现(和绘画!)玩家和游戏循环的细节…嗯,让我尝试提供更多信息。相关信息仍然分散在(甚至不包含在)提供的代码中。粗略地说:您有一个平铺位置(似乎传递给了“renderMob”方法)。对于动画,需要在平铺中添加一个附加偏移。例如,可以通过
javax.swing.Timer
修改该偏移量,该计时器每20毫秒递增一次偏移量并触发重新绘制。(但是…你的画似乎是在一个数组中设置像素-这很不寻常,所以我不完全确定这是否适用于你的…)我最终得到了kindda的工作,但现在当我随机移动超过3次时,我开始得到奇怪的x和y值,比如=x=12.9375,而不是13。。。,当他不动的时候,有没有办法让我一直保持1,2,3型,比如(int)?或者像一个快速平铺的方法?在每一个移动结束时,只需使用“x=(float)Math.round(x);”将坐标舍入到最接近的整数。是的,这就是我认为使用该行时会做的,但仍然会得到非舍入的数字。。嗯。。也许是因为X和Y被32除了?你确定部分代码被达到了吗?很可能你使用了错误的比较(>=当你应该使用Yea时,舍入就达到了问题是我在代码中的某个地方对输出进行除法,当我直接输出X并对其进行舍入时,这是可以的,但是当我在游戏中显示它并渲染它时,它被除以32,然后错误出现了…,是的,你的代码正在工作,是不是在我的代码中实现它时出错了翻译
public void update()
{
    if (xToMove > 0)
    {
        xToMove--;
        x++;
    }
    if (xToMove < 0)
    {
        xToMove++;
        x--;
    }
    if (yToMove > 0)
    {
        yToMove--;
        y++;
    }
    if (yToMove < 0)
    {
        yToMove++;
        y--;
    }
}
float period = 1000; //The time one move takes in milliseconds
float speed = 32f / (fps * (period / 1000f));  //fps should be obtained dynamically and should be a float
if (xToMove > 0)
{
    xToMove -= speed;
    x += speed;
    if (xToMove <= 0)
    {
        //Set these guys to nice even numbers to prevent problems
        xToMove = 0;
        x = (float) Math.round(x);
    }
}
int frames   = 0;
int fps = 60;
requestFocus();
while(running){
    long xnow = System.nanoTime();
    delta += (xnow-xlastTime) / xns;
    xlastTime = xnow;
    while (delta >= 1) {
        update();
        delta--;
    }
    render();
    frames++;

    if (System.currentTimeMillis() - timer > 1000){
        timer += 1000;
        fps = frames;
        frame.setTitle(title + " | " + fps + " fps");
        frames = 0;
    }
}
stop();