Создание падающих на землю снежинок это другая анимация, которую мы реализуем с использованием другого таймлайна. То, что мы хотим сделать, это добавлять периодически малое значение для координаты у каждой снежинки так, что она постепенно движется в сторону нижней части сцены. Само по себе, это сделало бы все снежинки падающими вертикально вниз, что не очень интересно. Чтобы дать сцене более реалистичный вид, мы хотим сделать снежинки по всей видимости, движущиеся на ветру, добавляя небольшую случайную величину к их координате х, чтобы создать впечатление бокового движения. Как и ранее, вопрос о том, как часто мы должны перемещать снежинки и как далеко они должны двигаться не ясен.
Значения, которые используются в примере исходного кода являются результатом эксперимента, приведены здесь, вместе с таймлайном использованным для вызова кода, который реализует движение. Добавьте этот код в конец файла SnowStorm.fx. Отметим, что он не будет компилироваться на данный момент, поскольку он ссылается на функцию, которая еще не реализована.
Смыслом этого кода является то, что снежинки должны двигаться в сторону понижения на 4 пикселя (значение переменной snowFallDistance) каждые 100 миллисекунд (задается moveSnowTime) и, в то же время, они также могут двигаться влево или вправо на 4 пикселя (значение переменной snowDriftDistance). Таймлан повторяется бесконечно и на каждом цикле он вызывает функцию с именем moveSnow(), реализация которой показана здесь:
Строка 3 этого кода цикл for, который перебирает все элементы в последовательности snowflakes. При каждом выполнении цикла, ссылка на следующую снежинку из последовательности присваивается переменной snowflake. Компилятор делает вывод, что эта переменная типа Circle, потому что snowflakes является последовательностью объектов Circle.
В строке 5, y координата снежинки увеличивается на snowFallDistance, так что она движется вниз по экрану. Для определения погодных условий снежинки также должны двигаться в сторону в некотором направлении, код на строке 6 получает случайное число между 0 и 1. Если это число оказывается больше, чем 0,7, x координата снежинки увеличивается на snowDriftDistance, что создает движение вправо. Если случайное число менее 0,3, координата х уменьшается на то же значение, что создает движение влево. Для значений между 0,3 и 0,7, х координата остается неизменной, и снежинка будет двигаться вертикально вниз.
Строки с 16 по 19 определяют достигла ли снежинка нижней части сцены, сравнивая его координату y с высотой сцены. Если это так, они удаляют узел снежинки последовательности content сцены, которая заставляет её исчезнуть, а также из последовательности snowflakes, которая означает, что она не будет перемещаться в дальнейшем, когда эта функция будет вызвана в следующий раз.
Если вы добавите предшествующий код в конец файла SnowStorm.fx и исправить строки импорта с использованием ярлыка IDE, вы можете запустить его и увидеть падающие снежинки.
Подсчет снежинок
Наконец, мы хотели чтобы текст в нижней части сцены показывал как много снежинок падает в настоящее время. Мы уже знаем сколько снежинок есть - это задается количеством элементов в последовательности snowflakes. Вы можете получить количество элементов в последовательности, используя оператор sizeof , вот так:
sizeof snowflakes
Чтобы отобразить это в текстовом узле мы изменим код, который инициализирует его на следующее:
Значения, которые используются в примере исходного кода являются результатом эксперимента, приведены здесь, вместе с таймлайном использованным для вызова кода, который реализует движение. Добавьте этот код в конец файла SnowStorm.fx. Отметим, что он не будет компилироваться на данный момент, поскольку он ссылается на функцию, которая еще не реализована.
Смыслом этого кода является то, что снежинки должны двигаться в сторону понижения на 4 пикселя (значение переменной snowFallDistance) каждые 100 миллисекунд (задается moveSnowTime) и, в то же время, они также могут двигаться влево или вправо на 4 пикселя (значение переменной snowDriftDistance). Таймлан повторяется бесконечно и на каждом цикле он вызывает функцию с именем moveSnow(), реализация которой показана здесь:
Строка 3 этого кода цикл for, который перебирает все элементы в последовательности snowflakes. При каждом выполнении цикла, ссылка на следующую снежинку из последовательности присваивается переменной snowflake. Компилятор делает вывод, что эта переменная типа Circle, потому что snowflakes является последовательностью объектов Circle.
В строке 5, y координата снежинки увеличивается на snowFallDistance, так что она движется вниз по экрану. Для определения погодных условий снежинки также должны двигаться в сторону в некотором направлении, код на строке 6 получает случайное число между 0 и 1. Если это число оказывается больше, чем 0,7, x координата снежинки увеличивается на snowDriftDistance, что создает движение вправо. Если случайное число менее 0,3, координата х уменьшается на то же значение, что создает движение влево. Для значений между 0,3 и 0,7, х координата остается неизменной, и снежинка будет двигаться вертикально вниз.
Строки с 16 по 19 определяют достигла ли снежинка нижней части сцены, сравнивая его координату y с высотой сцены. Если это так, они удаляют узел снежинки последовательности content сцены, которая заставляет её исчезнуть, а также из последовательности snowflakes, которая означает, что она не будет перемещаться в дальнейшем, когда эта функция будет вызвана в следующий раз.
Если вы добавите предшествующий код в конец файла SnowStorm.fx и исправить строки импорта с использованием ярлыка IDE, вы можете запустить его и увидеть падающие снежинки.
Подсчет снежинок
Наконец, мы хотели чтобы текст в нижней части сцены показывал как много снежинок падает в настоящее время. Мы уже знаем сколько снежинок есть - это задается количеством элементов в последовательности snowflakes. Вы можете получить количество элементов в последовательности, используя оператор sizeof , вот так:
sizeof snowflakes
Чтобы отобразить это в текстовом узле мы изменим код, который инициализирует его на следующее:
Text {
x: 25
y: bind scene. height – 10
font : Font {
size: 20
}
content: bind "Snowflakes: {sizeof snowflakes}"
}
Часть текстовой строки в строке 7, которая окружена фигурными скобками является встроенным выражением. Выражение вычисляется и его значение включается в саму строку, прежде чем он назначается содержанию переменной текстового узла. Потому что мы используем ключевое слово bind в литерале объекта, когда размер последовательности изменяется выражение пересчитывается и новая строка автоматически записывается в содержимое переменной. Это означает, что количество снежинок на экране всегда будет обновляется по мере того, как снежинки будут добавляться или удаляться из последовательности snowflakes. Привязка, которая является одной из наиболее мощных возможностей JavaFX, рассматривается в главе 9, "Привязка".
На этом приложение SnowStorm готово. Если вы сейчас запустите код, вы должны увидеть падающий снег и количество снежинок, которые постоянно обновляются.
Комментариев нет:
Отправить комментарий