Metoder og værktøjer til programmering Hjemmeside http://www.control.aau.dk/~jal/mvp.php Spørgsmål vedrørende kurset: jal@es.aau.dk
Metoder og værktøjer til programmering Kursusgange: Brugergrænseflader med SDL Netværksprogrammering med sockets Trådprogrammering med posix debugging med ddd
Kurset i dag Kort introduktion til SDL Kompilering af programmer skrevet med SDL Initialisering/de-initialisering af SDL Grafik med SDL Eventhåndtering i SDL Kodegranskning/diskussion af jeres programmer med SDL i grupperne
Information om SDL SDLs officielle hjemmeside http://www.libsdl.org/ Application Programming Interface (API) http://www.libsdl.org/cgi/docwiki.cgi/ Kort introduktion http://www.libsdl.org/intro.en/
Kompilering af programmer med SDL Brug sdl-config! Exempel på Makefil til SDL: CC = gcc SRCS = sdl_program.c OUT = sdl_program SDL_FLAGS = $(shell sdl-config --cflags --libs) compile: $(CC) $(SDL_FLAGS) -o $(OUT) $(SRCS) clean: - rm $(OUT) Eller command line: gcc $(sdl-config --cflags --libs) program.c
Initialisering/de-initialisering af SDL int SDL_Init(Uint32 flags); flags: options, kan eksempelvis være: SDL_INIT_AUDIO SDL_INIT_VIDEO SDL_INIT_EVERYTHING SDL_INIT_EVENTTHREAD void SDL_Quit();
Initialisering/de-initialisering af SDL Eksempel: initialiser sdl med video og audio #include <SDL.h> #include <stdio.h> void init(){ if(sdl_init(sdl_init_video SDL_INIT_AUDIO)){ printf("unable to initialize SDL: %s\n", SDL_GetError()); exit(0); } atexit(sdl_quit); }
Grafik: Surface SDL_Surface *SDL_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags); width, height: selvforklarende ;) bitsperpixel: farvedybde flags: options, kan eksempelvis være: SDL_SWSURFACE SDL_HWSURFACE SDL_DOUBLEBUF SDL_FULLSCREEN
Grafik: surface Eksempel: gør hele skærmen parat til at blive tegnet på #include <SDL.h> #include <stdio.h> int main(){ init(); SDL_Surface *screen; } screen = SDL_SetVideoMode(1440, 900, 32, SDL_HWSURFACE SDL_DOUBLEBUF SDL_FULLSCREEN); if(screen == NULL){ fprintf(stderr, "Unable to set 1440x900 video: %s\n", SDL_GetError()); exit(1); }
Grafik: locking surfaces I SDL skal nogle surfaces låses før man kan tilgå de enkelte pixels i den SDL_MUSTLOCK(surface) evaluerer til 0 hvis surface ikke behøver at blive låst int SDL_LockSurface(SDL_Surface *surface); låser en surface void SDL_UnlockSurface(SDL_Surface *surface); låser en surface op
Grafik: locking surfaces Eksempel: wrappere til lock og unlock void slock(sdl_surface* ps){ if(sdl_mustlock(ps)) SDL_LockSurface(ps); } void sunlock(sdl_surface* ps){ if(sdl_mustlock(ps)) SDL_UnlockSurface(ps); }
Grafik: tegn på en surface int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); dst: surfacen der skal tegnes på dstrect: et rektangel der viser hvor der skal fyldes farve i color: farven der skal fyldes i rektanglet int SDL_Flip(SDL_Surface *screen); screen: surfacen der skal flippes
Grafik: tegn på en surface Eksempel: Tegn et stort rødt rektangel SDL_Rect r; r.x = 50; r.y = 50; r.w = 1440-2*r.x; r.h = 900-2*r.y; Uint32 colour = SDL_MapRGB(screen->format, 255, 0, 0); slock(screen); SDL_FillRect(screen, &r, colour); SDL_Flip(screen); sunlock(screen);
Grafik: andre muligheder Tegn bitmaps på en surface Manipuler enkelte pixels 3D-grafik med opengl Og flere ting...
Events SDL kaster events i forbindelse med: Tastetryk på keyboarded Musemanipulation Joystickmanipulation Manipulation af vinduet der bliver tegnet i
Events void SDL_PumpEvents(void); Opdaterer eventkøen med events fra alle perifære enheder int SDL_PollEvent(SDL_Event *event); event: den første event i eventkøen returnerer: 1 hvis der er event i eventkøen, 0 ellers
Events Eventtyper: SDL_KEYDOWN/UP SDL_MOUSEMOTION SDL_MOUSEBUTTONDOWN/UP SDL_VIDEORESIZE SDL_VIDEOEXPOSE SDL_QUIT og en del flere...
Events Eksempel: Lyt efter tastetryk SDL_Event event; for(;;){ SDL_PumpEvents(); while(sdl_pollevent(&event)){ switch(event.type){ case SDL_KEYDOWN: if(event.key.keysym.sym == SDLK_q) exit(0); else //gør noget andet break; case SDL_QUIT: exit(0); break; default: printf("non-handled event caught.\n"); } } }
Kodegranskning/diskussion af jeres programmer med SDL i grupperne om 15 minutter