Как посадить пассажира в лодку одним щелчком
Рассмотрим вначале самый простой способ посадки пассажира в лодку. Щелчок левой кнопки мыши на видимом объекте образе одного из наших героев будет перемещать его (образ) в лодку. При этом, естественно, для того, чтобы перемещение было допустимым, нужно чтобы герой и лодка находились на одном берегу. Программно перемещение объекта в лодку делается чрезвычайно просто, для этого достаточно изменить свойства 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.
Заметьте, теперь координаты, которые получает размещаемый объект, зависят не только от расположения лодки, но и от числа пассажиров в ней. Обращение к этой процедуре в обработчике событий закомментировано. При желании можно пользоваться любым из двух приведенных вариантов.