Основы офисного программирования и документы Word

         

Как посадить пассажира в лодку одним щелчком


Рассмотрим вначале самый простой способ посадки пассажира в лодку. Щелчок левой кнопки мыши на видимом объекте образе одного из наших героев будет перемещать его (образ) в лодку. При этом, естественно, для того, чтобы перемещение было допустимым, нужно чтобы герой и лодка находились на одном берегу. Программно перемещение объекта в лодку делается чрезвычайно просто, для этого достаточно изменить свойства Top и Left, дав им новые значения, зависящие от значения этих свойств объекта Boat. Приведем соответствующие обработчики события Click для каждого из героев игры:

Private Sub Man_Click() ManInBoat 'Call IntoBoat(Me.Man, StateOfMan)

End Sub

Private Sub Wolf_Click() WolfInBoat 'Call IntoBoat(Me.Wolf, StateOfWolf) End Sub

Private Sub Goat_Click() GoatInBoat 'Call IntoBoat(Me.Goat, StateOfGoat)

End Sub

Private Sub Cabbage_Click() CabbageInBoat 'Call IntoBoat(Me.Cabbage, StateOfCabbage)

End Sub

Листинг 6.4.

(html, txt)

Обработчики событий, как я и говорил ранее, очень простые, они вызывают соответствующую процедуру обработки события из стандартного модуля. Я реализовал две стратегии обработки, поэтому в теле обработчика предусмотрен вызов двух различных процедур. Один из этих вызовов закомментирован. Вот тексты процедур, соответствующие действующим (не закомментированным) вызовам:

Листинг 6.5.

(html, txt)

Я написал четыре почти одинаковые процедуры для размещения каждого из героев в лодке. Каждому из них отведено постоянное место в лодке и координаты подобраны так, чтобы изображение казалось бы более правдоподобным. Однако с программистской точки зрения это решение может показаться не самым удачным, в особенности при большом числе объектов. Поэтому я приведу и второй вариант, когда размещение любого из объектов выполняется одной и той же процедурой, имеющей в этом случае два параметра - видимый образ объекта и его состояние:

Public Sub IntoBoat(Im As Image, ByRef St As String)

'Посадка пассажиров в лодку If St = StateOfBoat Then 'лодка и пассажир на одном берегу St = "InBoat" 'изменяем состояние With WGCForm 'Меняя координаты объекта, перемещаем его в лодку Im.Left = .Boat.Left + 5 + CountInBoat * 50 Im.Top = .Boat.Top - CountInBoat * 30 'увеличиваем число пассажиров CountInBoat = CountInBoat + 1 End With TestingState 'Проверка корректности нового состояния End If End Sub



Листинг 6.6.

(html, txt)

Заметьте, теперь координаты, которые получает размещаемый объект, зависят не только от расположения лодки, но и от числа пассажиров в ней. Обращение к этой процедуре в обработчике событий закомментировано. При желании можно пользоваться любым из двух приведенных вариантов.


Рассмотрим вначале самый простой способ посадки пассажира в лодку. Щелчок левой кнопки мыши на видимом объекте образе одного из наших героев будет перемещать его (образ) в лодку. При этом, естественно, для того, чтобы перемещение было допустимым, нужно чтобы герой и лодка находились на одном берегу. Программно перемещение объекта в лодку делается чрезвычайно просто, для этого достаточно изменить свойства Top и Left, дав им новые значения, зависящие от значения этих свойств объекта Boat. Приведем соответствующие обработчики события Click для каждого из героев игры:

Private Sub Man_Click() ManInBoat 'Call IntoBoat(Me.Man, StateOfMan)

End Sub

Private Sub Wolf_Click() WolfInBoat 'Call IntoBoat(Me.Wolf, StateOfWolf) End Sub

Private Sub Goat_Click() GoatInBoat 'Call IntoBoat(Me.Goat, StateOfGoat)

End Sub

Private Sub Cabbage_Click() CabbageInBoat 'Call IntoBoat(Me.Cabbage, StateOfCabbage)

End Sub

Листинг 6.4.

Обработчики событий, как я и говорил ранее, очень простые, они вызывают соответствующую процедуру обработки события из стандартного модуля. Я реализовал две стратегии обработки, поэтому в теле обработчика предусмотрен вызов двух различных процедур. Один из этих вызовов закомментирован. Вот тексты процедур, соответствующие действующим (не закомментированным) вызовам:

Public Sub ManInBoat() 'Посадка пассажиров в лодку If StateOfMan = StateOfBoat Then 'лодка и пассажир на одном берегу StateOfMan = "InBoat" 'изменяем состояние With WGCForm 'Меняя координаты объекта, перемещаем его в лодку .Man.Top = .Boat.Top - 30 .Man.Left = .Boat.Left + 25 'увеличиваем число пассажиров CountInBoat = CountInBoat + 1 End With TestingState 'Проверка корректности нового состояния End If End Sub

Public Sub WolfInBoat() 'Посадка пассажиров в лодку If StateOfWolf = StateOfBoat Then 'лодка и пассажир на одном берегу StateOfWolf = "InBoat" 'изменяем состояние With WGCForm 'Меняя координаты объекта, перемещаем его в лодку .Wolf.Top = .Boat.Top - 5 .Wolf.Left = .Boat.Left + 50 'увеличиваем число пассажиров CountInBoat = CountInBoat + 1 End With TestingState 'Проверка корректности нового состояния End If End Sub




Public Sub GoatInBoat() 'Посадка пассажиров в лодку If StateOfGoat = StateOfBoat Then 'лодка и пассажир на одном берегу StateOfGoat = "InBoat" 'изменяем состояние With WGCForm 'Меняя координаты объекта, перемещаем его в лодку .Goat.Top = .Boat.Top - 20 .Goat.Left = .Boat.Left + 100 'увеличиваем число пассажиров CountInBoat = CountInBoat + 1 End With TestingState 'Проверка корректности нового состояния End If End Sub

Public Sub CabbageInBoat() 'Посадка пассажиров в лодку If StateOfCabbage = StateOfBoat Then 'лодка и пассажир на одном берегу StateOfCabbage = "InBoat" 'изменяем состояние With WGCForm 'Меняя координаты объекта, перемещаем его в лодку .Cabbage.Top = .Boat.Top + 5 .Cabbage.Left = .Boat.Left + 5 'увеличиваем число пассажиров CountInBoat = CountInBoat + 1 End With TestingState 'Проверка корректности нового состояния End If End Sub

Листинг 6.5.

Я написал четыре почти одинаковые процедуры для размещения каждого из героев в лодке. Каждому из них отведено постоянное место в лодке и координаты подобраны так, чтобы изображение казалось бы более правдоподобным. Однако с программистской точки зрения это решение может показаться не самым удачным, в особенности при большом числе объектов. Поэтому я приведу и второй вариант, когда размещение любого из объектов выполняется одной и той же процедурой, имеющей в этом случае два параметра - видимый образ объекта и его состояние:

Public Sub IntoBoat(Im As Image, ByRef St As String)

'Посадка пассажиров в лодку If St = StateOfBoat Then 'лодка и пассажир на одном берегу St = "InBoat" 'изменяем состояние With WGCForm 'Меняя координаты объекта, перемещаем его в лодку Im.Left = .Boat.Left + 5 + CountInBoat * 50 Im.Top = .Boat.Top - CountInBoat * 30 'увеличиваем число пассажиров CountInBoat = CountInBoat + 1 End With TestingState 'Проверка корректности нового состояния End If End Sub

Листинг 6.6.

Заметьте, теперь координаты, которые получает размещаемый объект, зависят не только от расположения лодки, но и от числа пассажиров в ней. Обращение к этой процедуре в обработчике событий закомментировано. При желании можно пользоваться любым из двух приведенных вариантов.


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