我怎样才能使蛇的尾巴跟随头部?


10

完成任务后,通过构建一个小的Snake克隆才开始使用libGDX,我遇到了一个问题,我可能会在一段时间内感到羞愧。

我目前有一个蛇头(在这个阶段是一个简单的矩形)在游戏画布上移动。构造蛇的其余部分最直接的方法是让头部拥有一个SnakeElements的Java Collections LinkedList,它会根据玩家的操作来增加/减小大小。

让这个SnakeElements列表紧随其后,但是事实证明这并非易事。

当前执行此操作的函数如下,并且每当头部更新其位置时都会调用该函数:

private void moveTail (float x, float y, int direction) {
    float tmpx, tmpy;
    int tmpdirection;
    int offset_x, offset_y;

    for (SnakeSegment snse : tail) {
        offset_x = 0;
        offset_y = 0;

        tmpx = snse.getX();
        tmpy = snse.getY();
        tmpdirection = snse.getDirection();

        switch(direction) {
            case 0:
                offset_x = 0;
                offset_y = -(2 + snse.width);
                break;
            case 1:
                offset_x = -(2 + snse.width);
                offset_y = 0;
                break;
            case 2:
                offset_x = 0;
                offset_y = (2 + snse.width);
                break;
            case 3:
                offset_x = (2 + snse.width);
                offset_y = 0;
                break;
            default:
                System.out.println("wrong direction");
        }

        snse.setX(x + offset_x);
        snse.setY(y + offset_y);
        snse.setDirection(direction);

        x = tmpx;
        y = tmpy;
        direction = tmpdirection;
    }
}

不幸的是,导致这种现象:

gif

任何有关如何使蛇尾正常工作的技巧将不胜感激:)

Answers:


18

想到这样的问题:
蛇在原始游戏中如何移动?
蛇朝其当前方向移动。行为看起来像是头什么都没有出现,而最后的尾部消失了。

您可以具有蛇形零件列表。您想要做的是删除列表中代表最后尾部的最后一项。
然后,您要创建一个新的头部,将其放置在该头部并将其放置在列表的第一个位置。
这意味着蛇的其余部分不会移动,因为您只能更改第一个和最后一个位置。
这会产生蛇状的行为。


哇,谢谢!这很有道理,应该是从一开始就提出的想法,看来我会进行一些有趣的重构:)很抱歉,我的可怜因果报应阻止了我对您的支持。我保证以后会回来的!
基利安

1
考虑它的另一种方法是,每个蛇元素仅跟随其前面的元素,而不是跟随头部。如果以后蛇有纹理或类似的东西,这将很有用。
内森·里德

2
顺便说一下,这是当前版本,再次感谢:) i.imgur.com/IaT5PNH.gif
Kilian

1

我所看到的是像“毛毛虫”一样的系统,其中蛇的每个部分都跟着前面的部分。

换句话说,蛇的每个部分都将是一个具有位置(x,y)的对象,它将用于移动它的前面部分的引用,并且是一个处理该部分前面的位置的函数,并且相应地移动。主蛇(Head)应具有蛇的每个部分的引用,并会调用负责使该部分遵循其前身的功能,即Head是第一部分的前身。
希望能帮助到你!


这是个主意,但是处理弯角却非常复杂。如果玩家将急转弯180度会发生什么情况?我们不确定如何正确处理此问题,并且使用Pontus Magnusson描述的方法可以很好地解决所有这些问题。
基利安

我知道了。唯一一次实施毛毛虫系统时,我有一个网格,网格上的零件大小与单元相同,因此每个零件始终位于一个特定的单元内,这样就不会出现问题。对不起,我的英语不好。
Lince Assassino 2014年

嗯,是的,这很有意义,也应该可行,但是由于我目前不记得的原因,我们放弃了使用网格的想法;)谢谢:)
Kilian 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.