Эта статья, заключающая и самая интересная, в ней мы опишем контроллер пакмэна для управления игрой и методы запускающие все наши описанные выше модели сущностей и их представления.
Хотя термин контроллер подразумевает интерфейс, который управляет приложением, в шаблоне MVC, контроллер не содержит элементов пользовательского интерфейса. Контроллер определяет, как представления отвечают на пользовательский ввод.
Хотя у каждого элемента в триаде MVC есть свои обязанности, они не функционируют в изоляции друг от друга. Фактически, чтобы быть шаблоном MVC, каждый элемент должен общаться с одним или более элементами.
Опишем контроллер управляющий объектами нашей игры.
Namespace PackMan { /// <summary> /// Контроллер пакмена /// </summary> class PackManController { /// <summary> /// Обработчик нажатия клавиши /// </summary> /// <param name=”sender”>Объект,сгенеривший событие</param> /// <param name=”e”>Клавиша,которая нажата</param> public void OnKeyPress(object sender, KeyEventArgs e) { if (sender is PackMan) { switch (e.KeyData) { case Keys.Up: { ((PackMan)sender).IdentifyDirection((int)Direction.Up); break; } case Keys.Down: { ((PackMan)sender).IdentifyDirection((int)Direction.Down); break; } case Keys.Left: { ((PackMan)sender).IdentifyDirection((int)Direction.Left); break; } case Keys.Right: { ((PackMan)sender).IdentifyDirection((int)Direction.Right); break; } default: break; } } } } |
Последнее что осталось реализовать, это метод, создающий модель и представление нашей игры и методы обработки кнопок формы.
public partial class GameForm : Form { public static Random rand = new Random(); private readonly ViewGame viewGame; /// <summary> /// Количество танков /// </summary> public static int countTank = 10; /// <summary> /// Количество стен /// </summary> public static int countWall = 0; /// <summary> /// Количество яблок /// </summary> public static int countApples = 4; /// <summary> /// Размеры поля по X /// </summary> public static int MAXX; /// <summary> /// Размеры поля по Y /// </summary> public static int MAXY; /// <summary> /// Массив расстановки стен /// </summary> public static string[] map = { "********************", "*..................*", "*..................*", "*...*************..*", "*.........*........*", "*.........*........*", "*...*..*.....*..*..*", "*...*..*.....*..*..*", "*...*..*******..*..*", "*...*...........*..*", "*...*...........*..*", "*...*.....*.....*..*", "*...*.....*.....*..*", "*...****..*..****..*", "*......*..*........*", "*......*..*........*", "*.........*..*.....*", "*.........*..*.....*", "*......*..*..*.....*", "********************" }; public GameForm() { InitializeComponent(); MAXX = p_Map.Width; MAXY = p_Map.Height; //Расстановка стен по массиву map for (int i = 0; i < map.Length; i++) for (int j = 0; j < map[0].Length; j++) countWall += map[i][j] == '*' ? 1 : 0; p_Map.Controls.Add(l_points); Game game = new Game(); viewGame = new ViewGame(p_Map,l_points); viewGame.SubscribeKeyPress(); viewGame.Model = game; viewGame.Model.Start(); } private void button1_Click(object sender, EventArgs e) { viewGame.Model.Dispose(); } private void GameForm_KeyDown(object sender, KeyEventArgs e) { viewGame.OnKeyPress(e.KeyCode); } private void GameForm_FormClosing(object sender, FormClosingEventArgs e) { viewGame.Model.Dispose(); } } |
Теперь мы можем посмотреть, что у нас получилось и насладиться нашей игрой.
К сожалению так и не нашел исходный код... Хотя говорилось что он будет в последней статье.. Не могли бы вы его выложить?
ОтветитьУдалитьДа конечно, вот ссылка на исходный код
Удалитьhttp://narod.ru/disk/42386131001.e101cf71cfde58415e8e593086b8629e/PackMan.rar.html
Автор, знайте-вы такая умница!
ОтветитьУдалитьМне очень интересно читать ваши посты.
Благодарю тот день,когда вы стали блоггером))