Читать книгу Программирование для мобильных платформ. Windows Phone - Иван Трещев - Страница 3

Работа с XNA

Оглавление

Начальные теоретические сведения

Для разработки приложений и игр для платформы Windows Phone чаще всего используется язык программирования C#. Для написания основной логики используются:

////////////////////////////////////////////////////////////////////////////

if (условие1) // условие содержит логическое выражение

{

// Действия, которые надо выполнить, если условие1 выполняется

}

elseif (условие2) // Не обязательно

{

// Действия, которые надо выполнить, если условие1 не выполняется, но выполняется условие2

}

else// Не обязательно

{

// Действия, которые надо выполнить, если условия 1 и 2 не выполняются

}

////////////////////////////////////////////////////////////////////////////

switch (значение1)

{

case значение2:

// Действия, которые надо выполнить, если значения 1 и 2 равны

break;

case значение3:

// Действия, которые надо выполнить, если значения 1 и 3 равны

break;

<…>

}

////////////////////////////////////////////////////////////////////////////

тип [] mas1 = new тип [число элементов]; // Объявления одномерного массива

тип [,] mas2 = new тип [число строк, число столбцов]; // и двумерного массива

////////////////////////////////////////////////////////////////////////////

foreach (тип новая_переменная in mas1) // Цикл по всем элементам

{

// Действия для каждого объекта из mas1, где под объектом подразумевается новая_переменная

}

////////////////////////////////////////////////////////////////////////////

for (i = начальное_значение; i <= Конечное_значение; i++) // Цикл

{

// Тело цикла

}

////////////////////////////////////////////////////////////////////////////

While (условие) // Выполнять цикл пока условие = true

{

// Тело цикла

}

////////////////////////////////////////////////////////////////////////////

Random rand = new Random (); // Создает переменную rand для работы со случайными числами

// Присваивает переменной случайное значение от 0 до максимального значения:

имя_переменной = rand.Next (максимальное_значение);

//Присваивает переменной случайное значение от минимального значения до максимального значения:

имя_переменной = rand.Next (минимальное_значение, максимальное_значение);

////////////////////////////////////////////////////////////////////////////

Разработка игр с использованием XNA

В отличие от разработки приложений для Windows Phone, для создания игр целесообразно использовать набор инструментов XNA. При разработке игры на платформе Silverlight, что используется для создания приложений, может возникнуть трудность с отображением большого количества элементов на экране, а именно долгая отрисовка и как следствие подвисание самой игры, поэтому для создания игр для Windows Phone в SDK включена возможность использования XNA.

Окно создания проекта представлено на рисунке 1.


Рисунок 1 – Создание проекта игры для Windows Phone


Во вкладке «Обозреватель решений» показанны все файлы, включенные в проект, работать предстоит с файлом Game1.cs, в нем располагается основная логика игры (рис.2).


Рисунок 2 – Обозреватель решений


Background.png и PhoneGameThump.png являются иконками игры, которые отображаются в меню смартфона, их необходимо заменить на свои файлы с теми же названиями и размерами изображений.

В папке GameContent необходимо расположить весь контент игры: текстуры, звуки, шрифты и другое. Они помещаются в папку контента и добавляются в проект при нажатии правой копкой мыши в обозревателе решений по папке контента и выборе действия "Добавить существующий элемент" (рис 3):


Рисунок 3 – Добавление контента


Изначально файл Game1.cs содержит несколько стандартных и необходимых методов:

public Game1()

{

// Здесь указываются ориентация экрана, частота обновления,

// разрешение и сенсорные жесты, которые будут использованы в игре

}

protected override void LoadContent()

{

// Здесь загружается весь контент, необходимый в игре

}

protected override void Update(GameTime gameTime)

{

// Здесь располагается логика, выполняемая при обновлении экрана

base.Update(gameTime);

}

protected override void Draw(GameTime gameTime)

{

// Здесь производится отрисовка графического контента

base.Draw(gameTime);

}

Вывод текста и графики в XNA

Для того чтобы вывести текст на экран, необходимо добавить в папку с контектом файл с названием *.spritefont, где * – название шрифта, этот файл содержит следующие строки:


<?xml version="1.0" encoding="utf-8"?>

<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">

<Asset Type= " Graphics: FontDescription»>

<FontName>Segoe UI</FontName>

<Size>15</Size>

<Spacing>0</Spacing>

<UseKerning>true</UseKerning>

<Style>Bold</Style>

<CharacterRegions>

<CharacterRegion>

<Start> </Start>

<End>~</End>

</CharacterRegion>

<CharacterRegion>

<Start>А</Start>

<End>я</End>

</CharacterRegion>

</CharacterRegions>

</Asset>

</XnaContent>


FontName – в этих тегах заключено имя шрифта, Microsoft не рекомендует использовать какие-либо специфические шрифты, одни из рекомендуемых – шрифты Segoe разных разновидностей.

Size – определяет размер шрифта.

Style – определяет стиль шрифта (Regular, Bold, Italic).

CharacterRegion – определяет символы, которые можно использовать, в данном случае это русские и английские буквы, цифры и некоторые специальные символы.

После добавления этого файла в проект, его необходимо объявить в коде:

SpriteFont Название_переменной; // Создаем переменную в начале класса Game1

В методе LoadContent() прописываем следующее:

Название_переменной = Content.Load<SpriteFont>("*"); //где * – название файла

В методе Draw(GameTime gameTime) выводим текст на экран:

spriteBatch.DrawString(Название_переменной, "Текст, который необходимо вывести", new Vector2(координата_x, координата_y), Color.Цвет);

Вывод изображения аналогичен выводу текста:

Texture2D Название_переменной; // Создаем переменную в начале класса Game1

В методе LoadContent() прописываем следующее:

название_переменной = Content.Load<Texture2D>("*"); // где * – название файла

В методе Draw(GameTime gameTime) рисуем текстуру:

spriteBatch.Draw(название_переменной, new Rectangle(координата_x, координата_y, ширина, высота), Color.White);

Обработка нажатий

Нажатия на экран

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

В методе Game1() прописываются жесты, что могут быть использованные в игре:

public Game1()

{

<…>

TouchPanel.EnabledGestures = GestureType.Tap | GestureType.FreeDrag;

<…>

}

Все возможные жесты можно посмотреть в подсказке, всплывающей при вводе" GestureType". Наиболее часто используемые из них, это Tap – нажатие, FreeDrag – перетягивание, Hold – долгое нажатие, DoubleTap – двойное нажатие. Так же можно обработать и действия при отсутствии жестов.

В логике игры размещается следующее:

while (TouchPanel.IsGestureAvailable)

{

// Считывание жеста

GestureSample gesture = TouchPanel.ReadGesture();

// Координаты касания и другие необходимые параметры

int tapY = (int)gesture.Position.Y;

int tapX = (int)gesture.Position.X;

<…>

switch (gesture.GestureType)

{

// Если жест является нажатием:

case GestureType.Tap:

<…>

break;

<…>

// Если жест является перетягиванием:

case GestureType.FreeDrag:

<…>

break;

}

}

Нажатия на аппаратные кнопки

Обработка нажатий на аппаратные кнопки тоже важна, однако в приложении запрещено использовать их для нестандартных функций (например, аппаратную кнопку назад для установления паузы).

Одним из требований к приложениям и играм является то, что необходимо программировать действия для аппаратной кнопки назад таким образом, что после нажатия на нее показывается предыдущий модуль игры (не относится к игровым уровням), пример:

Меню – Список уровней – Уровень 1 – Уровень 2

Из любого уровня переход назад осуществляется в Список уровней, даже если новый уровень запускался после предыдущего, из Списка уровней соответственно в Меню, из Меню же происходит выход из приложения:

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

Программирование для мобильных платформ. Windows Phone

Подняться наверх