
- •Содержание
- •Введение
- •1 Исследование и анализ предметной области
- •Исследование предметной области
- •Обзор существующих аналогичных программных систем
- •Актуальность разрабатываемой программы
- •Требования к программному продукту
- •2 Проектирование программного продукта
- •Диаграмма вариантов использования
- •2.2 Диаграмма классов
- •2.3 Диаграмма сценариев
- •3 Программная реализация3.1 Реализация основных функций
- •Заключение Список использованной литературы
Требования к программному продукту
Необходимо разработать данный программный продукт на языке программирования C#,реализовать классы, которые будут выполнять следующие функции, используя возможности объектно-ориентированного программирования, также оформление экрана и меню :
интро-ролик;
графический интерфейс меню;
часть графического интерфейса в игре;
2 Проектирование программного продукта
Диаграмма вариантов использования
Диаграммы вариантов использования описывают взаимоотношения и зависимости между группами вариантов использования и действующих лиц, участвующими в процессе.
Диаграммы вариантов использования предназначены для упрощения взаимодействия с будущими пользователями системы, с клиентами, и особенно пригодятся для определения необходимых характеристик системы. Другими словами, диаграммы вариантов использования говорят о том, что система должна делать, не указывая сами применяемые методы.
Рисунок 2.1 – Диаграмма вариантов использования
Таблица 2.2 –Описание актеров диаграммы вариантов использования
Актер |
Краткое описание |
Игрок |
Игрок |
Система |
Система управления игрой |
Таблица 2.2 –Описание прецедентов диаграммы вариантов использования
Прецедент |
Краткое описание |
Выполнение действий |
Запускается игроком. Позволяет выполнять действия в игровом мире. |
Обмен данными. |
Производит обмен данными между игроком и системой. |
Отрисовка мира |
Запускается системой. Позволяет отрисовывать игровой мир. |
Управление камерой |
Запускается системой. Позволяет управлять камерой. |
Обработка столкновений |
Запускается системой. Обрабатывает столкновения. |
Обработка данных. |
Позволяет обрабатывать данные. |
Вывод на экран. |
Преобразовывает обработанные данные в графическую информацию и выводит на экран. |
Вывод звука. |
Позволяет выводить звук. |
Управление искусственным интеллектом |
Управляет искусственным интеллектом. |
2.2 Диаграмма классов
2.3 Диаграмма сценариев
3 Программная реализация3.1 Реализация основных функций
Для создания интро-ролика игры, нужно было создать его покадрово после чего объединить в одно изображение для проигрывания его классом SpriteManadger. На рисунках 3.1-3.3 наглядно это продемонстрировано.
Рисунок 3.1– Первый отрезок интро-видео.
Рисунок 3.2– Второй отрезок интро-видео.
Рисунок 3.3– Третий отрезок интро-видео.
После интро-видео следует меню фон которого создавался таким же образом. Рисунок 3.4.
Рисунок 3.4–Фон игрового меню.
Для того чтобы в меню появились кнопки необходимо было реализовать программный код который берет из класса Button лист кнопок которые будут отображаться поверх фонового изображения меню.
namespace Speedrun
{
class Menu
{
List<Button> buttons;
public Scroll Scroll;
AnimatedSprite back;
public AnimatedSprite gearLeft, gearRight;
public bool OnButton { get; set; }
bool enabled;
public Menu(Button[] buttons, Scroll scr, AnimatedSprite back, AnimatedSprite gearLeft, AnimatedSprite gearRight)
{
this.back = back;
this.buttons = new List<Button>();
this.Scroll = scr;
this.gearLeft = gearLeft;
this.gearRight = gearRight;
for (int i = 0; i < buttons.Length; i++)
{
this.buttons.Add(buttons[i]);
this.buttons[i].menu = this;
}
OnClick.menu = this;
enabled = true;
Enabled = false;
}
public Button this[string name]
{
get
{
for (int i = 0; i < buttons.Count; i++)
{
if (buttons[i].name == name)
return buttons[i];
}
return null;
}
}
public void Update(TimeSpan sinceLast)
{
if (!enabled)
return;
SpriteManager.RemoveSprite(gearLeft);
SpriteManager.RemoveSprite(gearRight);
OnButton = false;
for (int i = 0; i < buttons.Count; i++)
buttons[i].Update();
back.Update(sinceLast);
Scroll.Update(sinceLast);
}
public bool Enabled
{
get { return enabled; }
set
{
if (!enabled && value)
{
SpriteManager.AddSprite(back);
for (int i = 0; i < buttons.Count - 1; i++)
buttons[i].Flag = true;
}
if (enabled && !value)
{
SpriteManager.RemoveSprite(back);
for (int i = 0; i < buttons.Count; i++)
buttons[i].Flag = false;
SpriteManager.RemoveSprite(gearLeft);
SpriteManager.RemoveSprite(gearRight);
}
enabled = value;
} } } }
class Scroll
namespace Speedrun
{
class Scroll
{
float volume;
public float Volume
{
get
{
if (volume < 0)
return 0;
if (volume > 1)
return 1;
return volume;
}
}
bool enable;
AnimatedSprite As;
public bool Enable
{
get
{
return enable;
}
set
{
enable = value;
if (enable)
SpriteManager.AddSprite(As);
else
SpriteManager.RemoveSprite(As);
}
}
public Scroll(AnimatedSprite As)
{
this.As = As;
volume = 1f;
this.As.Enable = false;
this.As.Frame = 17;
enable = false;
}
public void Update(TimeSpan sinceLast)
{
if (!enable)
return;
if (Input.GetKey("Right").State == KeyPose.Down || Input.GetKey("Right").State == KeyPose.Pressed && Input.GetKey("Right").TimeoutPress)
{
if (As.Frame < 17)
{
volume += 0.0625f;
As.Frame++;
}
}
if (Input.GetKey("Left").State == KeyPose.Down || Input.GetKey("Left").State == KeyPose.Pressed && Input.GetKey("Left").TimeoutPress)
{
if (As.Frame > 0)
{
volume -= 0.0625f;
As.Frame--;
} } } } }
class OnClick
namespace Speedrun
{
public delegate void Click();
static class OnClick
{
public static Menu menu;
public static void OptionsButton()
{
menu.Scroll.Enable=true;
if (menu["new_game"] != null)
{
menu["new_game"].Flag = false;
}
menu["options"].Flag = false;
if (menu["exit"] != null)
{
menu["exit"].Flag = false;
}
if (menu["back"] != null)
{
menu["back"].Flag = true;
}
}
public static void ExitButton()
{
GameCore.game.Content.Unload();
GameCore.game.Exit();
}
public static void BackButton()
{
menu.Scroll.Enable = false;
if (menu["options"] != null)
{
menu["options"].Flag = true;
}
menu["back"].Flag = false;
if (menu["exit"] != null)
{
menu["exit"].Flag = true;
}
if (menu["new_game"] != null)
{
menu["new_game"].Flag = true;
}
SoundPlayer.ChangeVolume("Default", menu.Scroll.Volume);
SoundPlayer.ChangeVolume("Music", 0.08f * menu.Scroll.Volume);
}
public static void NewGameButton()
{
if (menu["options"] != null)
{
menu["options"].Flag = false;
}
if (menu["exit"] != null)
{
menu["exit"].Flag = false;
}
menu["new_game"].Flag = false;
menu.Enabled = false;
GameCore.fade = true;
GameCore.state = State.LoadScreenGame;
GameCore.clock.SetClock(12000);
GameCore.clock.SetType(ClockType.LoadScreen);
GameCore.counter = 0;
GameCore.LoadGame("map1");
GameCore.rt.Fading(2000, 0, 2000);
GameCore.clock.Hide = true;
} } }