Java - prosta biblioteka graficzna G

19.11.2009 - Michał Karpiński
TrudnośćTrudność

Kilka słów o stylach

Gwiazdka wyświetla się na ekranie – to już coś, ale kilka czarnych kresek na nikim wrażenia nie zrobi. Nauczę Cię teraz, jak nadawać figurom różne właściwości, np. kolor wypełneinia czy grubość linii. Innymi słowi – pokażę jak kontrolować styl wyświetlanych obiektów. Działanie stylów już zapewne widziałeś w aplecie na pierwszej stronie artykułu.

Obsługą stylów zajmuje się klasa GStyle. Wróćmy do naszego przykładu i nadajmy gwiazdce jakieś właściwości:

1
2
3
4
5
6
7
8
9
10
11
public Gwiazda(){
  star_ = new GSegment();
                
  GStyle starStyle = new GStyle();
  starStyle.setForegroundColor (Color.RED);
  starStyle.setBackgroundColor (Color.YELLOW);
  starStyle.setLineWidth (3);
  setStyle (starStyle);
        
  addSegment (star_);
}

Zmiany dokonywane są tylko w konstruktorze klasy Gwiazda. Przypatrzmy się bliżej liniom 4-8:

  • linia 4: definiujemy nowy obiekt typu GStyle

  • linia 5: ustawiamy kolor obramowania na czerwony

  • linia 6: ustawiamy kolor wypełnienia na żółty

  • linia 7: ustawiamy grubość obramowania na trzy piksele

  • linia 8: ostatecznie utożsamiamy styl z obiektem Gwiazda

Prosta animacja

Kolejną rzeczą, która będzie Ci potrzebna, jest umiejętność poruszania obiektami.

Kliknij gdziekolwiek w poniższym aplecie, aby zobaczyć krótką animację.

Jeżeli nie widzisz tego apletu to musisz włączyć obsługę Javy w swojej przeglądarce.

Kod powyższego apletu można ściągnąć tutaj.

Weźmy jakikolwiek wielokąt, np. kwadrat i nazwijmy go Box. Zdefiniujemy go standardowo (jako osobna klasa dziedzicząca po klasie GObject), ale dodatkowo dodamy do klasy Box kilka pomocniczych metod. Przyjrzyjmy się bliżej pełnej definicji naszego obiektu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Box extends GObject{
  private GSegment  box;
  private int x_, y_, w_, h_;
 
  public Box (int x,int y, int width, int height){
    setPosition(x,y);
    w_ = width;
    h_ = height;
    GStyle style = new GStyle();
    style.setForegroundColor (new Color (255, 0, 0));
    style.setBackgroundColor (new Color (255, 150, 150));
    setStyle (style);
    
    box = new GSegment();
    addSegment (box);
  }
  
  public void setPosition (int x, int y){ x_ = x; y_ = y; }
  public int getX(){return x_;}
  public int getY(){return y_;}
  public int getWidth(){return w_;}
  public int getHeight(){return h_;}
  public void draw(){
    box.setGeometry(Geometry.createRectangle(x_, y_, w_, h_));
  }
}

Zapewne większość kodu nie jest Ci obca. Zajmijmy się bardziej interesującymi liniami:

  • linia 18: metoda setPosition ustawia współrzedne kwadratu

  • linia 19-20: metody getX() oraz getY() zwracają współrzedne miejsca, w którym obecnie znajduje się kwadrat

  • linia 21-22: metody getWidth() oraz getHeight() zwracają kolejno szerokość i wysokość kwadratu

  • linia 24: w metodzie createRectangle używamy zmiennych pomocniczych do rysowania kwadratu

Załóżmy, że już wcześniej utworzyliśmy obiekt typu Box i przypisaliśmy go do zmiennej klocek. Teraz będziemy chcieli wprawić nasz obiekt w ruch. Na początek wystarczy, aby klocek wykonał stały ruch w prawo, dopóki nie napotka krawędzi ekranu. Poniżej znajdują się dwie funkcje odpowiedzialne za ruch klocka.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void startAnimation(){
  int vel = 5; // predkość
                
  while(true){  
    if(klocek.getX() < getWidth() - klocek.getWidth())
      boxMoved(vel);
    else
      break;
  }
}
 
public void boxMoved(int vel){
  klocek.setPosition(klocek.getX()+vel, klocek.getY());
  klocek.redraw();
  scene.refresh();
}

Ciała funkcji startAnimation nie trzeba tłumaczyć. "Poruszamy się" w prawo, co 5 pikseli z każdym wykonaniem pętli. Poruszanie się realizuje funkcja boxMoved, w której zmieniamy współrzędną X klocka o wartość zmiennej vel. Następnie przerysowujemy obiekt i odświeżamy scenę.

Teraz wystarczy, że umieścisz na końcu konstruktora głównej klasy:

1
startAnimation();

3.666665
Twoja ocena: Brak Ocena: 3.7 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com