1

Тема: Создание казуальной игры на Silverlight - Часть 1

Создание казуальной игры на Silverlight - Часть 1

1.    Начинаем работать – Архитектрура/Каркас
2.    Перемещения и обнаружение столкновений
3.    Дизайн – спрайты, полотна и диалоги
4.    Анимация и звук
5.    Инициализация и развертывание
6.    Продвинутые концепции (физика, многопользовательский режим, оптимизация).

В этой серии статей мы рассмотрим процесс проектирования и создания казуальной онлайн игрушки в Silverlight 2(SL2). Не удивительно, что популярность онлайн игр продолжает расти. То, что мы все больше времени проводим в Интернет и нашу любовь к интерактивным развлечениям, делают казуальные игры отличным средством для снятия напряжения. Обычным выбором для создания казуальных игр был и пока остается Adobe Flash. Но в свзязи с готовящемся к выходу RTM релизу SL2, сейчас очень удачный момент, чтобы начать использовать Silverlight для создания новых игр.

Эта серия будет предназначаться главным образом для разработчиков интерактивных приложений. Мы создадим собственный вариант классической игрушки 1980 года, которая называлась «Диверсия». Если у вас есть iPod, тогда вы, возможно, играли в версию от Apple, которая называется «Парашют», где нужно сбивать парашютистов до того как они приземлятся, доберутся до вашего бункера и разрушат его. За прошедшие годы мы увидели множество модификаций этой классики: рисунок 1  демонстрирует некоторые из имеющихся вариантов этой игры.

games
рис. 1 - существующие вариации игры

Thumbs up Thumbs down

2

Re: Создание казуальной игры на Silverlight - Часть 1

Часть 1:  Начинаем работать – Архитектура / Каркас

В этой первой части мы осмыслим нашу игру, и построим архитектурный каркас, который послужит нашему проекту фундаментом. Весь наш год будем писать на Microsoft.NET C#, и будем использовать следующие инструменты и фреймворки:

•    Visual Studio 2008
•    Silverlight 2 Beta 2 SDK and Tools for VS2008
•    Microsoft.Net Framework 3.5
•    Microsoft Expression Blend 2.5 June 2008 Preview
•    Microsoft Expression Design 2


Общее представление
Эта игрушка с очень простыми правилами: нужно заработать как можно больше очков, сбивая парашютистов и вертолеты к моменту, когда враг уничтожит ваш бункер.

Требования
1.    Игрок  должен прицеливать орудие при помощи мыши. По правому клику орудие должно выстреливать снарядом.
2.    Расстояние между перекрестием прицела и орудием будет определять начальную скорость снаряда.
3.    Скорость снаряда будет уменьшаться по мере прохождения определенной длины пути.
4.    Попадание по парашюту заставит парашютиста падать.
5.    Попадание в парашютиста уничтожит врага.
6.    Попадание в вертолет уничтожит его. Осколки вертолета могу попасть и убить других парашютистов.
7.    За любой уничтоженный объект игрок получает 2 очка. Каждый выстрел отнимает 1 очко из числа заработанных.


Каркас (Framework)
Прошлой осенью Microsoft выпустила свою первую версию каркаса «Модель-Представление-Контроллер» (Model-View-Controller - MVC) для ASP.NET. Это было сделано, чтобы помочь разработчикам реализовывать этот зарекомендовавший себя паттерн, который позволяет разделить реализацию приложения на три компонента: модель, представление, и контроллер. Такой паттерн упрощает для разработчиков задачу в отделении и изолировании визуального представление приложения от его функциональной части.

В разработке на Silverlight паттерн MVC послужит хорошим средством для распределения ролей отдельных инструментов. Так логика приложения реализуется в Visual Studio программистами, а дизайнеры и аниматоры используют Expression Blend. Использование паттерна MVC при создании игры обеспечит основу для независимой работы программистов и дизайнеров: программисты  будут отвечать за состояния (расположение, передвижение и столкновение объектов), в то время как дизайнеры будут иметь полный контроль над визуализацией элементов игры. Рисунок 2 иллюстрирует взаимосвязь между каждым компонентами паттерна MVC. Непрерывные линии означают прямые связи, а пунктирные линии – косвенные связи.

MVC
рис. 2 - связи компонентов MVC

Thumbs up Thumbs down

3

Re: Создание казуальной игры на Silverlight - Часть 1

MVC в Silverlight 2

Виды
Все визуальные элементы нашей игры относятся к компоненту Вид, который включает внешнее оформление, диалоги, сцены заставки и концовки игры, и такие элементы, как парашютисты, вертолеты, орудие и снаряды.

Модель
Для правильного MVC разделения мы должны сделать нашу модель абсолютно независимой от вида и контроллера. Модель не должна содержать экземпляры двух других компонент паттерна. При проектировании модели можно применять две стратегии:

    Пассивная модель – в такой реализации вид получает уведомление об изменениях от контроллера только тогда, когда контроллер узнал об изменениях в соответствующей модели.

    Активная модель – в этой реализации модель уведомляет о своих изменениях соответствующий вид, используя паттерн обозреватель. Простейшая реализация паттерна обозреватель на .NET заключается в использовании делегатов и событий. Для разработки игр подобная техника вполне подходит: вид подписывается на события, которые возбуждаются моделью при каких-либо изменениях в состоянии (новое положение или столкновение).

Контроллер
Последний компонент паттерна –контроллер. Мы будем использовать один контроллер, который будет служить в качестве центральной нервной системы игры. Контроллер будет ответственен за обслуживание основного цикла игры используемый для перемещения спрайтов и отслеживания коллизий.  Рисунки 3 и 4 демонстрируют, как происходит создание контроллер и его инициализация из нашего page.xaml.

Когда контроллер создан, мы можем вызвать его метод Initialize(), чтобы задать компоненту все дополнительные параметры. В рамках метода  Initialize() мы установим таймер и загрузим наш стартовый диалог.  Было много споров по поводу того, что целесообразнее использовать: контролирующий таймер(DispatcherTimer) или раскадровку(Storyboard), и был сделан довольно неожиданный выбор в пользу Storyboard с короткими задержками. Storyboard будет тикать более эффективно и равномерно.

public partial class Page : UserControl
{
  private Controllers.Controller _controller;
  public Page()
  {
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(Page_Loaded);
  }
  void Page_Loaded(object sender, RoutedEventArgs e)
  {
    _controller = new Controllers.Controller(this);
    _controller.Initialize();
  }
}

рис. 3 – код из page.xaml.cs

 
public Controller(Page pageView)
{
  _pageView = pageView;
  _shellView = new Game.Views.Shell(new Models.Shell());
  _pageView.LayoutRoot.Children.Add(_shellView);      
}
private Storyboard _sbTick = new Storyboard();
public void Initialize()
{
  //setup my game timer
  _sbTick.Duration = TimeSpan.FromMilliseconds(10);
  _sbTick.Completed += new EventHandler(_sbTick_Completed);
  //place the start dialog into the shell
  _startView = new Views.Start();
 //attach to the start event of the view
 _startView.Begin += new
     Game.Views.Start.BeginHandler(_startView_Begin);
 //add the view to the shell
 _shellView.LayoutRoot.Children.Add(_startView);
}

рис. 4 – инициализация контроллера

Запуск Игры
Теперь, когда мы уже знаем, как и что должно работать, давайте-ка взглянем на то, как наш вид взаимодействует с контроллером. При первой загрузке игры пользователь увидит начальный вид, который представлен нашим Start.xaml. Этот Вид содержит некоторый инструктаж и кнопку запуска игры. Рисунок 4 иллюстрирует то, как мы добавляем этот вид в наше окружение(shell), и добавляем обработчик кнопки «начать игру».

Заглядывая вперед: в 5-ой части мы покажем, как создать загрузочный проект, который будет загружаться вперед игры, и асинхронно загружать более тяжелую сборку игры.

Когда пользователь нажимает кнопку «Старт», наш контроллер подготавливает игру – он подключает обработчики событий мыши к окружению(shell). Мы будем использовать мышь для контроля направления и начальной скорости выстрела снаряда из нашего орудия. Когда курсор находится в приделах нашего окружения, мы начинаем отслеживать угол, образованный орудием и курсором. Левый клик мыши производит выстрел снаряда в соответствии с полученным направлением. Для того, чтобы видеть куда мы прицеливаемся, мы заменим стандартный указатель мыши картинкой в виде перекрестия. Скорость выстрела будет вычисляться исходя из расстояния между перекрестием курсора и стволом орудия. В части 2 мы покажем, как отслеживать подобное движение и вычислять угол траектории. На рисунке 7 представлен код, используемый для отслеживания и реагирования на движение мыши. Продолжая разработку, мы расширим наш метод StartGame(), чтобы он размещал игрока, запускал цикл игры, а также инициировал активность вертолетов.

public void StartGame()
{
 ....
  _shellView.MouseEnter += new MouseEventHandler(_shellView_MouseEnter);
  _shellView.MouseLeave += new MouseEventHandler(_shellView_MouseLeave);
  _shellView.MouseMove += new MouseEventHandler(_shellView_MouseMove);
  _shellView.MouseLeftButtonDown +=
      new MouseButtonEventHandler(_shellView_MouseLeftButtonDown);
  //add the crosshair
  Crosshair cross = new Crosshair(new Vector(0.0, 0.0));
  _crosshair = new Game.Views.Crosshair(cross);
  _shellView.Container.Children.Add(_crosshair);
  .... 
 }
void _shellView_MouseMove(object sender, MouseEventArgs e)
{
  Point m = e.GetPosition(_shellView.Container);
  _crosshair.Model.Move(_shellView.Container, m);
  _player.Model.ChangeAngle(m);
}
void _shellView_MouseLeave(object sender, MouseEventArgs e)
{
  _shellView.CaptureMouse();
}
void _shellView_MouseEnter(object sender, MouseEventArgs e)
{
  _shellView.CaptureMouse();
}
void _shellView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  . . . .
}

рис. 8 - отслеживание движения мыши

Теперь, когда у нас есть необходимый каркас самое время начать создавать элементы нашей игры! В следующей статье мы сосредоточимся на перемещениях и определимся с тем, как заставить наших парашютистов спускаться, вертолеты летать, а орудия стрелять. Приготовьтесь вкусить немного тригонометрии и элементарной физики. Ничего сложного, ровно столько, сколько необходимо, чтобы движения и столкновения в нашей игрушке казались реалистичными, и чтобы в нее было приятно играть.

Чтобы скачать готовые исходники или оставить комментарий, посетите мой блог:
http://joel.neubeck.net/2008/09/casual- … ewsletter/
Благодарю за внимание и до скорых встреч.

(прямая ссылка на исходиники)

(оригинал статьи: Module 1: Getting Started – Architecture/framework)

Thumbs up Thumbs down

4

Re: Создание казуальной игры на Silverlight - Часть 1

В коде к данной серии статей есть явные нарушения стратегии MVC. Это не критично, но может вызвать путаницу у начинающих. Для успокоения и восстановления порядка в мыслях рекомендую почитать статью на эту тему: http://www.rsdn.ru/article/patterns/mod … senter.xml

Thumbs up Thumbs down