蛇流畅的动作

Snake smooth movement

我已经创建了我的第一个游戏 Snake,它运行得很好,但我想让蛇的动作更流畅,所以..

我创建了延迟为 250 毫秒的计时器:

timer = new Timer(250, this);
timer.start();

导入了两张 10x10 像素的图像:

 ImageIcon iid = new ImageIcon("dot.png");
 dot = iid.getImage();
 ImageIcon iih = new ImageIcon("head.png");
 head = iih.getImage();

初始化蛇body和头部坐标:

dots = 3;

        for (int z = 0; z < dots; z++) {
            x[z] = 50 - z * DOT_SIZE;
            y[z] = 50;
        }

其中x[]和y[]是蛇坐标数组(头是x[0]和[0]),点-蛇长度(包括body和头)和DOT_SIZE 是 const,值 == 10,因为头部和 body 图像是 10x10 像素。

然后我在框架上画蛇:

for (int z = 0; z < dots; z++) {
                if (z == 0) {
                    g.drawImage(head, x[z], y[z], this);
                } else {
                    g.drawImage(dot, x[z], y[z], this);
                }               
            }

然后每 250 毫秒我重新计算一次蛇坐标:

for (int z = dots; z > 0; z--) {
            x[z] = x[(z - 1)];
            y[z] = y[(z - 1)];
        }

        if (leftDirection) {
            x[0] -= DOT_SIZE;
        }

        if (rightDirection) {
            x[0] += DOT_SIZE;
        }

        if (upDirection) {
            y[0] -= DOT_SIZE;
        }

        if (downDirection) {
            y[0] += DOT_SIZE;
        }

左、右、上、下方向 - 是变量,在我按下按键后会发生变化并允许我控制蛇。在我用上面显示的代码重新绘制框架之后(在框架上绘制蛇)。

所以我的蛇每 250 毫秒以 10 个像素的步长移动。 我的主要想法是每 25 毫秒以 1 个像素的步长使蛇的运动平滑,但其他事情不应该改变。我的意思是,例如,我能够每 10 个像素将我的蛇转向另一个方向(这应该是因为图像分辨率为 10x10 像素)。我已经创建了重绘帧 10 次的计数器,然后调用其他方法(按键、在帧处设置苹果等)并插入 DOT_SIZE=1 以移动 snake smoothy。但是问题出现了,因为图像分辨率是 10x10 像素,所以我的图像在这段代码中开始相互重叠(1 像素的步长与 10x10 像素的图像分辨率):

for (int z = dots; z > 0; z--) {
            x[z] = x[(z - 1)];
            y[z] = y[(z - 1)];
        }

所以问题是:

在10x10像素的图像分辨率下,如何让蛇的移动以1个像素的步长平滑,并且能够每10个像素转向另一个方向?

我把蛇转向另一个方向后如何使拐角平滑?

为转弯段创建图块[使用一个并旋转它,或 4 个用于不同的转弯]。保持轮流队列。从头部画到第一圈。从第一回合到下一回合,直到你 运行 抽出蛇。当蛇的末端依次是瓦片时,从队列中移除该转瓦片。