Rysowanie obiektów, wypełnianie i transformacja wypełnień

Transkrypt

Rysowanie obiektów, wypełnianie i transformacja wypełnień
Rysowanie obiektów, wypełnianie i transformacja wypełnień
Zadania do samodzielnego wykonania
Zadanie 1 – Rysowanie prostych obiektów
Oto kod, który narysuje prosty obiekt graficzny - prostokąt o wymiarach stołu montażowego:
var bgshape:Sprite;
var default_bg_color:uint = 0x000000;
bgshape = new Sprite();
bgshape.graphics.beginFill(default_bg_color);
bgshape.graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight);
addChild(bgshape);
Przycisk do zmiany
koloru tła (zadanie 2)
Narysowany
prostokąt
Można dodać też kod, który będzie dopasowywał wielkość prostokąta do aktualnej wielkości stołu
montażowego:
stage.addEventListener(Event.RESIZE, resizeBGWithStage);
function resizeBGWithStage(e:Event){
try {bgshape.width = stage.stageWidth;
bgshape.height = stage.stageHeight;
} catch(e){}
}
Zadanie 2
Dodaj do projektu przycisk i nadaj mu nazwę instancji (np. red_btn). Napisz kod, który będzie powodował
zmianę koloru wypełnienia dużego prostokąta na kolor eksponowany na przycisku – w tym przykładzie jest
to kolor czerwony. Są dwie możliwości. W obydwu wykorzystywany jest obiekt ColorTransform:
1: Pierwsza możliwość powoduje zmianę koloru z wykorzystaniem tylko właściwości color obiektu
ColorTransform.
Kod:
function colorBase(event:MouseEvent):void{
var myColorTransform = new ColorTransform();
myColorTransform.color = 0xCC0000;
bgshape.transform.colorTransform = myColorTransform;
}
1
red_btn.addEventListener(MouseEvent.CLICK,colorBase);
2: Druga możliwość powoduje zmianę koloru z wykorzystaniem właściwości redOffset, blueOffset
lub greenOffset obiektu ColorTransform.
function colorBase(event:MouseEvent):void{
var myColorTransform = new ColorTransform();
myColorTransform.color = default_bg_color;
myColorTransform.redOffset = 200;
bgshape.transform.colorTransform = myColorTransform;
}
red_btn.addEventListener(MouseEvent.CLICK,colorBase);
Zadanie 3
Dodaj do projektu modyfikację polegającą na płynnej zmianie koloru wypełnienia prostokąta. Zadanie to
umożliwi obiekt Timer().
Propozycja rozwiązania tego zadania na bazie już istniejącego kodu z poprzednich zadań:
Całkowitej zmianie ulega funkcja colorBase, która określa to co stanie się po kliknięciu przycisku. Ta
funkcja nie będzie już bezpośrednio odpowiedzialna za transformację koloru, tak jak dotychczas, tylko
będzie uruchamiała obiekt Timer (uruchamiała odliczania kroków, które przebiegają w określonych
okresach czasowych) oraz wywoła funkcję timerHandler, która to od momentu kliknięcia przycisku
wykona się tyle razy ile przewiduje wyjściowy parametr repeat.
Parametr repeat określa ile interwałów czasowych ma upłynąć do zatrzymania licznika. Ilość interwałów
będzie wykorzystana do uzyskania efektu krokowej zmiany koloru – z każdym krokiem zmiana będzie coraz
bardziej widoczna. Długość trwania interwału (okresu) określa pierwszy z parametrów wyjściowych obiektu
Timer(), podawany jest w milisekundach.
Ilość kroków transformacji koloru wykorzystywana jest w funkcji timerHandler. Wiemy już, że dzięki
repeat licznik obiektu Timer zliczy 20 wykonań. Ponieważ zakładamy transformację wypełnienia z koloru
czarnego do czerwonego to wiemy też, że przesunięcie koloru musi nastąpić w obrębie składowej czerwonej
z wartości 0 na około 200. Dzięki wykorzystaniu obiektu Timer możemy przy każdym okresie trwającym
milisekundę (lub dłużej jeśli zwiększymy wartość) zwiększać udział barwy czerwonej np. o 10. Przy 20-tym
okresie całkowite przesunięcie w obrębie czerwieni wynosić będzie 200. Pozostaje jeszcze rozwiązać
zagadkę: skąd wiadomo kiedy licznik obiektu Timer zakończy odliczanie i jak w ogóle wykorzystać ten
obiekt dla naszych celów, czyli do stopniowej zmiany koloru? Tu z pomocą przychodzi właściwość
currentCount obiektu zdarzenia TimerEvent. Obiekt Timer wywołuje obiekt zdarzenia
TimerEvent za każdym razem po upływie zadanego przedziału czasu, a wtedy wartość currentCount
zwiększa się iteracyjnie.
Kod do rozwiązania zadania:
//powołanie dodatkowej zmiennej, która zapobiega nieoczekiwanej zmianie koloru
var statusBlack:Boolean;
statusBlack = true;
2
function colorBase(event:MouseEvent):void{
if(statusBlack==true){
myTimer.start();
myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
statusBlack=false;}
}
var
var
var
var
delay:Number = 1;
repeat:uint = 20;
myTimer:Timer = new Timer(delay, repeat);
transformLoop:Number;
function timerHandler(event:TimerEvent):void{
transformLoop = event.target.currentCount;
var myColorTransform = new ColorTransform();
myColorTransform.color = default_bg_color;
myColorTransform.redOffset = transformLoop*10;
bgshape.transform.colorTransform = myColorTransform;
}
Zadanie 4 - Płynna zmiana koloru z udziałem wielu przycisków.
Dodaj do projektu więcej przycisków, które będą służyć do zmiany koloru prostokąta, oczywiście zmiana
koloru tak jak poprzednio ma przebiegać w płynny sposób. Przyciski muszą mieć nazwy instancji. Należy
dobrze określić kolory, jakie chcemy wykorzystać i zapamiętać, lub zapisać wartość składowych RGB danego
koloru, np. kolor czerwony (250,0,0).
Potrzebne będą dodatkowe zmienne, które przechowają wartość każdej składowej koloru aktualnego (kp) i
każdej składowej koloru, do którego dążymy (kk) – łącznie będzie to 6 zmiennych:
var
var
var
var
var
var
kkRed:uint;
kkGreen:uint;
kkBlue:uint;
kpRed:uint;
kpGreen:uint;
kpBlue:uint;
Potrzebne będą także trzy zmienne do przechowywania wartości całkowitej koloru (dwie z nich są całkiem
nowe, a jedna towarzyszy nam już od pierwszego zadania – zapisuje kolor wypełnienia zainicjalizowany przy
tworzeniu prostokąta):
var default_bg_color:uint = 0x000000;
var current_bg_color:uint; //kolor bieżący
var new_bg_color:uint;
//kolor, do którego dążymy
Znacznie zmieni się funkcja colorBase, która uzyskuje teraz rozgałęzioną instrukcję warunkową
odpowiedzialną przede wszystkim za właściwe przydzielenie wartości zmiennym określającym wartość
koloru docelowego i jego składowych (new_bg_color, kkRed, kkGreen, kkBlue). To, jaką wartość przyjmą te
zmienne zależy od klikniętego przycisku, wszak funkcja colorBase musi być przypisana do wszystkich
3
„kolorowych” przycisków jako odpowiedź na zdarzenie kliknięcia. Poza tym w tej funkcji pojawia się także
nasłuchiwanie zdarzeń obiektu Timer:
- zdarzenie TIMER wywołuje funkcję timerHandler odpowiedzialną za płynną transformację koloru;
- zdarzenie TIMER_COMPLETE wywoła funkcję bgHandler odpowiedzialną za „utrwalenie” wartości
koloru tła i jego składowych po zakończeniu każdej transformacji – kolor ten będzie stanowił kolor
wyjściowy dla kolejnej transformacji.
function colorBase(event:MouseEvent):void{
myTimer.start();
myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, bgHandler);
if(event.target==red_btn){
new_bg_color = 0xCC0000; kkRed=200; kkGreen=0; kkBlue=0;}
else if(event.target==blue_btn){
new_bg_color = 0x0000CC; kkRed=0; kkGreen=0; kkBlue=200;}
else if(event.target==violet_btn){
new_bg_color = 0x643264; kkRed=100; kkGreen=50; kkBlue=100;}
else if(event.target==orange_btn){
new_bg_color = 0xFF6600; kkRed=250; kkGreen=100; kkBlue=0;}
else{current_bg_color = default_bg_color; kpRed=0; kpGreen=0; kpBlue=0;}
}
function timerHandler(event:TimerEvent):void{
transformLoop = event.target.currentCount;
var myColorTransform = new ColorTransform();
myColorTransform.color = current_bg_color;
myColorTransform.redOffset = kpRed + Math.floor((kkRed - kpRed)/repeat) *
transformLoop;
myColorTransform.blueOffset = kpBlue + Math.floor((kkBlue - kpBlue)/repeat)
* transformLoop;
myColorTransform.greenOffset = kpGreen + Math.floor((kkGreen –
kpGreen)/repeat) * transformLoop;
bgshape.transform.colorTransform = myColorTransform;
}
function bgHandler(event:TimerEvent):void{
myTimer.reset();
current_bg_color = new_bg_color;
kpRed=kkRed; kpGreen=kkGreen; kpBlue=kkBlue;
}
4

Podobne dokumenty