Rysowanie linii i krzywych

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

Wszystkie rysunki tworzone za pomocą instancji klasy Graphics są oparte na prostych liniach i krzywych. W związku z tym każdy rysunek w języku ActionScript musi być wykonywany według podobnej procedury:

  • Zdefiniuj style linii i wypełnień.

  • Ustaw początkową pozycję rysowania.

  • Narysuj linie, krzywe i kształty (opcjonalnie przesuwając punkt rysowania).

  • W razie potrzeby zakończ tworzenie wypełnienia.

Definiowanie stylów linii i wypełnień

Aby możliwe było rysowanie za pomocą właściwości graphics wystąpienia klasy Shape, Sprite lub MovieClip, należy najpierw zdefiniować styl (rozmiar i kolor linii oraz kolor wypełnienia), jaki będzie obowiązywał przy rysowaniu. Podobnie jak rysowanie za pomocą narzędzi w programie Adobe® Flash® Professional lub innych aplikacjach graficznych, rysowanie z poziomu kodu ActionScript może odbywać się z obrysem lub bez obrysu i z wypełnieniem bądź bez wypełnienia. Do określania wyglądu obrysu służą metody lineStyle() i lineGradientStyle() . Aby utworzyć pełną linię, należy użyć metody lineStyle() . W wywołaniu tej metody najczęściej określa się pierwsze trzy parametry: grubość, kolor i przezroczystość (alfa) linii. Poniższy przykład wiersz kodu powoduje, że w kształt myShape będzie rysowany liniami o grubości 2 pikseli, w kolorze czerwonym (0x990000), z kryciem 75%.

myShape.graphics.lineStyle(2, 0x990000, .75);

Domyślna wartość parametru alpha wynosi 1,0 (100%), a zatem jeśli linia ma być w pełni kryjąca, można pominąć ten parametr. Metoda lineStyle() przyjmuje również dwa dodatkowe parametry dotyczące przyciągania pikseli i trybu skalowania; więcej informacji o korzystaniu z tych parametrów zawiera opis metody Graphics.lineStyle() w Skorowidzu języka ActionScript 3.0 dla platformy Adobe Flash .

Aby utworzyć linię z gradientem, należy skorzystać z metody lineGradientStyle() . Ta metoda została opisana w sekcji Tworzenie linii i wypełnień gradientowych .

Jeśli chcemy utworzyć wypełniony kształt, wywołujemy metodę beginFill() , beginGradientFill() , beginBitmapFill() lub beginShaderFill() przed rozpoczęciem rysowania. Najprostsza z tych metod, beginFill() , ma dwa parametry: kolor wypełnienia oraz (opcjonalnie) wartość alfa dla koloru wypełnienia. Na przykład, jeśli chcemy narysować kształt z jednolitym zielonym wypełnieniem, należałoby mżyć następującego kodu (przy założeniu, że rysujemy w obiekcie o nazwie myShape ):

myShape.graphics.beginFill(0x00FF00);

Wywołanie każdej metody dotyczącej wypełnienia powoduje niejawne zakończenie obowiązywania poprzedniego wypełnienia. Wywołanie każdej metody określającej obrys powoduje zastąpienie poprzedniego obrysu, ale nie wpływa na zdefiniowane wcześniej wypełnienie — i na odwrót.

Po określeniu stylu linii i właściwości wypełnienia następnym krokiem będzie wskazanie punktu początkowego rysunku. Instancja klasy Graphics ma przypisany punkt rysowania, będący odpowiednikiem ostrza ołówka na papierze. Każda operacja rysowania rozpoczyna się od bieżącego punktu rysowania. Początkowo punkt rysowania obiektu Graphics znajduje się we współrzędnych 0, 0 przestrzeni współrzędnych obiektu, w którym odbywa się rysowanie. Aby rozpocząć rysowanie w innym punkcie, można wywołać metodę moveTo() przed wywołaniem wybranej metody rysującej. Operacja ta jest odpowiednikiem oderwania ołówka od papieru i przeniesienia go w nowe miejsce.

Po umieszczeniu punktu rysowania można przystąpić do wywoływania metod rysujących lineTo() (do rysowania linii prostych) i curveTo() (do rysowania krzywych).

Podczas rysowania można w dowolnej chwili wywołać metodę moveTo() w celu przeniesienia punktu rysowania w nowe miejsce, bez rysowania linii.

Jeśli podczas rysowania określony został kolor wypełnienia, można domknąć wypełnienie za pomocą metody endFill() . Jeśli nie narysowano kształtu zamkniętego (innymi słowy, jeśli w momencie wywołania metody endFill() punkt rysowania nie znajduje się w punkcie początkowym kształtu), to po wywołaniu metody endFill() środowisko wykonawcze Flash automatycznie domyka kształt, rysując odcinek prosty od bieżącego punktu rysowania do miejsca określonego w ostatnim wywołaniu metody moveTo() . Jeśli rozpoczęto wypełnienie i nie wywołano metody endFill() , to wywołanie metody beginFill() (lub jednej z innych metod dotyczących wypełnienia) powoduje zamknięcie bieżącego wypełnienia i rozpoczęcie nowego.

Rysowanie linii prostych

Po wywołaniu metody lineTo() obiekt Graphics rysuje linię prostą od bieżącego punktu rysowania do współrzędnych określonych jako dwa parametry w wywołaniu metody. Rysowanie odbywa się przy zastosowaniu określonego wcześniej stylu linii. Na przykład poniższy wiersz kodu umieszcza punkt rysowania we współrzędnych 100, 100, po czym rysuje linię do punktu 200, 200:

myShape.graphics.moveTo(100, 100); 
myShape.graphics.lineTo(200, 200);

Poniższy przykładowy kod rysuje czerwony i zielony trójkąt o wysokości 100 pikseli:

var triangleHeight:uint = 100; 
var triangle:Shape = new Shape(); 
 
// red triangle, starting at point 0, 0 
triangle.graphics.beginFill(0xFF0000); 
triangle.graphics.moveTo(triangleHeight / 2, 0); 
triangle.graphics.lineTo(triangleHeight, triangleHeight); 
triangle.graphics.lineTo(0, triangleHeight); 
triangle.graphics.lineTo(triangleHeight / 2, 0); 
 
// green triangle, starting at point 200, 0 
triangle.graphics.beginFill(0x00FF00); 
triangle.graphics.moveTo(200 + triangleHeight / 2, 0); 
triangle.graphics.lineTo(200 + triangleHeight, triangleHeight); 
triangle.graphics.lineTo(200, triangleHeight); 
triangle.graphics.lineTo(200 + triangleHeight / 2, 0); 
 
this.addChild(triangle);

Rysowanie krzywych

Metoda curveTo() rysuje krzywą Béziera drugiego stopnia. Jest to łuk łączący dwa punkty (nazywane punktami zakotwiczenia) i wygięty w kierunku trzeciego punktu (nazywanego punktem sterującym). Pierwszym punktem zakotwiczenia jest bieżąca pozycja rysowania. W wywołaniu metody curveTo() należy przekazać cztery parametry: współrzędne x i y punktu sterującego oraz współrzędne x i y drugiego punktu zakotwiczenia. Na przykład poniższy kod rysuje krzywą rozpoczynającą się w punkcie 100, 100 i kończącą się w punkcie 200, 200. Ponieważ punkt sterujący ma współrzędne 175, 125, powstaje krzywa biegnąca w prawo, a potem w dół:

myShape.graphics.moveTo(100, 100); 
myShape.graphics.curveTo(175, 125, 200, 200);

Poniższy przykładowy kod rysuje czerwony i zielony okrągły obiekt o szerokości i wysokości 100 pikseli: Należy zwrócić uwagę, że z uwagi na cechy równania Béziera drugiego stopnia nie są to idealne okręgi.

var size:uint = 100; 
var roundObject:Shape = new Shape(); 
 
// red circular shape 
roundObject.graphics.beginFill(0xFF0000); 
roundObject.graphics.moveTo(size / 2, 0); 
roundObject.graphics.curveTo(size, 0, size, size / 2); 
roundObject.graphics.curveTo(size, size, size / 2, size); 
roundObject.graphics.curveTo(0, size, 0, size / 2); 
roundObject.graphics.curveTo(0, 0, size / 2, 0); 
 
// green circular shape 
roundObject.graphics.beginFill(0x00FF00); 
roundObject.graphics.moveTo(200 + size / 2, 0); 
roundObject.graphics.curveTo(200 + size, 0, 200 + size, size / 2); 
roundObject.graphics.curveTo(200 + size, size, 200 + size / 2, size); 
roundObject.graphics.curveTo(200, size, 200, size / 2); 
roundObject.graphics.curveTo(200, 0, 200 + size / 2, 0); 
 
this.addChild(roundObject);