W przykładowej aplikacji SpriteArranger wykorzystano aplikację Geometric Shapes opisaną osobno w podręczniku
Poznajemy język ActionScript 3.0
.
Przykładowa ilustracja SpriteArranger prezentuje pewną liczbę koncepcji postępowania z obiektami wyświetlanymi:
-
Rozszerzanie klas obiektów wyświetlanych
-
Dodawanie obiektów do listy wyświetlania
-
Tworzenie warstw obiektów wyświetlanych i praca z kontenerami obiektów wyświetlanych
-
Reagowanie na zdarzenia obiektów wyświetlanych
-
Korzystanie z właściwości i metod obiektów wyświetlanych
Aby pobrać pliki tej przykładowej aplikacji, należy przejść na stronę
www.adobe.com/go/learn_programmingAS3samples_flash_pl
. Pliki aplikacji SpriteArranger znajdują się w folderze Examples/SpriteArranger. Aplikacja składa się z następujących plików:
File
|
Opis
|
SpriteArranger.mxml
lub
SpriteArranger.fla
|
Główny plik aplikacji w formacie Flash (FLA) lub Flex (MXML).
|
com/example/programmingas3/SpriteArranger/CircleSprite.as
|
Klasa definiująca typ obiektu Sprite, który renderuje okrąg na ekranie.
|
com/example/programmingas3/SpriteArranger/DrawingCanvas.as
|
Klasa definiująca obszar roboczy będący kontenerem obiektów wyświetlanych, który zawiera obiekty GeometricSprite.
|
com/example/programmingas3/SpriteArranger/SquareSprite.as
|
Klasa definiująca typ obiektu Sprite, który renderuje kwadrat na ekranie.
|
com/example/programmingas3/SpriteArranger/TriangleSprite.as
|
Klasa definiująca typ obiektu Sprite, który renderuje trójkąt na ekranie.
|
com/example/programmingas3/SpriteArranger/GeometricSprite.as
|
Klasa, która rozszerza obiekt Sprite, służy do definiowania kształtu ekranowego. Rozszerzenia tej klasy stanowią klasy: CircleSprite, SquareSprite i TriangleSprite.
|
com/example/programmingas3/geometricshapes/IGeometricShape.as
|
Podstawowy interfejs definiujący metody implementowane przez klasy wszystkich kształtów geometrycznych.
|
com/example/programmingas3/geometricshapes/IPolygon.as
|
Interfejs definiujący metody implementowane przez klasy kształtów geometrycznych, które mają wiele boków.
|
com/example/programmingas3/geometricshapes/RegularPolygon.as
|
Typ kształtu geometrycznego, który ma boki o równej długości rozmieszczone symetrycznie wokół środka kształtu.
|
com/example/programmingas3/geometricshapes/Circle.as
|
Typ kształtu geometrycznego definiujący koło.
|
com/example/programmingas3/geometricshapes/EquilateralTriangle.as
|
Podklasa klasy RegularPolygon definiująca trójkąt równoboczny.
|
com/example/programmingas3/geometricshapes/Square.as
|
Podklasa klasy RegularPolygon definiująca prostokąt o równych bokach.
|
com/example/programmingas3/geometricshapes/GeometricShapeFactory.as
|
Klasa zawierająca metodę produkcyjną służącą do tworzenia kształtów określonego typu i rozmiaru.
|
Definiowanie klas SpriteArranger
Aplikacja SpriteArranger umożliwia użytkownikowi dodawanie różnych obiektów wyświetlanych do ekranowego „obszaru roboczego”.
Klasa DrawingCanvas definiuje obszar rysowania — tup kontenera obiektów wyświetlanych, do którego użytkownik może dodawać kształty ekranowe. Te ekranowe kształty są instancjami jednej z podklas klasy GeometricSprite.
Klasa DrawingCanvas
W pakiecie Flex wszystkie podrzędne obiekty wyświetlane dodane do obiektu Container muszą należeć do klasy podrzędnej dla klasy mx.core.UIComponent. Ta aplikacja dodaje instancję klasy DrawingCanvas jako element podrzędny obiektu mx.containers.VBox w postaci kodu MXML zdefiniowanego w pliku SpriteArranger.mxml. Dziedziczenie zostało określone w deklaracji klasy DrawingCanvas, co przedstawiono poniżej:
public class DrawingCanvas extends UIComponent
Klasa UIComponent dziedziczy z klas DisplayObject, DisplayObjectContainer i Sprite, a kod w klasie DrawingCanvas korzysta z metod i właściwości tych klas.
Klasa DrawingCanvas rozszerza klasę Sprite, a to dziedziczenie zostało zdefiniowane w deklaracji klasy DrawingCanvas w następujący sposób:
public class DrawingCanvas extends Sprite
Klasa Sprite jest podklasą klas DisplayObjectContainer i DisplayObject, a klasa DrawingCanvas korzysta z właściwości i metod tych klas.
Metoda konstruktora
DrawingCanvas()
konfiguruje właściwość
bounds
obiektu Rectangle — ta właściwość jest później wykorzystywana podczas rysowania obrysu obszaru roboczego. Następnie wywołuje metodę
initCanvas()
w następujący sposób:
this.bounds = new Rectangle(0, 0, w, h);
initCanvas(fillColor, lineColor);
Jak przedstawiono w poniższym przykładzie, metoda
initCanvas()
definiuje różne właściwości obiektu DrawingCanvas, które zostały przekazane jako argumenty do funkcji konstruktora:
this.lineColor = lineColor;
this.fillColor = fillColor;
this.width = 500;
this.height = 200;
Następnie metoda
initCanvas()
wywołuje metodę
drawBounds()
, która rysuje obszar roboczy za pomocą właściwości
graphics
klasy DrawingCanvas. Właściwość
graphics
jest dziedziczona z klasy Shape.
this.graphics.clear();
this.graphics.lineStyle(1.0, this.lineColor, 1.0);
this.graphics.beginFill(this.fillColor, 1.0);
this.graphics.drawRect(bounds.left - 1,
bounds.top - 1,
bounds.width + 2,
bounds.height + 2);
this.graphics.endFill();
Poniższe dodatkowe metody klasy DrawingCanvas są wywoływane na podstawie interakcji użytkownika z aplikacją:
Klasa GeometricSprite i jej podklasy
Każdy obiekt wyświetlany, który może zostać dodany przez użytkownika do obszaru roboczego, jest instancją jednej z poniższych podklas klasy GeometricSprite:
-
CircleSprite
-
SquareSprite
-
TriangleSprite
Klasa GeometricSprite stanowi rozszerzenie klasy flash.display.Sprite:
public class GeometricSprite extends Sprite
Klasa GeometricSprite zawiera pewną liczbę właściwości wspólnych dla wszystkich obiektów GeometricSprite. Zostają one ustawione w funkcji konstruktora w zależności od parametrów wprowadzonych do funkcji. Na przykład:
this.size = size;
this.lineColor = lColor;
this.fillColor = fColor;
Właściwość
geometricShape
klasy GeometricSprite definiuje interfejs IGeometricShape, który definiuje właściwości matematyczne kształtu, ale nie definiuje właściwości wyświetlania. Klasy, które implementują interfejs IGeometricShape, są zdefiniowane w przykładowej aplikacji GeometricShapes opisanej w podręczniku
Poznajemy język ActionScript 3.0
.
Klasa GeometricSprite definiuje metodę
drawShape()
, która jest następnie udoskonalana w definicjach zastępowania w poszczególnych podklasach klasy GeometricSprite. Więcej informacji zawiera poniższa sekcja „Dodawanie obiektów wyświetlanych do obszaru roboczego”.
Klasa GeometricSprite udostępnia również następujące metody:
Dodawanie obiektów wyświetlanych do obszaru roboczego
Gdy użytkownik kliknie przycisk Dodaj kształt, aplikacja wywołuje metodę
addShape()
klasy DrawingCanvas. Metoda tworzy nową instancję GeometricSprite poprzez wywołanie odpowiedniej funkcji konstruktora jednej z podklas klasy GeometricSprite, jak w poniższym przykładzie:
public function addShape(shapeName:String, len:Number):void
{
var newShape:GeometricSprite;
switch (shapeName)
{
case "Triangle":
newShape = new TriangleSprite(len);
break;
case "Square":
newShape = new SquareSprite(len);
break;
case "Circle":
newShape = new CircleSprite(len);
break;
}
newShape.alpha = 0.8;
this.addChild(newShape);
}
Każda metoda konstruktora wywołuje metodę
drawShape()
, która korzysta z właściwości
graphics
klasy (dziedziczonej z klasy Sprite) w celu rysowania odpowiedniej grafiki wektorowej. Na przykład: metoda
drawShape()
klasy CircleSprite zawiera poniższy kod:
this.graphics.clear();
this.graphics.lineStyle(1.0, this.lineColor, 1.0);
this.graphics.beginFill(this.fillColor, 1.0);
var radius:Number = this.size / 2;
this.graphics.drawCircle(radius, radius, radius);
Przedostatnia linia funkcji
addShape()
ustawia właściwość
alpha
obiektu wyświetlanego (dziedziczoną z klasy DisplayObject) w taki sposób, że każdy obiekt wyświetlany dodawany do obszaru roboczego staje się częściowo przezroczysty, co sprawia, że obiekty znajdujące się za nim stają się widoczne.
Ostatnia linia metody
addChild()
dodaje nowy obiekt wyświetlany do podrzędnej listy instancji klasy DrawingCanvas, która już znajduje się na liście wyświetlania. To sprawia, że nowy obiekt wyświetlany pojawia się na stole montażowym.
Interfejs aplikacji zawiera dwa pola tekstowe:
selectedSpriteTxt
i
outputTxt
. Właściwości tekstowe tych pól tekstowych są aktualizowane z uwzględnieniem informacji o obiektach GeometricSprite, które zostały dodane do obszaru roboczego lub wybrane przez użytkownika. Klasa GeometricSprite obsługuje to zadanie zgłaszania informacji poprzez zastąpienie metody
toString()
w następujący sposób:
public override function toString():String
{
return this.shapeType + " of size " + this.size + " at " + this.x + ", " + this.y;
}
Dla właściwości
shapeType
zostaje ustawiona odpowiednia wartość w metodzie konstruktora poszczególnych klas GeometricSprite. Na przykład: metoda
toString()
może zwrócić poniższą wartość dla instancji CircleSprite dodanej jako ostatnia do instancji DrawingCanvas:
Circle of size 50 at 0, 0
Metoda
describeChildren()
klasy DrawingCanvas wykonuje pętle przez podrzędną listę obszaru roboczego, wykorzystując właściwość
numChildren
(dziedziczoną z klasy DisplayObjectContainer) w celu ustawienia limitu dla pętli
for
. Metoda generuje ciąg znaków zawierający poszczególne elementy podrzędne, w następujący sposób:
var desc:String = "";
var child:DisplayObject;
for (var i:int=0; i < this.numChildren; i++)
{
child = this.getChildAt(i);
desc += i + ": " + child + '\n';
}
Wynikowy ciąg znaków jest wykorzystywany do ustawienia właściwości
text
pola tekstowego
outputTxt
.
Klikanie i przeciąganie obiektów wyświetlanych
Gdy użytkownik kliknie instancję GeometricSprite, aplikacja wywołuje moduł
onMouseDown()
obsługi zdarzeń. Poniżej przedstawiono, że moduł obsługi wykrywa zdarzenia kliknięcia w funkcji konstruktora klasy GeometricSprite:
this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
Następnie metoda
onMouseDown()
wywołuje metodę
showSelected()
obiektu GeometricSprite. Jeśli jest to pierwsze wywołanie metody dla tego obiektu, ta metoda tworzy nowy obiekt Shape o nazwie
selectionIndicator
i wykorzystuje właściwość
graphics
obiektu Shape w celu narysowania czerwonego prostokąta, jak poniżej:
this.selectionIndicator = new Shape();
this.selectionIndicator.graphics.lineStyle(1.0, 0xFF0000, 1.0);
this.selectionIndicator.graphics.drawRect(-1, -1, this.size + 1, this.size + 1);
this.addChild(this.selectionIndicator);
Jeśli nie jest to pierwsze wywołanie metody
onMouseDown()
, metoda ustawia właściwość
visible
kształtu
selectionIndicator
(właściwość dziedziczona z klasy DisplayObject), co przedstawiono poniżej:
this.selectionIndicator.visible = true;
Metoda
hideSelected()
ukrywa kształt
selectionIndicator
poprzednio wybranego obiektu, ustawiając dla właściwości
visible
wartość
false
.
Metoda
onMouseDown()
obsługi zdarzeń wywołuje również metodę
startDrag()
(dziedziczoną z klasy Sprite), która zawiera poniższy kod:
var boundsRect:Rectangle = this.parent.getRect(this.parent);
boundsRect.width -= this.size;
boundsRect.height -= this.size;
this.startDrag(false, boundsRect);
Dzięki temu użytkownik może przeciągać wybrany obiekt na obszarze roboczym w granicach określonych przez prostokąt
boundsRect
.
Gdy użytkownik zwolni przycisk myszy, następuje wywołanie zdarzenia
mouseUp
. Metoda konstruktora DrawingCanvas ustawia następujący detektor zdarzeń:
this.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
Ten detektor jest ustawiony dla obiektu DrawingCanvas, a nie dla poszczególnych obiektów GeometricSprite. Dzieje się tak podczas przeciągania obiektu GeometricSprite — może zostać zakończone za innym obiektem wyświetlanym (inny obiekt GeometricSprite) po zwolnieniu przycisku myszy. Obiekt wyświetlany na pierwszym planie otrzyma zdarzenie zwolnienia przycisku myszy, ale obiekt wyświetlany, który jest przeciągany przez użytkownika, nie otrzyma tego zdarzenia. Dodanie detektora do obiektu DrawingCanvas zapewnia, że zdarzenie jest zawsze obsługiwane.
Metoda
onMouseUp()
wywołuje metodę
onMouseUp()
obiektu GeometricSprite, która następnie wywołuje metodę
stopDrag()
obiektu GeometricSprite.
Zmiana układu warstw obiektów wyświetlanych
Interfejs użytkownika aplikacji zawiera przyciski Przenieś na spód, Przenieś w dół, Przenieś w górę i Przenieś na wierzch. Gdy użytkownik kliknie jeden z tych przycisków, aplikacja wywoła odpowiednią metodę klasy DrawingCanvas:
moveToBack()
,
moveDown()
,
moveUp()
lub
moveToFront()
. Na przykład: metoda
moveToBack()
zawiera następujący kod:
public function moveToBack(shape:GeometricSprite):void
{
var index:int = this.getChildIndex(shape);
if (index > 0)
{
this.setChildIndex(shape, 0);
}
}
Ta metoda korzysta z metody
setChildIndex()
(dziedziczonej z klasy DisplayObjectContainer) w celu ustawienia obiektu wyświetlanego w położeniu indeksu 0 na liście podrzędnej instancji DrawingCanvas (
this
).
Metoda
moveDown()
działa podobnie, ale zmniejsza indeks obiektu wyświetlanego o 1 na liście podrzędnej instancji DrawingCanvas:
public function moveDown(shape:GeometricSprite):void
{
var index:int = this.getChildIndex(shape);
if (index > 0)
{
this.setChildIndex(shape, index - 1);
}
}
Metody
moveUp()
i
moveToFront()
działają podobnie jak metody
moveToBack()
i
moveDown()
.
|
|
|