PDA

Просмотр полной версии : Прямоугольная подсветка.(GlowFilter)


Torero
03.01.2008, 18:24
День добрый.
С фильтрами раньше сталкивался только вскользь - сейчас озадачился следующим вопросом: можно-ли наложить GlowFilter на прямоугольный спрайт так, чтобы свечение вокруг него было равномерным. Если да, то как?

package {
import flash.display.Shape
import flash.display.Sprite
import flash.filters.GlowFilter;
import flash.filters.BitmapFilterQuality;

public class Test extends Sprite {
public function Test() {
var gf:GlowFilter=new GlowFilter();
var sh:Shape=new Shape();
gf.color=0x0000FF;
gf.blurX=gf.blurY=15
gf.quality=10;
with(sh.graphics){
beginFill(0,1);
drawRect(100,100,100,100);
endFill();
}
sh.filters=[gf];
addChild(sh);
}
}
}


При выполнении этого кода, подсветка на углах прямоугольника менее интенсивна. Судя по всему, она накладывается радиально..:(

aQuestion
03.01.2008, 18:34
как насчёт gf.blurX=gf.blurY=35
gf.quality=1;

Torero
03.01.2008, 18:42
можно еще и "gf.strength=10" установить.. а смысл?
Вопрос в том, как сделать чтобы GF рисовался не радиально.. (при этом оставаясь подсветкой, а не превращаясь в некое подобие заливки)

aQuestion
03.01.2008, 19:52
чем больше "качество", тем сильнее его размывает из прямоугольника в округлое пятно.

Aziz Zaynutdinoff
04.01.2008, 12:31
в сути своей это тот же объект, залитый цветом подсветки и размытый по Гауссу, а сие размытие всегда приводит к округлению углов. В сети есть формулы расчетов уравнений для подсчета Гауссовой размытости... поищите и убедитесь сами.

aQuestion
04.01.2008, 15:19
Как вариант:import flash.display.Shape
import flash.display.Sprite
import flash.filters.DropShadowFilter;
import flash.filters.BitmapFilterQuality;

var foo:Number = 7;
var sh2:Shape = new Shape ();
with(sh2.graphics){
beginFill(0,1);
moveTo(100 - foo, 100 - foo);
lineTo(100 + 100/2, 100); lineTo (100 + 100 + foo, 100 -foo);
lineTo(100 + 100, 100 + 100/2); lineTo (100 + 100 + foo, 100 + 100 + foo);
lineTo(100 + 100/2, 100 + 100); lineTo (100 - foo, 100 + 100 + foo);
lineTo(100, 100 + 100/2);
endFill();
}

var gf:DropShadowFilter=new DropShadowFilter();
gf.color=0x0000FF;
gf.blurX=gf.blurY=15
gf.quality=10;
gf.hideObject = true;
gf.distance = 0;
gf.strength = 1.5;
sh2.filters=[gf];
addChild(sh2);

var sh:Shape=new Shape();
with(sh.graphics){
beginFill(0,1);
drawRect(100,100,100,100);
endFill();
}
addChild(sh);

Aziz Zaynutdinoff
04.01.2008, 21:59
а где вы взяли quality=10? :)
этот параметр принимает три значения, которые описывают константы класса BitmapFilterQuality (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/filters/BitmapFilterQuality.html)

aQuestion
05.01.2008, 02:38
єтот параметр равен количеству пассов, а в названном классе определені ходовіе значения, только и всего.

Aziz Zaynutdinoff
05.01.2008, 16:57
насколько мне известно: все что выше 3 принимает значение 3
посмотрите сами на разницу установленного качества в 3 и в 10 :)

aQuestion
05.01.2008, 17:32
For most applications, a quality value of low, medium, or high is sufficient. Although you can use additional numeric values up to 15 to achieve different effects, higher values are rendered more slowly......

Freeeeeeeman
05.01.2008, 19:00
Можете мне ответить на маленький вопросик:
Почему если Sprite не в главном классе, то он ничего не рисует?

написал класс:
package General{

import flash.display.*;

public class GameSprite extends MovieClip{
public function GameSprite(){
var m_sprite = this as Sprite;
var mc = new c1();//с1 - мувик в библиотеке
mc.x=400;
mc.y=400;
m_sprite.addChild(mc)

}
}
}
Все это никакого результата не даёт видимого.

А если это в главном классе то всё ок, мувик рисуется.

Или придется всё время ссылку на документ класс передавать?

Aziz Zaynutdinoff
05.01.2008, 20:24
в этом случае вы «присобачили» Sprite в класс, а кто ж будет этот класс вставлять в класс документа? :) Поэтому ничего и не рисует. Добавьте этот класс ребёнком в класс документа и сразу увидите результат.

Freeeeeeeman
07.01.2008, 11:47
спасибо, понятно.

Torero
07.01.2008, 15:14
в сути своей это тот же объект, залитый цветом подсветки и размытый по Гауссу.
Млин, спасибо большое - сам-бы не обратил внимания.
---
Равномерной подсветки не будет, зато теперь знаю как избежать покраснения прозрачного объекта когда на него красный GlowFilter накладываю.)))
---
А как в BitmapData самому отрисовать фильтр? допустим хочется мне все-таки равномерно прямоугольник подсветить(рамки всякие симпатичные удобно делать) - по-идее ведь нужно нарисовать линию, толщиной "n" и цвета "c", у которой прозрачность градиентно изменяется по ширине не от центра к краям, а от одного края к другому - как такую штуку можно сделать?

Aziz Zaynutdinoff
08.01.2008, 15:35
для этого вам потребуется рисовать 8 четырехугольника: 4 по каждой стороне и 4 по каждому углу. По 4-м сторонам градиент от прилегающей стороны во внешнюю, а по углам — от прилегающего угла во внешний.

PS
Не иронизируйте и не вырывайте фраз из контекста... я написал это не потому что считаю, что вы не обратили внимания, а только потому, чтоб обозначить причину скругленных краев, ибо ваш вопрос касался именно «а почему они скругленные»...

Torero
09.01.2008, 03:27
2 Aziz: Не иронизировал - это искренняя благодарность.. Я действительно не обратил внимания пока не написали.)) Спасибо.
---
З.Ы. А можно все-таки как-то свой собственный lineStyle создать?

Aziz Zaynutdinoff
09.01.2008, 17:39
Желаемый эффект не будет достигнут путем использования lineStyle.

aQuestion
09.01.2008, 18:05
отчего же, в линиях есть градиентная заливка.

Aziz Zaynutdinoff
09.01.2008, 18:19
и какой способ вы готовы предложить для достижения сего эффекта? :)
LINEAR или RADIAL? В данном случае больше подходит RADIAL но он даст округление углов.

Torero
09.01.2008, 20:46
Ладно.. Буду БитмапДату рыть - давно пора уже было.:) Если что интересное нарою - выложу. Спасибо за ответы.