PDA

Просмотр полной версии : эффект воды


alexx25
28.11.2007, 12:02
Поможите люди добрые!
Нужен реальный эффект воды, чтоб - как на самом деле!!!
Нашел скрипт (спасибо чуваку, который его написал):

import flash.display.*;
import flash.geom.*;
import flash.filters.*;
myBitmap = new BitmapData(390,293,false,0);
pt = new Point(0,0);
mpoint = new Point(0,0);
myDispl = new DisplacementMapFilter(myBitmap, mpoint,1,2,10,50);
water_mc.myList = new Array();
water_mc.myList.push(myDispl);
water_mc.filters = water_mc.myList;
i = 1;
this.onEnterFrame = function()
{
filterList = water_mc.filters;
offset = new Array();
offset[1] = new Object();
offset[1].x = i;
offset[1].y = i/8;
myBitmap.perlinNoise(45,5,3,50,true,false, 7,true,offset);
filterList.mapBitmap = myBitmap;
water_mc.filters = filterList;
i++;
} Вопрос:
Можно ли его как-нибудь изменить, чтоб процессор не тормозил (при тестировании такого скрипта, процессор загружен на 95-100%).?
Возможно ли это???

aQuestion
28.11.2007, 12:12
у меня при 170х170/12фпс проц тянет 27% плюс минус. по мне весьма неплохо.

alexx25
28.11.2007, 12:17
Нет возможности уменьшить размер битмапа.
Необходимо изменение скрипта!

chingachgoog
28.11.2007, 12:26
Надо карту смещений для DisplacementMapFilter (которая сейчас генерится perlinNoise, что ресурсоемко) нарисовать руками.

alexx25
28.11.2007, 13:01
Помогите, объясеите пжста что такое DisplacementMapFilter, и с чем его едят!?
Как ее надо рисовать и исправить код?

chingachgoog
28.11.2007, 13:43
Не так это просто.
http://flasher.ru/forum/showthread.php?t=100674&page=4

alexx25
28.11.2007, 14:28
Огромное спасибо!
Но только я так и не смог модернизировать код.
Если есть возможность - скинь пожалуйста ссылку на исходник (реалистичная вода) с подобным кодом!

TERRORist
28.11.2007, 17:58
да видео сделай и не мучайся

Spot
01.12.2007, 00:16
**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 1: Statement must appear within on/onClipEvent handler
import flash.display.*;

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 2: Statement must appear within on/onClipEvent handler
import flash.geom.*;

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 3: Statement must appear within on/onClipEvent handler
import flash.filters.*;

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 4: Statement must appear within on/onClipEvent handler
myBitmap = new BitmapData(390,293,false,0);

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 5: Statement must appear within on/onClipEvent handler
pt = new Point(0,0);

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 6: Statement must appear within on/onClipEvent handler
mpoint = new Point(0,0);

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 7: Statement must appear within on/onClipEvent handler
myDispl = new DisplacementMapFilter(myBitmap, mpoint,1,2,10,50);

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 8: Statement must appear within on/onClipEvent handler
water_mc.myList = new Array();

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 9: Statement must appear within on/onClipEvent handler
water_mc.myList.push(myDispl);

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 10: Statement must appear within on/onClipEvent handler
water_mc.filters = water_mc.myList;

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 11: Statement must appear within on/onClipEvent handler
i = 1;

**Ошибка** Сцена=Сцена 1, слой=Слой 1, кадр=1:Строка 12: Statement must appear within on/onClipEvent handler
this.onEnterFrame = function()

Общее количество ошибок ActionScript: 12 Сообщенные ошибки: 12

ну как нравиться

iNils
01.12.2007, 00:20
Код надо в кадр помещать, а не на клип.

B0Bka
01.12.2007, 02:28
alexx25 вот тебе мое извращение :victory: вода это не всегда вода

import flash.display.BitmapData
import flash.filters.DisplacementMapFilter
import flash.geom.Point
noise = new BitmapData(830, 174, false, 0x000000);
_root.attachBitmap(noise, 1);
_root.attachMovie("water", "water", 2);

cx = 0;
cy = 0;
seed = random(Number.MAX_VALUE);

t_i = 0;
directn = 1;
onEnterFrame = function() {
if (directn == 1 && t_i < 800) t_i++;
else {
t_i = 0;
}

trace(t_i);
update(t_i, 0);
}

function update(x, y){
off1 = new Point(x, y);
noise.perlinNoise(50, 20, 1, seed, true, true, 1 | 2, false, [off1]);
water.filters = [new DisplacementMapFilter(noise, new Point(0,0), 1, 2, 10, 10)];
}


полчучается такой эффект что в аттаче

Котяра
01.12.2007, 13:08
Тормозит жуть.. у меня C2800 сразу подлетает загрузка до 100%

chingachgoog
01.12.2007, 13:41
Это та же дыня только сбоку: perlinNoise генерит карту смещений для DisplacementMapFilter. Отсюда и ожидаемая загрузка процессора.

B0Bka
01.12.2007, 14:51
ну тогда могу предложить другой вариант как некторые флэшеры делают бегущие облака: длииииинная полоска движущеся воды и медленно ее двигаем :)

vapes
01.12.2007, 15:11
Вот мой вариант сего чуда.
http://vapes.na.by/blog/index.php?entry=entry071009-112359

джонатан
20.05.2008, 01:49
Вот у меня тоже такая же беда, процессор адски загружается, а мне в флеш сайт эффект нужен, а там кроме этого тоже эффекты имеются... Прям не знаю, что и делать...

Kuruki
20.05.2008, 01:57
http://silin.fatal.ru/AS2/ripple/ripple.rar

джонатан
21.05.2008, 22:31
Вот тут вот (http://www.grandbaikal.ru/img/GrandBaikal2008/flash/head.swf) классно вода сделана, и проц не жрет совсем почти... Интересно как?

Wolsh
22.05.2008, 02:19
покадровая анимация. по-русски: gif. ))) только большой и из джипегов)))
Это чтото типа Particle Illusion использовано для генерации серии кадров.

джонатан
22.05.2008, 11:39
Wolsh
Ну да! Я тоже так подумал, весит она уж больно много просто.

Kuruki
У Вас прикольный вариант конечно, но все повынесено в отдельные as файлы, и я прям затрудняюсь разобраться где что, надо еще поковырять...

Kuruki
22.05.2008, 21:01
Вариант не мой, а silin'a. Эффект воды - это класс Ripple. А класс InstanceManager создает мувиклип (и не только) и делает его экземпляром указанного класса (Ripple).

DJ_Baton
22.05.2008, 21:24
четкий скрипт !!!

silin
22.05.2008, 22:06
perlinNoise можно посчитать один раз, а потом тока двигать карту..

джонатан
22.05.2008, 22:55
perlinNoise можно посчитать один раз, а потом тока двигать карту..

Ну тут като не очень смотрится... Да и когда я исходник открываю, то не работает. Ошибку даже выдает:

The name of this class, 'Wobble', conflicts with the name of another class that was loaded, 'Wobble'.

silin
22.05.2008, 23:43
>>Ну тут като не очень смотрится..
тогда присоединяюсь к TERRORist'у: делай видео..

>>The name of this class, 'Wobble', conflicts with..
в меню: Control-delete ASO files

джонатан
23.05.2008, 02:18
silin
>Видио слишком много места занимает, а мне дорог каждый кб. Сайт в провиции будет работать. А там все все еще любят DialUp

А как можно замедлить это, не трогая fps??? При 31 как я уже говорил не очень смотриться, но я уменьшил до 21, и по моему очень даже не плохо стало...
И еще можно ли уменьшить ширину "полос"?

Сложный код слишком для моего уровня :(

silin
23.05.2008, 18:30
var wobble:Wobble = new Wobble(picMC._width, picMC._height);
wobble.vaweAmplitude=128;//размах колебаний
wobble.vaweLength=8;//ширина
function onEnterFrame()
{
wobble.shift();
picMC.filters = [wobble.filter];
}
ps. по краям возможны артефакты
т.е. придется прятать кромки или за сценой или под маску все это добро засунуть..

джонатан
23.05.2008, 19:02
Да да да! Артефакты я уже запрятал :) Спасибо!

Я вот только не могу понять в кокую сторону колебания происходят???
Вродебы как влево вправо, но местами кажется что и снизу вверх...
Можно какнибудь сделать, чтобы снизу частота колебаний была выше чем сверху?