Rysowanie ścieżek

Flash Player 10 i nowsze wersje, Adobe AIR 1.5 i nowsze wersje

W sekcji dotyczącej rysowania linii prostych i krzywych (patrz Rysowanie linii i krzywych) przedstawiono polecenia służące do rysowania pojedynczych linii (Graphics.lineTo()) lub krzywych (Graphics.curveTo()) oraz przemieszczania linii do innego punktu (Graphics.moveTo()) w celu uzyskania kształtu. W niektórych rozszerzonych elementach rysunkowego interfejsu API w języku ActionScript, takich jak metody Graphics.drawPath() i Graphics.drawTriangles(), w charakterze parametrów wykorzystywane są dotychczasowe polecenia rysowania. Można zatem w ramach jednej instrukcji wydać szereg poleceń Graphics.lineTo(), Graphics.curveTo() lub Graphics.moveTo(), które mają być wykonane przez środowisko wykonawcze Flash.

Dwa spośród udoskonaleń rysunkowego interfejsu API umożliwiają skonsolidowanie dotychczasowych poleceń w ramach metod Graphics.drawPath() i Graphics.drawTriangles():

  • Klasa wyliczeniowa GraphicsPathCommand: klasa GraphicsPathCommand kojarzy kilka poleceń rysunkowych z wartościami stałymi. Szereg takich wartości przekazywany jest jako parametr metody Graphics.drawPath(). Następnie, za pomocą jednego polecenia, można narysować cały kształt lub kilka kształtów. Można również dynamicznie modyfikować wartości przekazywane do tych metod i w ten sposób zmieniać już narysowane kształty.

  • Tablice wektorowe: tablice wektorowe, czyli obiekty typu Vector, zawierają szereg wartości danych konkretnego typu. Możemy zatem zapisać szereg stałych GraphicsPathCommand w obiekcie Vector oraz szereg współrzędnych w innym obiekcie Vector. Metoda Graphics.drawPath() lub Graphics.drawTriangles() powiąże te wartości i wygeneruje ścieżkę lub kształt.

Nie trzeba już wywoływać osobnego polecenia dla każdego segmentu kształtu. Na przykład metoda Graphics.drawPath() konsoliduje metody Graphics.moveTo(), Graphics.lineTo() i Graphics.curveTo(). Osobne wywołania tych metod zostają zastąpione abstrakcyjnymi identyfikatorami liczbowymi zdefiniowanymi w klasie GraphicsPathCommand. Operacja moveTo() jest oznaczona liczbą 1, a operacja lineTo() — liczbą 2. Tablicę tych wartości zapisujemy w obiekcie Vector.<int> używanym jako parametr commands. Następnie tworzymy następną tablicę zawierającą współrzędne jako obiekt Vector.<Number> używany w charakterze parametru data. Każda wartość GraphicsPathCommand odpowiada wartościom współrzędnych zapisanym w parametrze data, w którym każde dwie kolejne liczby definiują punkt w docelowej przestrzeni współrzędnych.

Uwaga: Wartości w wektorze nie są obiektami Point; wektor jest szeregiem liczb, a każda para liczb reprezentuje parę współrzędnych x/y.

Metoda Graphics.drawPath() dopasowuje poszczególne polecenia do odpowiednich danych punktów (zbioru dwóch lub czterech liczb) w celu wygenerowania ścieżki w obiekcie Graphics:

package{ 
import flash.display.*; 
 
public class DrawPathExample extends Sprite { 
    public function DrawPathExample(){ 
 
    var square_commands:Vector.<int> = new Vector.<int>(5,true); 
    square_commands[0] = 1;//moveTo 
    square_commands[1] = 2;//lineTo 
    square_commands[2] = 2; 
    square_commands[3] = 2; 
    square_commands[4] = 2; 
 
    var square_coord:Vector.<Number> = new Vector.<Number>(10,true); 
    square_coord[0] = 20; //x 
    square_coord[1] = 10; //y 
    square_coord[2] = 50; 
    square_coord[3] = 10; 
    square_coord[4] = 50; 
    square_coord[5] = 40; 
    square_coord[6] = 20; 
    square_coord[7] = 40; 
    square_coord[8] = 20; 
    square_coord[9] = 10; 
 
    graphics.beginFill(0x442266);//set the color 
    graphics.drawPath(square_commands, square_coord); 
    } 
} 
}

W powyższym przykładzie poszczególne polecenia i pary współrzędnych są kojarzone indywidualnie, tak aby widoczne były ich pozycje w tablicy, jednak możliwe byłoby również przypisanie ich w jednej instrukcji. Poniższy przykład ilustruje rysowanie tej samej gwiazdy poprzez przypisanie wartości do każdej tablicy w jednej instrukcji push():

package{ 
import flash.display.*; 
 
public class DrawPathExample extends Sprite { 
    public function DrawPathExample(){ 
 
    var square_commands:Vector.<int> = new Vector.<int>(); 
    square_commands.push(1, 2, 2, 2, 2); 
    var square_coord:Vector.<Number> = new Vector.<Number>(); 
    square_coord.push(20,10, 50,10, 50,40, 20,40, 20,10); 
 
    graphics.beginFill(0x442266); 
    graphics.drawPath(square_commands, square_coord); 
    } 
} 
}