我正在尝试写一个蛇游戏。它非常简单,有一系列蛇形片段,它们都是Sprites,它们都有x
和y
值。在每个游戏循环中,我想根据用户输入更新蛇段。
注意:蛇的头部定义为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值设置为与之前的值相同,因此它将“跟随”。
问题是,当我运行这段代码时,每个蛇段都堆积在同一坐标的顶部,它看起来就像一个段跑来跑去。他们没有跟随,他们彼此重叠。
对我来说,逻辑看起来很稳固,所以给出了什么?
答案 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;
}
}