Przykład z obiektem wyświetlanym: SpriteArranger

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

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() .