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

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

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

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

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

{

if (Mode == GameMode.Menu)

{

this. Exit ();

}

else if (Mode == GameMode.Levels)

{

Mode = GameMode.Menu;

}

else if (Mode == GameMode.Level_1)

{

Mode = GameMode. Levels;

}

else if (Mode == GameMode.Level_2)

{

Mode = GameMode.Levels;

}

}

Создание игровых модулей рассмотрено в соответсвующем разделе.

Работа с таймером

Некоторые игры требуют работу со временем и выводом некоторого таймера на экран. Пример:

Необходимые переменные:

// Время игры, промежуточное время

int time, tempTime;

// Время в представлении ЧЧ:ММ:СС

string timeString;

В методе Update(GameTime gameTime) указываем:

if (tempTime < (int)gameTime.TotalGameTime.TotalSeconds)

{

time++;

}

// Приведение времени в формат ЧЧ:ММ:СС

GetTime(time);

tempTime = (int)gameTime.TotalGameTime.TotalSeconds;

Создаем метод GetTime(int timeTemp):

public void GetTime(int timeTemp)

{

if (timeTemp/ 3600 < 10)

{

timeString = "0" + (timeTemp/ 3600).ToString() + ":";

}

else if (timeTemp/ 3600 >= 10)

{

timeString = (timeTemp/ 3600).ToString() + ":";

}

else if (timeTemp/ 3600 < 1)

{

timeString = "00:";

}

if ((timeTemp% 3600) / 60 < 10)

{

timeString = timeString + "0" + ((timeTemp% 3600) / 60).ToString() + ":";

}

else if ((timeTemp% 3600) / 60 >= 10)

{

timeString = timeString + ((timeTemp% 3600) / 60).ToString() + ":";

}

else if ((timeTemp% 3600) / 60 < 1)

{

timeString = timeString + "00:";

}

if ((timeTemp% 3600) % 60 < 10)

{

timeString = timeString + "0" + ((timeTemp% 3600) % 60).ToString();

}

else if ((timeTemp% 3600) % 60 >= 10)

{

timeString = timeString + ((timeTemp% 3600) % 60).ToString ();

}

else if ((timeTemp% 3600) % 60 < 1)

{

timeString = timeString + "00";

}

}

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

spriteBatch. DrawString (Шрифт, timeString, new Vector2 (координата_x, координата_y), Color. Цвет);

Пример создания игры

Для примера рассмотрим создание игры судоку. Из контента использованы только текстуры (рис 4 – 9):


Рисунок 4 – 0.png, 1.png, 2.png, 3.png, 4.png, 5.png, 6.png, 7.png, 8.png, 9.png и d.png соответственно


Рисунок 5 – error.png и s.png соответственно, полупрозрачные (здесь обведены в рамку, чтобы из можно было увидеть)


Рисунок 6 – MenuRecord.png


Рисунок 7 – GameField.png


Рисунок 8 – MenuUpdate.png


Рисунок 9 – Контент в составе проекта


Для генерации игрового поля была использована следующая последовательность действий:

Первая строка заполняется случайными неповторяющимися числами от 1 до 9. Далее для каждой следующей строки происходит особая перестановка элементов из первой строки такая, что судоку имеет решение и является верным. Затем в каждом блоке из трех строк (1—3, 4—6, 7—9) происходит случайная перестановка двух строк, если программа выбрала одинаковую строку, то перестановка не происходит, тоже самое делается и с столбцами. Далее переставляем местами 2 случайных блока по горизонтали и по вертикали, по тому же принципу как и строки со столбцами. Затем удаляются лишние клетки. В итоге получается уникальное судоку.