Давайте прикоснемся к готике во Flash и математике. Здесь мы представляем динамические эффекты капающей крови. Эти эффекты очень легко настроить в соответствии с требованиями пользователя. Вы можете создать любой дисплей объект, истекающий кровью. Вы можете изменить количество крови, скорость, эффект разбрызгивания. Загрузите хорошо откомментированный код в файле-архиве ниже и поиграйте с ним.
Стекающая кровь:
Капающая кровь:
Загрузите архив ниже, выберите исходный код.
Комментарии
В архиве ниже вы найдете два fla файла, соответствующие двум эффектам, представленным здесь, и пакет пользовательских классов AS3. Простой и короткий код на Timeline в каждоом из fla файлов использует элементы, помещенные на сцене, и наш пользовательский AS3 класс RainDisplay, чтобы создать кровавые эффекты.
Мувиклип, содержащий слово 'Blood', размещен на сцене, и ему дано инстанс имя mcText. Вы можете заменить этот клип любым дисплей объектом. Чтобы отметить точки, из которых начинаются потоки крови, мы поместим на сцену экземпляры мувиклипа mcSpot и назовем экземпляры 'spot1', 'spot2', ....,'spot25' и т.д. Чтобы отметить точки источников для своего дисплей объекта, просто передвиньте пятнышки, удалите некоторые или добавьте больше по своему желанию. Только убедитесь, что вы им дали инстанс имена, начинающиеся со 'spot'. Код на Timeline ищет всех детей, чьи имена начинаются со 'spot' и помещает полоски крови там. Вы можете настроить почти все элементы вашей анимации, такие как цвета, скорость, количество крови, эффект брызг, простым изменением в коде на Timeline в каждом из fla-файлов. Код на Timeline создает экземпляр нашего пользовательского класса RainDisplay, который назван 'display'. Класс отвечает за создание капающих кровавых полосок в намеченных местах, и базируется на значениях переменных, определенных на Timeline, таких как waitCount, dropsToAddEachFrame и т.д. Класс очень удобный для применения, гибкий, он имеет много публичных свойств и методов, что делает легким его настройку. Вы можете посмотреть эти методы и свойства в действии в присоединенных fla -файлах. Например, простое изменение строки 42 в коде на Timeline в файле BloodDripping.fla с
Code
dropsToAddEachFrame=1
на
Code
dropsToAddEachFrame=10
даст большее количество капающей крови. Или уменьшите значение waitCount, скажем, на 2.
Код хорошо откомментирован и готов для того, чтобы вы поиграли с ним. Успеха!
Представляю вам код на таймлайне для стекающей крови
var origin:Point; var waitCount:int; var count:int; var display:RainDisplay; var darken:ColorTransform; var bitmapData:BitmapData; var bitmap:Bitmap; var timer:Timer; var frame:Shape; var dropsToAddEachFrame:int;
var t:Number;
var spotPositions:Vector.<Point>;
///////////////////////
init();
///////////////////////
function init():void {
//Это отрезок времени, в течение которого нужно ждать (в фреймах) перед тем, как будут добавлены еще капли на сцену: waitCount=6;
count=waitCount-1; dropsToAddEachFrame=1;
origin=new Point(0,0);//будет использоваться с фильтром blur.
//Этот ColorTransform используется для исчезновения картинок, нарисованных //в анимации (вместо того, чтобы стирать их полностью). Вы можете поэкспериментировать //с различными параметрами в этом ColorTransform. darken=new ColorTransform(1,1,1,0.997);
display.gravity=0.3; //мы используем начальную скорость в направлении вниз. Позже в коде, капли крови //будут иметь "atTerminalVelocity" установленным в true, так чтобы они были запущены вниз с постоянной //скоростью перед тем, как разгонятся из-за гравитации. display.defaultInitialVelocity=new Point(0,1); display.initialVelocityVariancePercent=1.5; display.initialVelocityVarianceX=0; display.initialVelocityVarianceY=0; display.dropLength="long";
display.removeDropsOutsideXRange=false;
//Параметры ниже создают капли, которые "приклеиваются" на свои начальные позиции //на короткое время перед тем, как освободиться и падать. //Вариация помогает рандомизировать тайминг. display.globalBreakawayTime=10; display.breakawayTimeVariance=0.5;
//RainDisplay реально не отображается на сцене. Вместо этого он рисуется как битмап //Этот метод учитывает поправку на эффект исчезновения, основанный на фильтре, который используется. bitmapData=new BitmapData(display.displayWidth,display.displayHeight,true,0x00000000); bitmap=new Bitmap(bitmapData); bitmap.x=4; bitmap.y=4;
frame = new Shape(); frame.graphics.lineStyle(1,0x444444); frame.graphics.drawRect(-1,-1,display.displayWidth+1, display.displayHeight+1); frame.x=bitmap.x; frame.y=bitmap.y;
function findSpots():void { //Эта функция находит все мувиклипы на сцене с именами "spot*" и записывает их позиции, //чтобы использовать как источники капель крови. Мувиклипы сделаны невидимыми. for (var i:int = 0; i<= this.numChildren - 1; i++) { var child=this.getChildAt(i); if (child.name.slice(0,4)=="spot") { spotPositions.push(new Point(child.x - bitmap.x,child.y - bitmap.y)); child.visible=false; } } }
function onEnter(evt:Event):void { var randIndex:int; //добавляем капли еще count++; if (count>=waitCount) { count=0; for (var i:int = 0; i <= dropsToAddEachFrame-1; i++) { randIndex=Math.floor(Math.random()*spotPositions.length); var thisDrop=display.addDrop(spotPositions[randIndex].x+4*Math.random()-2,spotPositions[randIndex].y); //мы не хотим, чтобы эти капли давали брызги, когда они достигнут низа: thisDrop.splashing=false; //мы установим 'atTerminalVelocity' в true, чтобы капли двигались вниз с постоянной скоростью //перед тем как разгонятся из-за гравитации. thisDrop.atTerminalVelocity=true; thisDrop.thickness=4+4*Math.random()-2; } }
//изменяем капли display.update();
//Теперь мы рисуем rain display в основном битмапе, после того как применим ColorTransform //что заставит нарисованные ранее картинки исчезнуть. bitmapData.lock(); bitmapData.colorTransform(bitmapData.rect, darken); bitmapData.draw(display); bitmapData.unlock(); }