Просмотр полной версии : Как создать эффект затемнения кадра и постепенного уменьшения звука
sidorenkova
14.10.2013, 13:31
Здравствуйте!
Как сделать вот что:
Человек во Flash AS 3.0 нажимает на кнопку "Закрыть", и нужно чтобы эта сцена/кадр как бы стал постепенно затемняться... и стал чёрным. Также звучащая музыка в кадре тоже должна постепенно затихнуть. Ну то есть это своеобразный выход из кадра с таким эффектом.
Может быть подскаже как сделать это или поделитесь ссылочками.
Спасибо!
Вешайте поверх шейп или спрайт черный. И анимируете с 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);
}
}
}
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...
Тоже можно в ентерФрейм уменьшать громкость. Я не знаю как у вас там устроено звучание, но можно контролировать все звуки сразу.
Вот не очень оптимизированный вариант:
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 (имя файла), а как запустить или остановить звук, который уже внедрён в библиотеку???
Я сделала цикл на альфу + 0.03Идеальный шаг 1/255. Это одна ступенька альфы. Её можно домножать на целое число, если надо быстрее, но не стоит пользоваться сотыми долями, потому что альфа хоть и задается от 0 до 1, содержит не 100, а 256 степеней. При использовании правильных "отрезков" получается более плавное изменение, приятное глазу.
sidorenkova
14.10.2013, 16:20
Идеальный шаг 1/255. Это одна ступенька альфы. Её можно домножать на целое число, если надо бычтрее, но не стоит пользоваться сотыми долями, потому что альфа хоть и задается от 0 до 1, содержит не 100, а 256 степеней.
Огромное спасибо! Буду это знать! Скажите, а вот например звуковой файл лежит в папочке на сервере и весит 50 Мб... и Ролик запросит этот файл воспроизвести, это что... будет загружена 50 Мб и только потом будет воспроизведение? Или ролик воспроизводит сразу музыку по мере загрузки?
Если сервер способен отдавать поток, то "сразу" (точнее, когда будет готов буфер, то есть загрузится какая-то минимальная часть. Вы не видели, как работает плеер вКонтакте например? Он там на флэш)).
sidorenkova
14.10.2013, 16:32
Если сервер способен отдавать поток, то "сразу" (точнее, когда будет готов буфер, то есть загрузится какая-то минимальная часть. Вы не видели, как работает плеер вКонтакте например? Он там на флэш)).
Да да да, точно!!!
А есть возможность воспроизвести звук прямо из библиотеки??? Ну воспроизводить и останавливать из библиотеки
Конечно. Надо привязать к Вашему звуку в библиотеке класс. Потом в коде создать экземпляр этого класса, канал воспроизведения (SoundChannel) и управляйте на здоровье.
Только я бы не стал 50 мб пихать в свфку О___о
sidorenkova
14.10.2013, 16:50
Конечно. Надо привязать к Вашему звуку в библиотеке класс. Потом в коде создать экземпляр этого класса, канал воспроизведения (SoundChannel) и управляйте на здоровье.
Только я бы не стал 50 мб пихать в свфку О___о
Ну да... Вы правы.
И ещё у меня последний вопросик... Вот на сервере сменилась музыка а ролик продолжает включать старую мелодию.
Как правильно методом AS3 очистить кэш чтобы каждый раз звучала обновлённая музыка
Добавить к 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 секунды он делает тише музыку и затемнение ролика.
Идеальный шаг 1/255. Это одна ступенька альфы. Её можно домножать на целое число, если надо быстрее, но не стоит пользоваться сотыми долями, потому что альфа хоть и задается от 0 до 1, содержит не 100, а 256 степеней. При использовании правильных "отрезков" получается более плавное изменение, приятное глазу.
Спасибо за информацию, интересно. Где нибудь можно почитать по этому поводу?
Цвет пикселя задается либо 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
...
Действительно, что то сразу до этого не догадался. Подумал особая реализация alpha в DisplayObject. Ещё раз спасибо.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.