Как создать игру с астероидами на Silverlight
ОГЛАВЛЕНИЕ
Для знакомства с Silverlight в статье создается маленькая игра с астероидами.
Подготовка
Для разработки игры сначала пришлось установить "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;
}