Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Анимация шелеста листвы (http://www.flasher.ru/forum/showthread.php?t=211119)

KiL33 28.06.2015 17:37

Анимация шелеста листвы
 
Вложений: 1
К примеру есть изображение дерева
Вложение 31670
Как бы сделать так, чтобы и шелест был реалистичен, и процессор сильно не грузило?) :o

На деле, изображение имеет выраженную листву, но делать анимацию каждого листа это жесть, даже при условии, что это будет клон всех остальных листьев, тормоза будут серьезные я полагаю)

samana 28.06.2015 18:11

А если сделать просто анимацию на 8-12 кадров где нибудь в удобном редакторе, а во флеш просто запускать мувик с серией картинок? Но тогда будет много занимать места, так как каждый кадр анимации - это целое изображение листвы.
Или может разбить листву на 3-5 частей, каждую из которой двигать рандомно на небольшое расстояние.

Zebestov 29.06.2015 05:04

Вложений: 2
Или вот такая авантюра:
leafsAnimation.swf   (20.9 Кб)

Код AS3:

import flash.display.Bitmap;
import flash.geom.Matrix;
import flash.display.BitmapData;
 
// Оригиналы листьев.
var origs:Array = [];
origs[0] = new Leaf1();
origs[1] = new Leaf2();
origs[2] = new Leaf3();
 
// Текущий вид каждого из трех вариантов листьев.
var leafs:Array = [];
leafs[0] = new Leaf1();
leafs[1] = new Leaf2();
leafs[2] = new Leaf3();
 
// Чтобы матрицы каждый раз не создавать заново.
var mtx:Matrix = new Matrix();
 
// Наша импровизированная крона дерева о тысяче листов.
var leafsNum:int = 1000;
var tree:Array = [];
 
// Создаем дерево.
var leaf:Bitmap;
for (var i:int = 0; i < leafsNum; i++) {
        leaf = new Bitmap(leafs[int(Math.random() * 3)]);
        leaf.x = Math.random() * 400 + 50;
        leaf.y = Math.random() * 250 + 50;
        addChild(leaf);
        tree[i] = leaf;
}
 
// Это у нас разные фазы для каждой группы листьев.
var phases:Array = [0.0, 1.1, 1.6];
 
// А это общее "время".
var time:Number = 0.0;
 
// Поехали!
addEventListener(Event.ENTER_FRAME, onEnterFrame);
 
// Ну вот, собственно, и вся магия. Здесь мы меняем
// всего лишь три битмапдаты, которые размножены на экране
// посредством тысячи битмап. Ну, т.е. мы не каждый лист
// перерисовываем, а лишь три его варианта отображения.
// Остальное происходит типо блиттингом.
function onEnterFrame(event:Event):void {
        time += 0.2;
 
        var r:Number;
        var s:Number;
        var b:BitmapData;
        for (var i:int = 0; i < 3; i++) {
                r = (Math.sin((time + phases[i]) * 0.2) + Math.sin((time + phases[i]) * 0.5) + i - 1.5) / 10;
                s = i * 0.2 + 0.6;
                mtx;
                mtx.identity();
                mtx.translate(-32, 0);
                mtx.scale(s, s);
                mtx.rotate(r);
                mtx.translate(32 * s, 0);
 
                b = leafs[i] as BitmapData;
                b.fillRect(b.rect, 0);
                b.draw(origs[i] as BitmapData, mtx, null, null, null, true);
        }
}


Tails 29.06.2015 10:07

Можно взять пример Zebestov, создать шикарную анимацию для дерева, отрендерить в секвенцию png картинок, и затем уже использовать полученные кадры анимации у себя.
Получится красиво и виснуть не будет.

samana 29.06.2015 10:47

Цитата:

Сообщение от Zebestov (Сообщение 1184231)
Или вот такая авантюра

Очень классно!

caseyryan 29.06.2015 12:00

Цитата:

Сообщение от Zebestov (Сообщение 1184231)
Или вот такая авантюра:
leafsAnimation.swf   (20.9 Кб)

Код AS3:

import flash.display.Bitmap;
import flash.geom.Matrix;
import flash.display.BitmapData;
 
// Оригиналы листьев.
var origs:Array = [];
origs[0] = new Leaf1();
origs[1] = new Leaf2();
origs[2] = new Leaf3();
 
// Текущий вид каждого из трех вариантов листьев.
var leafs:Array = [];
leafs[0] = new Leaf1();
leafs[1] = new Leaf2();
leafs[2] = new Leaf3();
 
// Чтобы матрицы каждый раз не создавать заново.
var mtx:Matrix = new Matrix();
 
// Наша импровизированная крона дерева о тысяче листов.
var leafsNum:int = 1000;
var tree:Array = [];
 
// Создаем дерево.
var leaf:Bitmap;
for (var i:int = 0; i < leafsNum; i++) {
        leaf = new Bitmap(leafs[int(Math.random() * 3)]);
        leaf.x = Math.random() * 400 + 50;
        leaf.y = Math.random() * 250 + 50;
        addChild(leaf);
        tree[i] = leaf;
}
 
// Это у нас разные фазы для каждой группы листьев.
var phases:Array = [0.0, 1.1, 1.6];
 
// А это общее "время".
var time:Number = 0.0;
 
// Поехали!
addEventListener(Event.ENTER_FRAME, onEnterFrame);
 
// Ну вот, собственно, и вся магия. Здесь мы меняем
// всего лишь три битмапдаты, которые размножены на экране
// посредством тысячи битмап. Ну, т.е. мы не каждый лист
// перерисовываем, а лишь три его варианта отображения.
// Остальное происходит типо блиттингом.
function onEnterFrame(event:Event):void {
        time += 0.2;
 
        var r:Number;
        var s:Number;
        var b:BitmapData;
        for (var i:int = 0; i < 3; i++) {
                r = (Math.sin((time + phases[i]) * 0.2) + Math.sin((time + phases[i]) * 0.5) + i - 1.5) / 10;
                s = i * 0.2 + 0.6;
                mtx;
                mtx.identity();
                mtx.translate(-32, 0);
                mtx.scale(s, s);
                mtx.rotate(r);
                mtx.translate(32 * s, 0);
 
                b = leafs[i] as BitmapData;
                b.fillRect(b.rect, 0);
                b.draw(origs[i] as BitmapData, mtx, null, null, null, true);
        }
}


Крутяк) Сам придумал?

Zebestov 29.06.2015 12:10

Так а чо там придумывать-то :)
Конечно, вот это вот "32 * s" — это чота странное, но и коммит же ведь ночной :)

KiL33 29.06.2015 14:53

Zebestov, суперр!


Часовой пояс GMT +4, время: 13:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.