2012-03-28 34 views
2

我正在嘗試寫一個蛇遊戲。這非常簡單,有一系列蛇形分段,它們都是精靈,它們都有xy的值。在每個遊戲循環中,我想根據用戶輸入更新蛇段。蛇段在蛇遊戲中跟隨頭部

注意:蛇的頭部被定義爲this.segments[0]。段數組的第一個元素是頭部。

對我來說,根據用戶輸入更新蛇頭似乎是合乎邏輯的,然後在頭更新之後將每個蛇段跟隨它。這是我的代碼到目前爲止:

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的值與它之前的值相同,因此它會「跟隨」。

問題是,當我運行這段代碼時,每個蛇段都堆積在同一個座標的頂部,看起來像是一個運行的段。他們不遵循,他們在彼此的頂部。

對我來說,邏輯看起來很穩固,所以給了什麼?

回答

1

嗯......

反向你的循環(做最後一段將第一)。

並做最後一個。


基本上,segment i抓住已經更新的i-1的位置。

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

您的第一項是正確的頭this.segments [0]

然後你決定要更新以下段(從1開始),並把它設置爲頭部的位置。所以this.segments [1]將與相同this.segments [0]。由於它是一個循環,所以每個片段都將被設置爲頭部的位置,這就是爲什麼每個片段都堆在蛇的頂部。所以你應該從尾巴到頭部來避免這種情況。

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; 
    } 

} 
+0

旁註:任何人都知道如何添加一些角度,這取決於你的矢量加速度x,y? – Adrian 2012-03-28 23:45:27