sobota, 28 sierpnia 2010
Planowanie GUI
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
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.
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 -lSDLProjekt 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ć:Prawie jak ING, huraaa!. Poza tym to samo co z GoogleCode: nie musiałem drugi raz konta zakładać!
Jak chcesz grzebać w szablonie, to to musi kosztować!
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
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 :)