蛇流畅的动作
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 个用于不同的转弯]。保持轮流队列。从头部画到第一圈。从第一回合到下一回合,直到你 运行 抽出蛇。当蛇的末端依次是瓦片时,从队列中移除该转瓦片。
我已经创建了我的第一个游戏 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 个用于不同的转弯]。保持轮流队列。从头部画到第一圈。从第一回合到下一回合,直到你 运行 抽出蛇。当蛇的末端依次是瓦片时,从队列中移除该转瓦片。