PDA

Просмотр полной версии : Как создать эффект затемнения кадра и постепенного уменьшения звука


sidorenkova
14.10.2013, 13:31
Здравствуйте!
Как сделать вот что:

Человек во Flash AS 3.0 нажимает на кнопку "Закрыть", и нужно чтобы эта сцена/кадр как бы стал постепенно затемняться... и стал чёрным. Также звучащая музыка в кадре тоже должна постепенно затихнуть. Ну то есть это своеобразный выход из кадра с таким эффектом.

Может быть подскаже как сделать это или поделитесь ссылочками.

Спасибо!

in4core
14.10.2013, 13:58
Вешайте поверх шейп или спрайт черный. И анимируете с 0 до 100 альфой. вот вам и затемнение. Со звуком - это уже через код, через enter_frame fade in сделать

Zebestov
14.10.2013, 14:20
fade in
Только это будет fade out.

sidorenkova
14.10.2013, 14:23
Вешайте поверх шейп или спрайт черный. И анимируете с 0 до 100 альфой. вот вам и затемнение. Со звуком - это уже через код, через enter_frame fade in сделать

Спасибо большое! Саму суть поняла. Я так давно не работала с Flash... скажите а можно анимировать с 0 до 100 альфой через код???

Может быть сможете дать примерчик кода...

Akopalipsis
14.10.2013, 14:34
package
{
import flash.display.Sprite;
import flash.events.Event;

public class Main extends Sprite
{
private var _sprite:Sprite;

public function Main()
{
if (stage)
{
init();
}
else
{
addEventListener(Event.ADDED_TO_STAGE, init);
}
}

private function init(event:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

_sprite = new Sprite();
_sprite.graphics.beginFill(0x000000);
_sprite.graphics.drawRect(0, 0, 200, 200);
_sprite.graphics.endFill();
_sprite.alpha = 0;
super.addChild(_sprite);

addEventListener(Event.ENTER_FRAME, enterFrameHandler);

}

private function enterFrameHandler(event:Event):void
{
_sprite.alpha += .1;
if(_sprite.alpha==1)removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

}
}

samana
14.10.2013, 14:40
Akopalipsis, только проверку альфы не alpha==0, а alpha>=1. Ведь объект должен полностью появится.

Akopalipsis
14.10.2013, 14:43
samana ой, Спасибо! я просто первый код сделал с увеличением, а потом ещё раз прочёл вопрос и понял, что требуется другое. Сейчас исправлю.

Fogflasher
14.10.2013, 14:44
Apokalipsis, скажите, а вот эта проверка:


if (stage)
{
init();
}
else
{
addEventListener(Event.ADDED_TO_STAGE, init);
}


Она вообще зачем нужна, это некая форма подстраховки? Для тормозных плейеров?

Akopalipsis
14.10.2013, 14:49
Apokalipsis, скажите, а вот эта проверка:
Это проверка на существование stage. Ведь пока документ класс не добавится на сцену, то обращение к ней вызовет ошибку. Мне кажется, если в конструкторе создать спрайт и добавить его в список отображения в this.addChild(), то ошибки не будет. А вот есть его добавить на сцену stage.addChild() ( !!!не когда так не делайте, это я просто для примера !!! ), то stage может ещё не существовать и это будет ошибка.

Fogflasher
14.10.2013, 14:53
Понятно, спасибо. Защита от дурного тона добавления чего-то минуя документ класс.

Akopalipsis
14.10.2013, 14:58
Понятно, спасибо. Защита от дурного тона добавления чего-то минуя документ класс.
Скорее, уверенность в выполнении кода тогда, когда приложение точно к этому готово.

sidorenkova
14.10.2013, 15:21
Ребята!!! всё, я разобралась! Огромное Вам спасибо! Насчёт затемнения поняла!!! Я сделала цикл на альфу + 0.03 затемнения чтобы помедленее затемнялось, всё получилось!!!

Спасибо!

А теперь мне нужно как-то музыку заглушить также... от 1 до 0...

samana
14.10.2013, 15:50
Тоже можно в ентерФрейм уменьшать громкость. Я не знаю как у вас там устроено звучание, но можно контролировать все звуки сразу.
Вот не очень оптимизированный вариант:
import flash.media.SoundMixer;
import flash.media.SoundTransform;

addEventListener(Event.ENTER_FRAME, sound_FadeOut);
function sound_FadeOut(e:Event):void
{
var volume:Number = SoundMixer.soundTransform.volume;
volume-= 0.01;
var sTr:SoundTransform = new SoundTransform(volume);

SoundMixer.soundTransform = sTr;

if(volume<0) removeEventListener(Event.ENTER_FRAME, sound_FadeOut );
}

Но если после затухания вы ещё будете где-то использовать звук, то не забудьте потом установить громкость обратно на 1, вот так:
SoundMixer.soundTransform = new SoundTransform();

sidorenkova
14.10.2013, 16:12
Огромное спасибо!!! У меня есть вопросик... тут я читала что когда возспроизводишь звук, указываешь URLRequest (имя файла), а как запустить или остановить звук, который уже внедрён в библиотеку???

Wolsh
14.10.2013, 16:15
Я сделала цикл на альфу + 0.03Идеальный шаг 1/255. Это одна ступенька альфы. Её можно домножать на целое число, если надо быстрее, но не стоит пользоваться сотыми долями, потому что альфа хоть и задается от 0 до 1, содержит не 100, а 256 степеней. При использовании правильных "отрезков" получается более плавное изменение, приятное глазу.

sidorenkova
14.10.2013, 16:20
Идеальный шаг 1/255. Это одна ступенька альфы. Её можно домножать на целое число, если надо бычтрее, но не стоит пользоваться сотыми долями, потому что альфа хоть и задается от 0 до 1, содержит не 100, а 256 степеней.

Огромное спасибо! Буду это знать! Скажите, а вот например звуковой файл лежит в папочке на сервере и весит 50 Мб... и Ролик запросит этот файл воспроизвести, это что... будет загружена 50 Мб и только потом будет воспроизведение? Или ролик воспроизводит сразу музыку по мере загрузки?

Wolsh
14.10.2013, 16:27
Если сервер способен отдавать поток, то "сразу" (точнее, когда будет готов буфер, то есть загрузится какая-то минимальная часть. Вы не видели, как работает плеер вКонтакте например? Он там на флэш)).

sidorenkova
14.10.2013, 16:32
Если сервер способен отдавать поток, то "сразу" (точнее, когда будет готов буфер, то есть загрузится какая-то минимальная часть. Вы не видели, как работает плеер вКонтакте например? Он там на флэш)).

Да да да, точно!!!

А есть возможность воспроизвести звук прямо из библиотеки??? Ну воспроизводить и останавливать из библиотеки

Wolsh
14.10.2013, 16:36
Конечно. Надо привязать к Вашему звуку в библиотеке класс. Потом в коде создать экземпляр этого класса, канал воспроизведения (SoundChannel) и управляйте на здоровье.
Только я бы не стал 50 мб пихать в свфку О___о

sidorenkova
14.10.2013, 16:50
Конечно. Надо привязать к Вашему звуку в библиотеке класс. Потом в коде создать экземпляр этого класса, канал воспроизведения (SoundChannel) и управляйте на здоровье.
Только я бы не стал 50 мб пихать в свфку О___о

Ну да... Вы правы.

И ещё у меня последний вопросик... Вот на сервере сменилась музыка а ролик продолжает включать старую мелодию.

Как правильно методом AS3 очистить кэш чтобы каждый раз звучала обновлённая музыка

Wolsh
14.10.2013, 16:52
Добавить к URL рандомное число или текущее дату-время.

gloomyBrain
14.10.2013, 16:54
Как правильно методом AS3 очистить кэш чтобы каждый раз звучала обновлённая музыка

Загружать звук методом POST или добавлять к URL случайное число:

var url:String = "http://site.com/sunds/mySound?" + Math.random();


... упс, Wolsh опередил =)

sidorenkova
14.10.2013, 17:03
Тоже можно в ентерФрейм уменьшать громкость. Я не знаю как у вас там устроено звучание, но можно контролировать все звуки сразу.
Вот не очень оптимизированный вариант:
import flash.media.SoundMixer;
import flash.media.SoundTransform;

addEventListener(Event.ENTER_FRAME, sound_FadeOut);
function sound_FadeOut(e:Event):void
{
var volume:Number = SoundMixer.soundTransform.volume;
volume-= 0.01;
var sTr:SoundTransform = new SoundTransform(volume);

SoundMixer.soundTransform = sTr;

if(volume<0) removeEventListener(Event.ENTER_FRAME, sound_FadeOut );
}

Но если после затухания вы ещё будете где-то использовать звук, то не забудьте потом установить громкость обратно на 1, вот так:
SoundMixer.soundTransform = new SoundTransform();

Да, вроде бы всё работает!!! Единственное мне бы хотелось чтобы музыка утихала чуть медленее... сделав volume -= 0.001 и volume -= 0.000001 не помогло! Может быть мне включить заодно таймер, который будет каждый раз перепроверять значения и через определённый промежуток времени громкость музыки уменьшать? Мне хочется чтобы музыка "заткнулась медленно" в течении 15 секунд

Добавлено через 6 минут
Ребята! А может быть мне правда так и сделать? Через таймер... при нажатии на кнопочку срабатывает таймер и каждые к примеру 0,1 секунды он делает тише музыку и затемнение ролика.

Rivexe
15.10.2013, 12:45
Идеальный шаг 1/255. Это одна ступенька альфы. Её можно домножать на целое число, если надо быстрее, но не стоит пользоваться сотыми долями, потому что альфа хоть и задается от 0 до 1, содержит не 100, а 256 степеней. При использовании правильных "отрезков" получается более плавное изменение, приятное глазу.

Спасибо за информацию, интересно. Где нибудь можно почитать по этому поводу?

Wolsh
15.10.2013, 13:38
Цвет пикселя задается либо 24 бита RGB (при этом считается что альфа 100%), то есть изображение не поддерживает прозрачность, либо в ARGB — 32 бита. На альфа-канал приходится столько же байт, как и на любой цветовой канал RGB (по-сути это такое же полутоновое изображение, как и любой канал). Ну а каждый канал содержит значение от 0х00 до 0xFF, то есть от ноля до 255 = 256 значений (степеней).
В AS2 альфа задавалась в процентах от 0 до 100, в AS3 от 0 до 1 с плавающей точкой. Но и тогда, и сейчас, рендер плеера пересчитывает эти проценты в целое число от 0 до 255 для каждого пикселя изображения, которое будет передано видеоадаптеру. Если Вы задаете отрезки итерации, исходя из расчета что есть 100 уникальных степеней прозрачности 0.00, 0.01...0.99, 1.00, то после пересчета, в "реальности", такие отрезки будут не равны из-за округления (не может быть значение канала 2.55, только целое число 2 или 3).
Вот такой ряд реальных значений канала получается при шаге 0.01
0
2
5
7
10
12
15
17
20
...То есть +2 +3 +2 +3 +2 +3
При шаге 1/255 Вы получаете нормальный ряд
0
1
2
3
4
5
6
7
8
9
10
...

Rivexe
15.10.2013, 13:46
Действительно, что то сразу до этого не догадался. Подумал особая реализация alpha в DisplayObject. Ещё раз спасибо.