Ловец и шар наследуют PictureBox
Возникает такая идея, касающаяся нашей игры «Ловец». На форме фигурки ловца и шаров представляют собой элементы управления PictureBox. Ими, как марионетками, управляют невидимые объекты Ловец и Шар(i). Получается некая раздвоенность: душа в одном месте, а тело в другом. А что если сделать классы clsЛовец и clsШар наследниками класса PictureBox? Тогда единство души и тела будет восстановлено и программа должна стать стройнее и логичнее. Попробуем!
Вот отличия в коде ловца:
Public Class clsЛовец
Inherits PictureBox
…………………………….
Public Sub New()
Me.Width = Размер_ловца
Me.Height = Размер_ловца
Me.SizeMode = PictureBoxSizeMode.StretchImage
Me.BackColor = Color.White
Me.Image = Image.FromFile("FACE02.ICO")
Форма.Controls.Add(Me) 'Добавляем новую рожицу в коллекцию формы
Me.BringToFront() 'Чтобы Поле не заслоняло рожицу
End Sub
……………………………….
Private Sub Ставим_изображение_ловца_на_место()
Me.Left = x
Me.Top = y
End Sub
…………………………………….
Конструктор вырос потому, что раньше мы фигурку ловца делали в режиме проектирования, а сейчас – программным методом.
Вот отличия в коде шара:
Public Class clsШар
Inherits PictureBox
…………………………………….
Private Event Я_пойман()
Public Sub New()
Me.Width = Размер_шара
Me.Height = Размер_шара
Me.SizeMode = PictureBoxSizeMode.StretchImage
Me.BackColor = Color.White
Me.Image = Image.FromFile("MOON06.ICO")
Форма.Controls.Add(Me)
Me.BringToFront()
AddHandler Я_пойман, AddressOf Убираем_шар
AddHandler Я_пойман, AddressOf Форма.Уменьшаем_счетчик_непойманных_шаров
End Sub
Private Sub Ставим_изображение_шара_на_место()
Me.Left = x
Me.Top = y
End Sub
Public Sub Действие()
Поймали_или_нет()
Отскок()
Шаг()
Ставим_изображение_шара_на_место()
End Sub
Private Sub Поймали_или_нет()
Const Дальность As Double = 10
If Math.Abs(x - Ловец.Xл - ((Размер_ловца - Размер_шара) / 2)) < Дальность _
And Math.Abs(y - Ловец.Yл - ((Размер_ловца - Размер_шара) / 2)) < Дальность _
Then RaiseEvent Я_пойман()
End Sub
Private Sub Убираем_шар()
x = -10000 : y = -10000
dx = 0 : dy = 0
End Sub
……………………………………..
В классе шара нам теперь не понадобились переменные Номер_шара и Число_созданных_шаров. Это приятное сокращение произошло потому, что душа теперь не должна искать свое тело, а точнее: потому что объекту Шар(i) теперь не нужно искать по номеру свой элемент управления PictureBox. Соответственно, конструктор стал покороче и поприятнее.
В момент поимки шар генерирует событие Я_пойман. Как видно из кода конструктора, у этого события два обработчика: тот, что в коде шара, занимается делами шара, а тот, что в коде формы, занимается делами формы. Оба они заменяют бывшую одну процедуру Выход_шара_из_игры. Это лучше, чем было раньше, когда из кода шара мы обращались к счетчику непойманных шаров на форме. Функцию Поймали я переделал в процедуру Поймали_или_нет. Так мне показалось логичнее.
Вот отличия в коде формы:
Public Sub Уменьшаем_счетчик_непойманных_шаров()
Число_непойманных_шаров = Число_непойманных_шаров - 1
Счетчик_непойманных_шаров.Text = Число_непойманных_шаров
End Sub
Здесь нам также не понадобилось объявлять массив pictШар.
Новый способ позволяет широко использовать события элементов управления PictureBox. Так, вы легко можете щелчками отгонять шары от ловца.