2013-05-03 2 views
0

У меня возникли проблемы с решением вопроса о том, как использовать массив для моей змеиной игры. У меня голова размером 20x20 пикселей в окне размера 400x400.Как перемещать объект через сетку

areaGrid = new Vector2[columns, rows]; 

for (int x = 0; x < columns; x++) 
{ 
    for (int y = 0; y < rows; y++) 
    { 
     areaGrid[x, y] = new Vector2(x * 20, y * 20); 
     Console.WriteLine("areaGrid[{0},{1}] = {2}", x, y, areaGrid[x, y]); 
    } 
} 

Так, естественно, будет 400 «блоков», которые могут занимать голова змеи плюс хвост. У меня голова, нарисованная в массиве в [5, 5], которая является сеткой 100, 100 на сетке. Я хочу, чтобы голова перемещалась на 20 пикселей за раз, что является новой точкой в ​​массиве. Итак, для примера, движение вправо поместило бы голову в [5, 6] в массив и на 120, 100 на сетке. Я просто не знаю, как это сделать. Как мне реализовать перемещение по массиву в моем методе обновления?

+0

[Здесь] (Http: //forum.chaos- project.com/index.php?topic=12210.0) реализована игра змей и имеет функции, которые могут вам понадобиться. – noobob

+0

Всегда полезно умножить скорость движения на прошедшее время. Итак, Position + = new Vector2 (x * Speed ​​* gameTime.ElapsedTime.TotalSeconds, y * Speed ​​* gameTIme.ElapsedTime.TotalSeconds); Например, это будет перемещать «20 пикселей в секунду», чтобы вы могли намного лучше контролировать столкновения. Особенно, если вы играете в Snake. – Deukalion

ответ

0

Используйте список с блоком координатам:

List<Vector2> Snake = new List() { {5,5}, {5,6}, {5,7}, {6,7}, {7,7} } 

и сделать его:

var transform = Matrix.CreateScale(20) * Matrix.CreateTranslation(offset); 
SpriteBatch.Begin(null,null,..., tranform); 
foreach (var pos in Snake) 
    SpriteBatch.Draw(white_1x1_texture, pos, null, SnakeColor); 
SpriteBatch.End(); 

или

SpriteBatch.Begin(); 
foreach (var pos in Snake) { 
    var box = new Rectangle(offset.X + pos.X * 20, offset.Y + pos.Y*20, 20,20); 
    SpriteBatch.Draw(white_1x1_texture, box, null, SnakeColor); 
} 
SpriteBatch.End(); 
Смежные вопросы