我正在为学校编写类似Snake的游戏。 问题是我没有在位置上使用2D阵列或其他东西, 相反,我的蛇是2D环境中的自由移动物体。例如像星露谷。
我的问题是: 我正在像蛇一样更新身体:
public void tick(float x, float y, char direction) {
counterx += Math.abs(xt - x);
countery += Math.abs(yt - y);
this.direction = direction;
if(counterx > Creature.DEFAULT_CREATURE_WIDTH) {
switch(this.direction) {
case DIRECTION_UP:
this.x = x;
this.y = y + Creature.DEFAULT_CREATURE_HEIGHT;
break;
case DIRECTION_DOWN:
this.x = x;
this.y = y - Creature.DEFAULT_CREATURE_HEIGHT;
break;
case DIRECTION_RIGHT:
this.x = x - Creature.DEFAULT_CREATURE_WIDTH;
this.y = y;
break;
case DIRECTION_LEFT:
this.x = x + Creature.DEFAULT_CREATURE_WIDTH;
this.y = y;
break;
}
counterx = 0;
} else if(countery > Creature.DEFAULT_CREATURE_HEIGHT) {
switch(this.direction) {
case DIRECTION_UP:
this.x = x;
this.y = y + Creature.DEFAULT_CREATURE_HEIGHT;
break;
case DIRECTION_DOWN:
this.x = x;
this.y = y - Creature.DEFAULT_CREATURE_HEIGHT;
break;
case DIRECTION_RIGHT:
this.x = x - Creature.DEFAULT_CREATURE_WIDTH;
this.y = y;
break;
case DIRECTION_LEFT:
this.x = x + Creature.DEFAULT_CREATURE_WIDTH;
this.y = y;
break;
}
countery = 0;
}
tDirection = this.direction;
next.tick(this.x, this.y, this.tDirection);
xt = this.x;
yt = this.y;
}
tick()方法经常被调用,而x和y的位置以及方向是从调用该方法的对象中给出的。用WASD控制的Snakehead第一次调用该方法,然后每个Snake部件都调用下一个。
Snake with early development graphics 每个SnakeTile都是32 x 32。
问题是身体立即改变了头部的方向,我不知道该如何改变。 我尝试使用计时器仅每隔几秒钟进行更新,依此类推。
现在(如代码中所示),我仅在行进1个Tile的方向计数时进行更新,现在当我仔细观察时,我可以看到Snake正在捕捉,但是它快得多,所以您只能看到如果您每次都能看到1帧,就可以看到它。
那么任何人都可以在概念上帮我吗?
那太好了,因为我没有进一步的了解...
问候
答案 0 :(得分:0)
您的主要问题是因为您的蛇的每个部位都在将头部方向传递到下一个部位。
要做到这一点,您的蛇身体部位必须记住其最后一招。这是最后一步,必须传递到下一部分。
您可以通过创建Body类来实现。
或者,只要您使用蛇来存储这些位置,就可以简单地使用列表。
关于另一个主题,您说:问题是我没有使用2D数组或该位置的东西,而是我的蛇是2D环境中的自由移动对象
事实上,这是完全一样的。只有“ 2d”阵列的宽度和高度与屏幕分辨率相同。您可以将屏幕视为2D阵列,并使用完全相同的方法或技术来解决问题。