Tvorba aplikácii v C++
Čo nás čaká
- interaktívne aplikácie (Allegro, SDL, ClanLib)
- aplikácie s GUI (QT, FLTK, GTK)
- špeciálne knižnice (Mesa)
- nástroje na programovanie (RHIDE)
- pár rád do života
Prvé kroky programátora
- 1. dostane skvelý nápad
- 2. naprogramuje dokonalý program
- 3. každú funkciu si naprogramuje sám
- 4. zistí, že je program nepoužiteľný
Programátor na vlastných nohách
- 5. pokúsi sa program opraviť
- 6. zistí, že polovicu funkcii naprogramoval zle
- 7. preprogramuje zlé funkcie
- 8. zistí, že program je opäť nepoužiteľný
- goto 5.
Ako uniknúť z bludného kruhu?
- skúsme sa zamyslieť kde je hlavný problém
- všetky funkcie programuje sám
- väčšinu funkcíí už niekto naprogramoval
- stačí nájsť správnu knižnicu s funkciami
- výsledok -- 80% ušetrenie času
Štandardné knižnice I.
- #include <string>
- základné funkcie na prácu s reťazcami
- #include <list>, #include <deque>
- operácie nad zoznamami
Štandardné knižnice II.
- #include <map>
- operácie s asociatívnymi poliami
- #include <algorithm>
- špeciálne algoritmy (triedenie, výpis)
Obyčajná aplikácia
- spracovanie vstupov (klávesnica, myš)
- zozbrazenie výstupov (obrazovka)
- vystačíme vždy so štandartnými funkciami?
Nie
Spracovanie vstupu
- stlačil užívateľ šipku hore a vpravo?
- drží užívateľ stlačené CTRL+ALT+DEL+Any key?
- v akej súradnicovej sústave pracuje myš?
- má myš aj koliečko? v akej polohe?
Spracovanie výstupu
- vykresliť obraz v 16-bit alebo 32-bit?
- ktorú časť obrazu prekresliť?
- ako nakresliť kurzor, aby po ňom nezostávali stopy?
Ťažký je život programátora
- to všetko sa predsa naprogramovať nedá!
- nehádžme flintu do žita
- veľa programátorov riešilo podobné problémy
- a tak vnziklo niekoľko kvalitných knižníc
Interaktívne aplikácie
- aplikácie musia rýchlo reagovať na užívateľa
- musia sa prispôsobovať jeho potrebám
- najlepším príkladom je počítačová hra
Knižnice
Allegro
Allegro I.
- Allegro Low Level Game Routines
- vznikla na platforme Atari ST
- Atari však pod tlakom platformy PC zaniklo
- našťastie nezanikli myšlienky Allegra
Allegro II.
- bolo reimplementovane pomocou Borland C
- niekoľko "fanatikov" ho adaptovalo na DJGPP
- boli naprogramované obrovské kusy kódu
- pár "exotov" začalo písať verzie pre DirectX a XServer
Allegro III.
- Allegro sa roztrieštilo na niekoľko častí
- nakoniec sa však všetky vetvy spojili
- teraz Allegro tvorí ucelenú multiplatformovú knižnicu
Allegro -- aplikácia
- spracovanie klávesnice, myši, joysticku
- spracovanie obrazu, zvuku
- jednoduché GUI
- ovládanie časovačov
- používanie dátových súborov
Programovanie -- základ I.
- inicializácia Allegra
- allegro_init();
- ukončenie Allegro
- allegro_exit();
Programovanie -- základ II.
- za funkciou main je nutné uviesť makro
- END_OF_MAIN();
Programovanie -- grafika I.
- nastavenie grafickej hĺbky
- set_color_depth(int depth)
- inicializácia grafického prostredia
- set_gfx_mode(int card, int w, int h, int v_w, int v_h)
Programovanie -- grafika II.
- BITMAP -- všeobecná štruktúra na uloženie obrazu
- obrazovka je BITMAP -- označenie screen
- vytvorenie obrazovej pamäte
- BITMAP *bmp = create_bitmap(320, 200);
Programovanie -- grafika III.
- vymazanie obrazovej pamäte
- clean(bmp);
- vykreslenie bodu do obrazovej pamäte
- putpixel(bmp, x, y, color)
Programovanie -- grafika IV.
- načítanie obrazu zo súboru
- BITMAP *load_bitmap(filename, palette);
- kopírovanie z jednej pamäte do druhej
- blit(bmp, screen, 0, 0, 0, 0, 320, 200);
Programovanie -- grafika V.
- sprite -- okolie obrazu je transparentné
- draw_sprite(screen, bmp, x, y);
Programovanie -- grafika VI.
- uvolnenie obrazovej pamäte
- destroy_bitmap(bmp);
Programovanie -- klávesnica I.
- zavedenie ovladača klávesnice
- install_keyboard()
- odstránenie ovladača klávesnice
- remove_keyboard()
Programovanie -- klávesnica II.
- načítanie klávesy
- readkey()
- vymazanie zásobníka kláves
- clear_keybuf()
Programovanie -- klávesnica III.
- zistenie stlačenia klávesy
- int keypressed()
- test na stlačenie konkrétne klávesy
- key[KEY_typ]
Programovenie -- časovač I.
- časovač zaisťuje rovnakú rýchlosť behu
- inštalácia a odstránenie ovladača časovača
- install_timer()
- remove_timer()
Programovanie -- časovač II.
- časovač implementovaný ako počítadlo
- volatile int counter;
- v pravidelných intervaloch je volaná určitá funkcie
- void my_timer_handler()
Programovanie -- časovač III.
- inštalácia funkcie volenej v pravidelných intervaloch
- install_int_ex(my_timer_handler,speed);
Programovanie -- myš I.
- inštalácia a odstránenie ovládača myši
- install_mouse()
- remove_mouse()
Programovanie -- myš II.
- mouse_x -- X súradnica
- mouse_y -- Y súradnica
- mouse_z -- poloha koliečka
- mouse_b -- stav tlačítok
Programovanie -- text
- jednoduchý výpis textu
- textprinf(bmp, font, x, y, color, text);
Ďalšie vlastnosti
- prehrávanie samplov a MIDI
- ukladanie súborov do datafile
- jednoduchá 3D grafika -- polygony
- jednoduché GUI a vytvíranie dialógov
Knižnice na Allegrom
- Allegro má pomerne veľa funkcii
- Allegttf -- práca s True Type fontami
- AllegGL -- práca GL grafikou
- DUMB -- práca sa audiom (Vorbis/Ogg)
Zdroje
Kompilácia
- DOS: g++ foo.cc -o foo -lalleg
- Linux, Unix, BeOS, QNX, MacOS, Windows:
- g++ foo.cc -o foo `allegro-config --libs`
SDL
SDL
- Simple Direct Media Layer
- knižnica vznikla na Linuxe
- pre veľký úspech bola prenesená na ďalšie systémy
SDL -- aplikácia
- spracovanie klávesnice, myši, joysticku
- spracovanie obrazu, zvuku
- ovládanie časovačov
- podpora udalostí a vlákien
- mplayer (Linux Movie Player)
SDL rozdiely
- kvalitne spracovaný systém udalostí
- zložitejší prístup ku grafike
- prepracovanejšie grafické funkcie
- SDL samo o sebe je low level knižnica
- používa sa nadstavbami
Programovanie -- základ
- inicializácia systému
- SDL_init(flags)
- ukončenie systému
- SDL_quit()
Programovanie -- grafika I.
- inicializácia grafického prostredia
- SDL_SetVideoMode(width, height, video_bpp, videoflags)
- SDL_SWSURFACE -- obrazové dáta v pamäti
- SDL_HWSURFACE -- obrazové dáta vo video pamäti
Programovanie -- grafika II.
- SDL_Surface -- všeobecná štruktúra na uloženie obrazu
- vytvorenie obrazovej pamäte
- surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, rmask, gmask, bmask, amask);
Programovanie -- grafika III.
- vymazanie obrazovej pamäte
- SDL_FillRect(screen, NULL, color)
Programovanie -- grafika IV.
- načítanie obrazu zo súboru
- SDL_Surface *SDL_LoadBMP(const char *file)
- kopírovanie z jednej pamäte do druhej
- SDL_BlitSurface(src, srcrect, dst, dstrect);
Programovanie -- grafika V.
- uvolnenie obrazovej pamäte
- SDL_FreeSurface(SDL_Surface *surface);
Programovanie -- klávesnica
- stlačenie klávesy vyvolá udalosť
- na zistenie stlačenej klávesy je je nutné odchytiť udalosť
- SDL_PollEvent(SDL_Event *event)
- test na stlačenie konkrétne klávesy
- event.key.keysym.sym
Programovenie -- časovač
- časovač implementovaný ako počítadlo
- static int counter;
- inštalácia funkcie volenej v pravidelných intervaloch
- SDL_SetTimer(interval, tick);
Programovanie -- myš
- zistenie stavu myši
- SDL_GetMouseState(*x, *y);
Programovanie -- text
- jednoduchý výpis textu nie je implementovaný
Ďalšie vlastnosti
- priama podpora GL knižníc
- má v sebe zabudovaný mechanizmus pre vlákna
Knižnice nad SDL
- SDL je samo o sebe pomerne ťažko použiteľné
- SDL_mixer -- multikanálový mixér
- SDL_image -- spracovanie obrazových formátov
- SDL_net -- práca so sieťou
Zdroje
Kompilácia
- g++ foo.cc -o foo `sdl-config --libs`
- g++ foo.cc -o foo -lSDL
ClanLib game SDK
ClanLib game SDK
- ClanLib game Simple Development Kit
- kompletne naprogramované v C++
- vytvorené ako komplexné API
ClanLib -- aplikácie
- spracovanie 2D a 3D grafiky
- spracovanie zvuku, I/O
- spracovanie fontov (ttf)
- obsahuje nadstabu pre tvorbu GUI
ClanLib -- popis I.
- knižnica je kompletne objektová
- všetky operácie sú enkapsulované
- akákoľvek funkcia je volaná cez objektové metódy
- všetky funkcie knižnice sú teda pod kontrolou
ClanLib -- popis II.
- rozdelená na niekoľko komunikujúcich objektov
- CL_SetupCore -- jadro knižnice
- CL_SetupDisplay -- obsluha obrazu
- CL_SetupSound -- obsluha zvuku
- CL_Socket -- spracovanie siete
Programovanie -- základ
- inicializácia systému
- CL_SetupCore::init()
- ukončenie systému
- CL_SetupCore::deinit();
Programovanie -- grafika I.
- využíva niekoľko tried
- CL_Display -- základné grafické operácie
- CL_Surface -- zobrazovanie textúr
- CL_Canvas -- vykresľovancie funkcie
Programovanie -- grafika II.
- inicializácia grafického prostredia
- CL_Display::set_videomode(width, height, depth)
- vytvorenie plátna
- CL_Canvas canvas(width, height);
Programovanie -- GUI I.
- CL_Component -- základná jednotka pre stavbu GUI
- CL_ComponentStyle -- aplikácia tém
- CL_ComponentManager -- správa komponentov GUI
- CL_GUIManager -- spracovanie GUI na najvyššej úrovni
Prgramovanie -- GUI II.
- GUI definition files (.gui)
- definíciu GUI je možné oddeliť od kódu
- za behu programu je možné nahrávať GUI popisy
- popis má štruktúru kódu v jazyku C
Programovanie -- GL
- CL_Textures -- základná správa textúr
- CL_SetupGL -- nastavenie GL vlastnistí
- CL_OpenGL -- efekty OpenGL
Ďalšie vlastnosti
- prehrávanie samplov a MIDI
- podpora pre JavaScript
- implementovaný MikMod -- prehrávanie music modules
- podpora prehrávania OggVorbis
- priama podpora sieťovania, správa signálov
Zdroje
Kompilácia
- g++ foo.cc -o foo -LclanApp
Games for Linux
GUI
- Graphic User Interface
- okná, tlačítka, zoznamy, menu
- jednduchá definícia rozhrania
- editor grafického rozhrania
Knižnice a prostredia
QT
QT
- produkt firmy Trolltech
- bezplatné použitie pre Open Source software
- knižnica vznikla v roku 1996
- je postavená na C++
QT -- platformy
- MS/Windows - 95, 98, NT 4.0, ME, 2000, XP
- Unix/X11 - Linux, Sun Solaris, HP-UX, Compaq Tru64 UNIX, IBM AIX, SGI
- IRIX and a wide range of others
- Macintosh - Mac OS X
- Embedded - Linux platforms with framebuffer support.
QT -- moduly I.
- Network Module,
- OpenGL Module
- SQL Module
- Workspace (MDI) Module, XML Module
QT -- Canvas Module
QT -- IconView Module
QT -- Table Module
QT -- Designer
- nástroj na tvorbu GUI
- rozvrhnutú plochu ukladá do XML súboru
- z XML definície sa generuje kód programu
QT -- kompilácia
- uloženie projektu
- qmake -o Makefile test.pro
- make
QT -- Linguist
- nástroj na preklad aplikácii
- umožňuje oddeliť kód od textov
- prekladateľ a programátor pracujú samostatne
QT -- Assistant
- prepracovaný systém nápovedy
- ukážky kódu k funkciam
- stručné a jasné návody
QT -- zdroj
KDE
Opie
FLTK
- Autor: Bill Spitzak
- venoval sa vývoju rozhraní pre Sun Microsystems
- veľa myšlienok zjednodušil a vložil do kitu
- o projekt sa momentálne stará vývojový tím FLTK
FLTK -- platformy
- Unix, Linux
- Microsoft Windows
- MacOS
- s podporou OpenGL a GLUT
FLTK -- vlastnosti
- kompletný objektový návrh
- optimalizované na statické kompilácie
- nízkoúrovňová kompaktibilita -- 10% odlišnosti
- Emacsové skratky pre ikony
FLTK -- spracovanie udalostí
- pohyb myšou
- zmena stavu tlačítka
- zachytávanie klávesnice
FLUID
- Fast Light User-Interface Designer
- jednoduchý designer na tvorbu GUI
FLTK -- zdroj
GTK
GTK
- GIMP ToolKit
- najbežnejši používaná knižnica pre GUI
- povodne vznikla ako súčasť GIMPu
- je na nej postavené obrovské množstvo projektov
GTK II.
- Peter Mattis, Spencer Kimball, Josh MacDonald
- GNU Network Object Model Environment (GNOME)
- C++, Guile, Perl, Python, TOM, Ada95,
- Objective C, Free Pascal, Eiffel
- komplexne riešená knižnica
GTK -- zdroj
Mesa
Mesa
- open source implementácia OpenGL
- vysokoúrovňová knižnica
- grafické programy
- grafické servre a clustery
Mesa
Platformova nezávislosť
Pár rád do života
- používajte objekty
- vytvárajte jednoduchý kód
- rozdeľujte bloky kódu do funkcii
- na formátovanie neprehľadného kódu použite indent
Projekt
C#
Ďakujem za pozornosť
Doplňujúce informácie k prednáške
Články
Allegro -- Hry nie len pod Linux
Allegro -- Kompilácia a spúšťanie
Allegro -- programovanie I
Knižnica Hermes
QT designer
Fast Light Tool Kit
Príklady implementácie v Allegre
example-allegro.zip
example-allegro.tar.gz
Allegro I
#include <allegro.h>
PALETTE pal;
BITMAP *obrazok;
int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
clear(screen);
obrazok = load_tga("obrazok.tga", pal);
draw_sprite(screen, obrazok, 10, 10);
clear_keybuf();
readkey();
remove_keyboard();
allegro_exit();
return 0;
}
END_OF_MAIN();
Allegro II
#include <allegro.h>
PALETTE pal;
BITMAP *obrazok;
int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
clear(screen);
obrazok = load_tga("obrazok.tga", pal);
do {
if(key[KEY_SPACE]) {
draw_sprite(screen, obrazok, 10, 10);
} else {
clear(screen);
}
} while(!key[KEY_ESC]);
remove_keyboard();
allegro_exit();
return 0;
}
END_OF_MAIN();
Allegro III
#include <allegro.h>
volatile int counter;
void my_timer_handler()
{
counter++;
}
END_OF_FUNCTION(my_timer_handler);
PALETTE pal;
BITMAP *obrazok;
int waiting_time;
int x, y;
int main()
{
allegro_init();
install_timer();
install_keyboard();
LOCK_VARIABLE(counter);
LOCK_FUNCTION(my_timer_handler);
install_int_ex(my_timer_handler,BPS_TO_TIMER(10));
waiting_time = counter;
x = y = 100;
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
clear(screen);
obrazok = load_tga("obrazok.tga", pal);
do {
if(key[KEY_LEFT]) { x-= 5; }
if(key[KEY_RIGHT]) { x+= 5; }
if(key[KEY_UP]) { y-= 5; }
if(key[KEY_DOWN]) { y+= 5; }
clear(screen);
draw_sprite(screen, obrazok, x, y);
do {
} while(waiting_time > counter);
waiting_time = counter + 1;
} while(!key[KEY_ESC]);
remove_keyboard();
remove_timer();
allegro_exit();
return 0;
}
END_OF_MAIN();
Allegro IV
#include <allegro.h>
#define WHITE 63000
volatile int counter;
void my_timer_handler()
{
counter++;
}
END_OF_FUNCTION(my_timer_handler);
PALETTE pal;
BITMAP *obrazok;
int waiting_time;
int main()
{
allegro_init();
install_timer();
install_keyboard();
install_mouse();
LOCK_VARIABLE(counter);
LOCK_FUNCTION(my_timer_handler);
install_int_ex(my_timer_handler,BPS_TO_TIMER(30));
waiting_time = counter;
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
clear(screen);
obrazok = load_tga("obrazok.tga", pal);
do {
clear(screen);
textprintf(screen, font, 10, 10, WHITE, "X=%d, Y=%d, Button=%d",
mouse_x, mouse_y, mouse_b);
draw_sprite(screen, obrazok, mouse_x, mouse_y);
do {
} while(waiting_time > counter);
waiting_time = counter + 1;
} while(!key[KEY_ESC]);
remove_mouse();
remove_keyboard();
remove_timer();
allegro_exit();
return 0;
}
END_OF_MAIN();