środa, 1 września 2010

Pierwszy kawałek kodu: NGUIBOX

Kod tej klasy jest prosty, ale krótki opis jest niżej.
class NGUIObject
{
 public:
        NGUIObject *Parent;
};

class NGUIBox : public NGUIObject
{
 public:
  SDL_Rect Dimensions;
  SDL_Surface * Canvas;
  Uint32 Color;

  NGUIBox();
  ~NGUIBox();

  virtual void Draw();
  virtual void SetDimensions(int x, int y, int w, int h);
  void ChangeColor(Uint32 color);
  void Blit(SDL_Surface *dest);
  virtual void HandleEvent(SDL_Event *event);
  virtual void DoLogic();
  virtual void OnMouseDown(int x, int y, int button = SDL_BUTTON_LEFT);
  virtual void OnMouseUp(int x, int y, int button = SDL_BUTTON_LEFT);
  virtual void OnMouseMotion(int x, int y);
  virtual void OnKeyDown(SDLKey sym, SDLMod mod);
  virtual void OnKeyUp(SDLKey sym, SDLMod mod);
};


Klasę NGUIObject dodałem na wszelki wypadek, prawdopodobnie zostanie wywalona, a "Parent" przeniesiony do Box'a. Wskaźnik ten pełni dość ważną funkcję - dzięki niemu będzie można się w innych klasach GUI odwoływać się do Containera, w których siedzą. Przydatne, jeśli potraktujemy jako całość np. menu z przyciskami.

Jedziemy od końca. Funkcje aż do DoLogic włącznie nie robią w Box'ie nic. Są wirtualne, gdyż obiekty dziedziczące po tejże klasie różnie mogą reagować na "bodźce" od użytkownika, a funkcja DoLogic została dodana...a w sumie nie wiem po co :P. Narazie nie wymyśliłem zastosowania.

Ponieważ struktura SDL_event opisuje wszystkie rodzaje eventów, jakie może rejestrować SDL, przydało by się jakieś rozgraniczenie. Funkcja ta sprawdza, jaki rodzaj eventu jest w tym momencie przenoszony, a potem wywołuje odpowiednią funkcję (z tych opisanych wyżej).

Funkcja Blit nakłada warstwę(zacznę tak nazywać SDL_Surface, ok?) Canvas na podaną w argumencie. W ten sposób kiedyśtam zobaczymy ją na ekranie.

Funkcja ChangeColor istnieje w sumie tylko do debugu - wiadomo czy dana klasa GUI wogóle się rysuje.

Funkcja SetDimensions wpakowuje podane rozmiary do Dimensions, a potem tworzy z nimi nową warstwę (gdyż nie da się, a przynajmiej nie wiem jak, zmienić rozmiarów istniejącej warstwy). Sprawdza przy okazji, czy wcześniej już warstwy nie zrobiliśmy, jeśli tak to usuwamy starą (zapobiegamy wyciekowi pamięci).

Funkcja Draw odświeża zawartość warstwy Canvas, wywołujemy ją w każdej klatce.

Jest późno, więc nie zdążyłem napisać demka do main.c, zrobię to przy następnym apdejcie.

4 komentarze:

  1. Nie pisałem już całe wieki w C++, ale przeglądając kod pliku GUIcore.cpp na code.google.com, zwróciłem uwagę, że wszędzie używasz NGUIBox:: przed składowymi klasy.
    Zwykłe this-> nie wystarczy? Czy o czymś zapomniałem?

    OdpowiedzUsuń
  2. Nie trzeba kompletnie nic stawiać, oddzielam w ten sposób składowe klasy od argumentów i zmiennych deklarowanych wewnątrz funkcji.

    OdpowiedzUsuń
  3. Właśnie do tego zawsze używałem this->, wydaje mi się krótsze i bardziej przejrzyste. Ale o gustach się nie dyskutuje.

    OdpowiedzUsuń
  4. W sumie masz rację, pozmieniam jeśli się wyrobię.

    OdpowiedzUsuń