Читать книгу Программирование для мобильных платформ. 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)