Сегменты змеи, чтобы следовать за головой в игре змеи - PullRequest
2 голосов
/ 29 марта 2012

Я пытаюсь написать игру со змеями.Это довольно просто, есть массив сегментов змей, которые являются спрайтами, и все они имеют значения x и y.В каждом игровом цикле я хочу обновлять сегменты змеи на основе пользовательского ввода.

Примечание: голова змеи определяется как 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 такими же, как у предыдущего, поэтому он будет «следовать».

Проблема в том, что когда я запускаю этот код, каждый сегмент змеи накапливается сверхуодной и той же координаты, и это выглядит как бегающий сегмент.Они не следуют, они группируются друг на друга.

Для меня логика выглядит солидной, так что же дает?

Ответы [ 4 ]

1 голос
/ 29 марта 2012

Я не математик, но я нашел это довольно забавным для некоторого движения!

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

}
1 голос
/ 29 марта 2012

Ну ...

Обратный цикл (последний сегмент идет первым).

И последний цикл.


В основном, сегмент iзахватывает местоположение i-1, которое уже обновлено.

1 голос
/ 29 марта 2012

Ваш первый предмет - голова справа this.segments [0]

Затем вы решаете обновить следующий сегмент (начинается с 1) и устанавливаете его в положение головы. Так что this.segments [1] будет таким же, как this.segments [0] . Поскольку это петля, каждый сегмент будет установлен в положение головы, поэтому каждый сегмент накапливается на вершине змеи. Так что, чтобы избежать этого, вам следует отскочить от конца хвоста к голове.

1 голос
/ 29 марта 2012

Ты рядом. Вы должны включить длину каждого сегмента в ваш расчет. Попробуйте что-то вроде этого

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...