ПОНЯТНО О Visual Basic NET (том 3)

       

Ловец и шар наследуют 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. Так, вы легко можете щелчками отгонять шары от ловца.


Содержание раздела