sobota, 28 sierpnia 2010

Planowanie GUI

Zapewne zadziwia was tytuł wpisu. "Jak to, na ekranie nie widać nawet ludzika czy jakiegokolwiek obrazka, a on chce robić GUI??". Jednak nie jest to (aż tak)głupi krok na jaki wygląda, a już wyjaśniam dlaczego.

Zamierzam teraz napisać tylko szkielet, a mianowicie:

- klasę BOX, z której będą dziedziczyć wszystkie elementy interfejsu. Posiada swój własny SDL_Surface. Będzie to zwykły prostokąt z możliwością pokolorowania i wbudowanymi funkcjami odbierającymi eventy (OnMouseDown, OnMouseUp, OnMouseMotion itd.)

- klasę CONTAINER, która będzie przechowywać wskażniki do innych klas GUI, zajmować się przerysowywaniem Surfejsów "dzieci" na siebie i przekazywaniem eventów tam, gdzie trzeba.

- klasę WINDOW, która będzie "pakować" eventy w swoje bebechy (do jedynej klasy-dziecka, najrozsądniej wstawić tu CONTAINERa oczywiście :P) i rysować się na ekran.

Dzięki takiemu rozwiązaniu klasa rysująca świat gry może być klasą GUI, co eliminuje późniejszy problem "hardkodowania" przycisków na ekranie.

Klasy jak BUTTON czy PROGRESS_BAR dopiszę później, jak ludzik będzie mógł eksplorować świat :)

Niestety jestem zajęty przez te 2 dni i nie zrobię tego teraz, więc see ya poniedziałek.

środa, 25 sierpnia 2010

Pierwsza klasa - NScreen

Zaczniemy od czegoś prostego. Klasa obsługująca tworzenie głównej SDL_Surface(jak sama nazwa wskazuje - "powierzchnia". Mogą mieć różne rozmiary, od biedy można porównać z warstwami w programach graficznych. Za pomocą łączenia i przekształceń na nich tworzymy obraz widziany w oknie programu) i wyrzucania jej na ekran.
Przy okazji dorzuciłem define'a koloru, który będzie zamieniany na przezroczysty: jasnoniebieski.

/* graphics.h
 * NScreen class
 */

#ifndef HGRAPHICS
#define HGRAPHICS

#include <SDL.h>
#include <assert.h>

#define COLOR_TRANSPARENT 0x00, 0xFF, 0xFF

class NScreen
{
 public:
  static SDL_Surface * Screen;

  int Init(int width, int height);
  void Flip();
};

#endif

Dzięki temu, że deklarujemy Screen jako static, każdy obiekt tej klasy będzie miał identyczny wskaźnik. Przydatne, gdy będziemy używać właściwości Screena w innych klasach. Wystarczy wtedy stworzyć nowy obiekt NScreena, wygrzebać potrzebne dane i go zniszczyć.

Przyjrzyjmy się funkcji Init:
int NScreen::Init(int width, int height)
{
    NScreen::Screen = SDL_SetVideoMode (width, height, 32, SDL_SWSURFACE);
    if (NScreen::Screen == NULL)
    {
        return -1;
    }
    else
    {
        return 0;
    }
}
Kod jest prosty. Funkcja SDL_SetVideoMode ustawia bebechy SDLa i jednocześnie zwraca wskaźnik na SDL_Surface'a. Dwa pierwsze argumenty nie wymagają chyba komentarza. Trzeci argument to głębia obrazu - 32 bity na pixel. Czwarta określa, czy Surface ma być stworzony w pamięci RAM (wolniejsze wyrzucanie na ekran, szybsze operacje łączenia, przekształceń itd.) czy w pamięci karty graficznej (na odwrót).
Następnie sprawdzamy, czy operacja się udała.

piątek, 20 sierpnia 2010

Przygotowanie IDE

Przygotowania część druga.

Po zainstalowaniu Code::Blocks musimy podpiąć SDLa.
Tworzymy sobie folder LIBS np. na C, a w nim include i lib.
Ściągamy paczkę developera SDL pod MinGW32 z pod linku SDL-devel-1.2.14-mingw32.tar.gz
Wypakowujemy.
Kopiujemy zawartość folderu lib z paczki do LIBS/lib/.
Kopiujemy zawartość folderu include/SDL z paczki prosto do LIBS/include/.

Odpalamy Code::Blocks.
Wchodzimy w Settings->Compiler and debugger...-> zakładka Search Directories -> zakładka Compiler
Wciskamy Add, nawigujemy do LIBS/include.
Przechodzimy na zakładkę Linker.
Wciskamy Add, nawigujemy do LIBS/lib.
Zamykamy okienko.
Tworzymy nowy, pusty projekt.
Wchodzimy w Project->Properities...-> zakładka Build targets
Przestawiamy Type na "GUI application". Pozbędziemy się w ten sposób okienka konsoli, które pokazywałoby się obok głównego okna aplikacji.
Wracamy na zakładkę Project settings.
Wciskamy Project's build options...
Zmieniamy zakładkę na Linker settings.
W Other linker options: dopisujemy
-lmingw32 -lSDLmain -lSDL
Projekt gotowy!
Dodajemy plik main.cpp o zawartości:
#include "SDL.h"

int main( int argc, char* args[] )
{
    //Start SDL
    SDL_Init(SDL_INIT_EVERYTHING);

    //Set Caption
    SDL_WM_SetCaption ("SurviveGame", NULL);

    //Quit SDL
    SDL_Quit();

    return 0;
}

Kompilujemy. Działa!

poniedziałek, 16 sierpnia 2010

Pierwsze kroki

No to zaczynamy. Prawdę mówiąc nie lubię zbytnio zabaw z przygotowaniami, dlatego będę się starał zrobić to najprościej jak się da (m.in. dlatego blog wygląda, jak wygląda. Coś się jednak zdizajnuje, bo nawet mi nie pasuje).

Hosting kodu: Subversion i GoogleCode. Używałem już wcześniej, pozatym nie musiałem konta zakładać. Czemu SVN? W sumie nie wiem. GIT jest nieobsługiwalny dla mnie na Windowsie, Mercuriala nie używałem. No i TortoiseSVN miałem już zainstalowanego wcześniej :)

Hosting bloga: Myślałem nad WordPress, ale kolega odradził. Podobno

Jedno pragnę dodać:
Jak chcesz grzebać w szablonie, to to musi kosztować!
Prawie jak ING, huraaa!. Poza tym to samo co z GoogleCode: nie musiałem drugi raz konta zakładać!

IDE: Tutaj się chwilę zastanowiłem. Dev-C++ jest super-prosty w "setapie", natomiast nie powala możliwościami. Visual C++ jest fajny, ale robi pełno dodatkowych plików. Jak będę pisał coś poważniejszego, to zapewne go użyję, ale stanęło na Code::Blocks. Eclipse odpadło na starcie - od IDE oczekuję tego, że jak kliknę na plik projektu, to otworzy mi się IDE z tym projektem. No i ta Java...

Programy wspomagające: Notepad++, Winamp :D

Biblioteki wspomagające: Narazie SDL i pochodne, ale "o tym to po tym".

niedziela, 15 sierpnia 2010

Przedstawienie projektu

Witam.
Moim projektem konkursowym jest gierka, klon darmowego Notrium. Pomysł narodził się bardzo dawno temu, kiedy w rzeczonego grałem i postanowiłem napisać coś podobnego na PlayStation Portable. Mimo szczerych chęci projekt upadł, między innymi z powodu braku doświadczenia w programowaniu (pisałem to w C :O ). Wiadomo o co chodzi, po wciśnięciu paru rzeczy na siłę stwierdziłem, że trzeba to wszystko wyrzucić. Nigdy jednak nie napisałem tego od nowa.

Teraz nadarzyła się okazja ku temu. Narazie będę pisał na PCta, o przeportowaniu pomyślimy. Mam nadzieję, że gierka będzie bardziej grywalna niż poprzedniczka :)