• Microsoft .NET
  • WPF и Silverlight
  • Silverlight 2.0 – как использовать связывание для динамического изменения цвета фона отдельного ряда DataGrid

Как создать игру с астероидами на Silverlight

ОГЛАВЛЕНИЕ

Для знакомства с Silverlight в статье создается маленькая игра с астероидами.

•    Скачать исходники - 2.34 Мб

Подготовка

Для разработки игры сначала пришлось установить "Microsoft Silverlight Tools Alpha для Visual Studio 2008".
Хорошо, что игру на Silverlight можно было разработать полностью в Visual Studio. Не пришлось тратить время на освоение Expression Blend или любых других, предназначенных для мастеров, инструментов Silverlight.

Использование кода

Для разработки игры использовалась базовая стратегия основного цикла, в котором перерисовываются спрайты на основе нескольких переменных. Для достижения этого был создан DispatcherTimer, вызывающий процедуру рисования в коде с предопределенным интервалом. Процедура рисования проходит в цикле по всем объектам на холсте и обновляет их положения. Например, когда астероид появляется на экране, ему уже назначен случайный угол, скорость и координаты X, Y. Когда таймер срабатывает, значения X, Y астероида пересчитываются с использованием простых математических формул. Ниже приведен пример:

public Page() {
    InitializeComponent();

    //создать таймер, используемый как основной цикл

    _mainLoop.Stop();
    _mainLoop.Interval = TimeSpan.Zero;

    //подключить события
    _mainLoop.Tick += new EventHandler(mainLoop_Tick);

    StartGame();
}

Во фрагменте кода выше есть закрытая переменная по имени _mainLoop. _mainLoop является стандартным объектом таймера .NET. Он имеет методы Start() и Stop() и событие по имени Tick. Для перерисовки объектов на экране обработчик события подключается к событию Tick.

Чтобы игра работала, пришлось разработать код для перерисовки астероидов, звезд и редкого НЛО. Также надо перерисовывать корабль и его снаряды. Для упрощения каждая категория объектов хранится в отдельном списке объектов. Были созданы отдельные методы вроде DrawAsteroids, проходящего по списку объектов астероидов и обновляющего их положения.

Метод DrawAsteroids показан ниже. Он проходит по списку объектов в цикле и вызывает метод MoveForward класса Asteroid. Также в цикле проверяется, ушел ли астероид с экрана. Если астероид ушел с экрана, то изменяется координата X или Y, чтобы астероид вновь появился на строго противоположной стороне экрана. Так работает оригинальная игра с астероидами.

void DrawAsteriods() {
   for(int i = _asteroids.Count - 1; i >= 0; i--) {
     Asteroid a = _asteroids[i];
     a.MoveForward();
     if(a.X >= (this.Width - a.Width))
       a.X = 1;
     else if(a.X <= 0)
       a.X = this.Width - a.Width;
     if(a.Y >= (this.Height - a.Height))
       a.Y = 1;
     else if(a.Y <= 0)
       a.Y = this.Height - a.Height;
   }
}

Метод MoveForward астероида очень простой. Он заставляет вспомнить школьную математику! На первом шаге градусы переводятся в радианы. Затем обновляется координата X с помощью метода Sin, принимающего значение радиан в качестве входного параметра. Затем результат умножается на коэффициент скорости. Координата Y вычисляется так же, исключая использование метода Cos.

public void MoveForward()
{
   double radians = Math.PI * _angle / 180.0;
   X += Math.Sin(radians) * SPEED;
   Y -= Math.Cos(radians) * SPEED;
}