Автор работы: Пользователь скрыл имя, 07 Декабря 2012 в 18:50, доклад
Вы почти наверняка используется для размещения элементов управления на форме, однако, вы, вероятно, ожидая, что они будут оставаться на месте, как только вы поместите сюда. Это не обязательно должны быть случай, однако. Управление есть X и Y позиции, и вы можете изменять их в любое время выполнения. Мы можем использовать это, чтобы создать простую анимацию в окнах приложений - скажем, например, животное ходить
Вы почти наверняка используется для размещения элементов управления на форме, однако, вы, вероятно, ожидая, что они будут оставаться на месте, как только вы поместите сюда. Это не обязательно должны быть случай, однако. Управление есть X и Y позиции, и вы можете изменять их в любое время выполнения. Мы можем использовать это, чтобы создать простую анимацию в окнах приложений - скажем, например, животное ходить.
Во-первых, мне нужно два или более изображений животных на разных стадиях ходьбе. (В прилагаемом окна приложения, я использовал пару образов мультфильма овец, что я спешно составили - прости мое отсутствие художественных способностей здесь.) Больше изображений вы используете, тем плавнее будет анимация.
Все остальное мне нужно, это уже в Visual Basic. Я создам новое приложение Windows и поместите образ контроль на крайне правые части формы (из-за моих овец начинается была слева). В Resource Manager (воспитывала правой кнопкой мыши на проект, выбрав пункт "Свойства" и перейдя на вкладку Ресурсы), я добавлю два изображения овец. (В прилагаемом быстрый и грязный приложения, я обман незначительно - изображения БМП вместо GIF, и не поддерживают прозрачность. Я компенсировать, сделав неинтересными части овец изображения одного цвета в качестве фона формы.)
Обратите внимание на прозрачность в NET.: В. NET форм, прозрачность только один уровень глубокая, с этого уровня всегда родительской форме. Так что, если вы положите GIF содержащие прозрачных пикселов в PictureBox, GIF будет отображаться на форме (т. е. форму фоне покажет, где прозрачные биты). Однако, если вы перекрытия PictureBox на другой элемент управления, прозрачности эффект не складывается - прозрачным бит будет продолжаться, чтобы показать основной фон формы, а не какие-либо части управления «между» ними. Это может выглядеть странно на экране. В целях поддержки истинных стекируемых прозрачности, вам нужно работать с OnDraw метод управления самостоятельно. Это выходит за рамки темы сегодня, хотя я мог бы обратиться к этому в будущем пост.
Теперь, я дважды щелкните форму фона для создания обработчика события Form_Load. В обработчике я назначить одну из овец изображения к изображению контроль - когда приложение работает, вы увидите, овец. Но мы не хотим, овцы просто стоять там, и мы хотим, чтобы двигаться. Как мы это делаем?
Есть два компонента для движения в этом случае. Во-первых, нам нужно переместить изображение контроль периодически менять расположение овец, во-вторых, нам нужна для переключения между двумя изображениями овец, чтобы сделать вид, что овцы отвечает за движение (в отличие от его тащат в некоторых больших невидимых кошачьих). Овцы могут быть либо перед влево или вправо на каждом изображении, поэтому Есть четыре общая государств во всем:
Enum SheepState
FacingLeftExtendedLeftLegs = 1
FacingLeftExtendedRightLegs = 2
FacingRightExtendedRightLegs = 3
FacingRightExtendedLeftLegs = 4
End Enum
Тот факт, что мы должны изменить состояния периодически означает, что мы должны добавить таймер контроля. Я установить таймер на огонь тик каждые 100 мс. (В отличие от в моем примере игры Юкер в прошлом месяце, не будет иметь возможность отключать таймер, ни насоса сообщения во время обработки события, так как мы не прерывая любой другой логики, когда таймер уходит.) Мы превратим его в событие загрузки формы, и инициализировать направление и скорость, а также:
Dim счетчик As Integer
Dim состоянии As Integer
Dim скорости As Integer
Private Sub Pasture_Load (ByVal отправителя Как System.Object, _
ByVal электронной Как System.EventArgs) Ручки MyBase. Нагрузки
состояние = SheepState.
скорость = 10 'Пикселей за тик таймера
Первоначальные SheepImg.Image = Мой. Resources.sheep имиджа
Timer1.Enabled = True
End Sub
Теперь, остальные просто: в обработчик события таймера, мы просто переместить изображение управления влево на несколько пикселей, а также изменить образ овцы. Мы также узнать место нахождения управления изображением, а если левая сторона становится близким к нулю, мы будем флип оба изображения и перейти управления справа, а не, если правый край элемента управления у правого края формы, мы будем переворачивать изображения обратно и переместить изображения другом направлении. Таким образом, овец появится ходить взад и вперед по форме. Я покажу два из четырех государств здесь (два других по сути клоны этих двух, с той разницей, изображения, используемые):
Private Sub Timer1_Tick (ByVal отправителя Как System.Object, ByVal электронной Как System.EventArgs) Ручки Timer1.Tick
Select Case состоянии
Дело SheepState.
'Move овец налево
SheepImg.Left = SheepImg.Left - скорость
'Переключиться на дополнительные изображения
SheepImg.Image = Мой. Resources.sheep2
Если SheepImg.Left> 5 Тогда
"Простор; расширить другие ноги
состояние = SheepState.
Еще
"Не уйти форме - развернуться!
состояние = SheepState.
End If
Дело SheepState.
'Move овец права
SheepImg.Left = SheepImg.Left + скорость
'Переключиться на дополнительные изображения
SheepImg.Image = Мой. Resources.sheep2
"Убедитесь, что изображение лица права
SheepImg.Image.RotateFlip (RotateFlipType.
. Если SheepImg.Right <Меня Ширина - 5 Тогда
"Простор; расширить другие ноги
состояние = SheepState.
Еще
"Не уйти форме - развернуться!
состояние = SheepState.
End If
»(И т.д.)
End Select
End Sub
В сочетании с вышеупомянутым других государств (см. прикрепленный файл ZIP для полный код), овец теперь будут ходить туда-сюда по экрану. Это, конечно, здорово смотреть на минуту или около того, но овцы на самом деле не делают ничего - это на самом деле не реагирует на окружающую среду в любой интересный способ. Он "знает", что его границы, хотя, и это только начало. Теперь мы подробно остановиться на этом начинает создавать другую игру, на этот раз с участием ... песчанок.
Моя жена и я достаточно привык к тому, пробудил в утро кошки прыгали на кровати, мы оба были с давних спутников семейства кошачьих на протяжении всей нашей жизни. Как правило, тревожным сигналом является приглашение поздравить умным существом в очередной раз завоевал жестоким и порочным котенок игрушки, трофей в настоящее время с гордостью демонстрировала в рот. Так что, когда Уильям Cat вальсировал в нашу комнату в одно воскресное утро внесения соответствующих шумов и с чем-то в рот, я предполагал, что это было только начало просто еще один плохой день для Боба Кошачья мята мышь.
Потом я посмотрел еще раз, и, о, дорогой ... это был один из песчанок моей жены. Yipes! Я вскочил с кровати и торопливо освобожден Уильям своего крошечного бремя. Быстрое обследование показало, что песчанки был взъерошенный и крайне сырым с кошкой слюны (и, по сути кататонической с паникой), но в остальном невредимый. Оказалось, что песчанки удалось жевать через свои пластиковые клетки и теперь все на свободном выгуле на книжной полке, где клетки СБ (По-видимому, Уильям заметил это и вскочил на полку, чтобы захватить одну из них.) Я схватил запасной аквариум стекло и бросил их всех там, к счастью, все они были учтены. Затем я провел весь день разрабатывает новые клетки для них, что было бы немного больше грызть-доказательство.
Теперь, я не мог позволить такого инцидента проходить, не увековечивать его на компьютере, так или иначе. Итак, сегодня, я буду вас через создание "поймать песчанки" игра, которая добавит к основным принципам отмечается в «овец» пример.
Идея этой игры поймать песчанки и положил его обратно в бак, не опуская ее на пол. Существуют две основные проблемы здесь:
(1) Нам нужно перетащить изображение, представляющее песчанки - это будет представлять более сведений о состоянии, мы будем иметь в кэш.
(2) Песчанки должны "упасть" в случае освобождения, и где он падает, зависит от того, что все кончено - это больше информации о состоянии.
Для ясности, я не собираюсь оживить движение ног песчанки, когда он ползает - вы должны чувствовать себя свободно экстраполировать овец приведенном выше примере. Кроме того, вместо того, чтобы листать изображения, я собираюсь использовать два элемента управления PictureBox для песчанки, каждая со своим обратным изображением. (Можно, конечно, использовать ту же методику контроля и просто переверните образы, как мы это делали в предыдущем примере, но я думал, что я попробовать что-то в этот раз просто чтобы показать, каким образом координировать ее.)
Моя форма начинается с нескольких элементов управления PictureBox уже на нем:
(1) Книжная полка, якобы висящей на стене.
(2) Бак расположен так, как будто она стоит на полке.
(3) Три книги - я использую тот же образ для каждой из этих трех элементов управления, а просто растягивать изображение, чтобы сделать их похожими на различных книг.
Две песчанки изображения помещаются "на" полке, а также, хотя я поставил их обоих Enabled = False и Visible = False. Я также включить метку управления, которая просто дает обратную связь с пользователем, я не буду обсуждать, что еще один в этом примере. Наконец, я включаю, чтобы кнопки управления, которая позволит мне изменить скорость, с которой песчанок ползает.
Z-порядок управления («глубина» каждого элемента управления в отношении друг к другу) имеет важное значение. Я хочу иметь песчанка ползать за книги, но в передней части танка. Итак, я выбираю каждый из книг управления, щелкните правой кнопкой мыши и выберите "На передний план". Я щелкните правой кнопкой мыши танк управления и выберите "На задний план", а затем повторите это для шельфа контроль (изготовление танка следующих за последним). Песчанок воли, методом исключения, быть в центре Z-порядку.
С формой создана, первое, что мне нужно сделать, заключается в создании известных гласит:
gerbilMovingLeftOutsideCage = 0
gerbilMovingRightOutsideCage = 1
gerbilFacingLeftBeingDragged = 2
gerbilFacingRightBeingDragged = 3
gerbilMovingLeftInsideCage = 4
gerbilMovingRightInsideCage = 5
gerbilFacingLeftFalling = 6
gerbilFacingRightFalling = 7
gerbilFellOffTheTable = 8
gerbilNullAction = 9
Они должны быть очень нуждается в пояснениях. Я тогда инициализировать состояние игры в нагрузку формы обработчик события (для краткости, я исключая "Дим" заявления здесь):
состояние = gerbilState.
скорость = 5 'Пикселей за тик таймера
fallRate = 8 'Пикселей за тик таймера
"Уровень, где песчанка ползет снаружи цистерны
shelfLevel = gerbil0.Top
"Уровень, где песчанка ползет внутри бака
TankLevel = Tank.Top + Tank.Height - gerbil0.Height - 15
«Процент вероятности того, что песчанки изменит направление, за тик
reverseRate = 10
«Процент вероятности того, что песчанки не будет двигаться вообще, за тик
freezeRate = 30
Timer1.Enabled = True
Если вы читаете это внимательно, можно заметить, что я планирую добавить некоторые случайности в игру. Я хочу песчанки, чтобы действовать как песчанка, то есть, останавливаясь на отдых несколько раз, меняя направление, и т.д., но без видимого селу ни к городу. (Насколько я могу судить, песчанки полностью правит броуновское движение).
Как овцы, например, мне нужно обрабатывать случай, когда песчанка просто бегают по себе. Например, вот то, что происходит во время тик таймера, когда песчанка движется слева снаружи цистерны:
Дело gerbilState.
"Давайте выяснить, что песчанки будет делать.
"Генерация случайных чисел, чтобы увидеть, если он сидит до сих пор
Если Rnd () * 100> Затем freezeRate
«Он не сидит на месте. Переместить его на левый
gerbil0.Left = gerbil0.Left - скорость
"Хочет ли он менять направления?
"Если так, то изменение, которое изображение отображается на дисплее и включенном
И государство.
Если gerbil0.Left <= Table.Left Или _
Rnd () * 100 <reverseRate Тогда
gerbil1.Left = gerbil0.Left
gerbil1.Top = gerbil0.Top
gerbil0.Visible = False
gerbil1.Visible = True
gerbil0.Enabled = False
gerbil1.Enabled = True
состояние = gerbilState.
End If
End If
Заметим, что если песчанка направление изменений, мне нужно перейти на другой элемент управления PictureBox - Я поставил его координаты, чтобы быть таким же, как ранее активного контроля, и тогда я выключателем, который элемент управления видимым и включены. Три из других государств (gerbilMovingRightOutsideCage, gerbilMovingLeftInsideCage, gerbilMovingRightInsideCage) используют по существу той же логике, варьируя его только контроль PictureBox используется (gerbil0 против gerbil1) и границы движения (ограничен танк против ограничений на полку).
В отличие от овец, например, хотя, мне нужно обрабатывать случай, когда пользователь перетаскивает песчанки (который, если вы думаете об этом, дает совершенно новый смысл фразы "движение мыши"). Я хочу песчанки двигаться плавно с помощью курсора, так что мне нужно, чтобы выяснить положение песчанки относительно курсора, и использовать это смещение, когда песчанка перемещается. Поток: