Snake片段在蛇游戏中跟随头部

时间:2012-03-28 23:07:27

标签: actionscript-3 actionscript

我正在尝试写一个蛇游戏。它非常简单,有一系列蛇形片段,它们都是Sprites,它们都有xy值。在每个游戏循环中,我想根据用户输入更新蛇段。

注意:蛇的头部定义为this.segments[0]。 segment数组的第一个元素是head。

根据用户输入更新蛇头,然后在头更新之后让每个蛇段跟随它,这对我来说似乎合乎逻辑。到目前为止,这是我的代码:

public function update()
{
    // Update snake head
    this.segments[0].x += 10;

    for (var i:Number = 1; i < this.segments.length; i++)
    {
        // Set the segments position to be the same as the one before it
        this.segments[i].x = this.segments[i - 1].x;
        this.segments[i].y = this.segments[i - 1].y;
    }
}

希望你能看到你在这里做的事情。我正在尝试将x和y值设置为与之前的值相同,因此它将“跟随”。

问题是,当我运行这段代码时,每个蛇段都堆积在同一坐标的顶部,它看起来就像一个段跑来跑去。他们没有跟随,他们彼此重叠。

对我来说,逻辑看起来很稳固,所以给出了什么?

4 个答案:

答案 0 :(得分:1)

你很亲密。您需要在计算中包含每个段的长度。试试这样的事情

for (var i:Number = 1; i < this.segments.length; i++)
{
    // Set the segments position to be the same as the one before it
    //include the width or height of n-1 depending on how you're moving segments[0]
    this.segments[i].x = this.segments[i - 1].x + this.segmants[i-1].width;
    this.segments[i].y = this.segments[i - 1].y + this.segments[i-1].height;
}

答案 1 :(得分:1)

嗯...

反转你的循环(最后一段转到第一段)。

最后做好准备。


基本上,段i正在抓取已更新的i-1位置。

答案 2 :(得分:1)

您的第一项是右侧 this.segments [0]

然后您决定更新以下段(从1开始)并将其设置为头部位置。所以 this.segments [1] 将与 this.segments [0] 相同。因为它是一个循环,所以每个段都将被设置为头部的位置,这就是为什么每个段都堆积在蛇的顶部。所以你应该从尾巴的末端到头部,以避免这种情况。

答案 3 :(得分:1)

我不是数学专家,但我发现这对于一些运动来说非常有趣!

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

var segments:Array = [];

for ( var i = 0; i < 10; i++ ){

    var circle:Sprite = new Sprite();
    circle.graphics.beginFill( 0x00ADEF, 1 );
    circle.graphics.drawCircle( 0,0, 10 );
    circle.graphics.endFill();

    segments.push( circle );
    addChild(circle);
}

stage.addEventListener( Event.ENTER_FRAME, update );
stage.addEventListener( MouseEvent.MOUSE_MOVE, onMove );

function onMove( e:MouseEvent ):void
{
    this.segments[0].x = mouseX;
    this.segments[0].y = mouseY;
}

function update( e:Event ):void
{

    for (var i:Number = 1; i < this.segments.length; i++)
    {
        // Set the segments position to be the same as the one before it
        this.segments[i].x += ( this.segments[i - 1].x - this.segments[i].x ) / 2;
        this.segments[i].y += ( ( this.segments[i - 1].y - this.segments[i].y ) / 2     ) + this.segments[i - 1].height / 2;
    }

}