вторник, 31 августа 2010 г.

Реализация шаблона MVC на примере игры типа Packman – Часть 5

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

Хотя термин контроллер подразумевает интерфейс, который управляет приложением, в шаблоне 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();

}

}

Теперь мы можем посмотреть, что у нас получилось и насладиться нашей игрой.

clip_image002

3 комментария:

  1. К сожалению так и не нашел исходный код... Хотя говорилось что он будет в последней статье.. Не могли бы вы его выложить?

    ОтветитьУдалить
    Ответы
    1. Да конечно, вот ссылка на исходный код
      http://narod.ru/disk/42386131001.e101cf71cfde58415e8e593086b8629e/PackMan.rar.html

      Удалить
  2. Автор, знайте-вы такая умница!
    Мне очень интересно читать ваши посты.
    Благодарю тот день,когда вы стали блоггером))

    ОтветитьУдалить