We are going to see, with this tutorial, how to create a shape on a window and how to move it with keyboard arrows.
We need, for this example, three files that we are going to create to dispatch the code:
Of course, you can add a Makefile to easily compile and link files.
But to link the .o, you need to add the -lSDL command.
#include <string.h> #include <errno.h> #include <stdlib.h> #include <SDL/SDL.h> #include "h.h" int init(t_sdl *sdl) { if (SDL_Init(SDL_INIT_EVERYTHING) == -1) { fprintf(stderr, "Error: %s\n", strerror(errno)); return (1); } if ((sdl->screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE)) == NULL) { fprintf(stderr, "Error: %s", SDL_GetError()); return (1); } SDL_WM_SetCaption("Hello World! :D", NULL); if (SDL_FillRect(sdl->screen, NULL, SDL_MapRGB(sdl->screen->format, 255, 32, 45)) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_Flip(sdl->screen) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } sdl->position->x = 0; sdl->position->y = 0; if (manager_event(sdl)) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } SDL_FreeSurface(sdl->rectangle); return (0); } int main () { t_sdl sdl; sdl.screen = NULL; if(init(&sdl)) return (1); return (0); }
#include <stdio.h> #include <string.h> #include <SDL/SDL.h> #include "h.h" int manager_event(t_sdl *sdl) { int gogogo; SDL_Event event; gogogo = 1; while (gogogo) { SDL_WaitEvent(&event); if (event.type == SDL_QUIT) gogogo = 0; else if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_ESCAPE) { printf("ESC\n"); gogogo = 0; } if (event.key.keysym.sym == SDLK_RIGHT) { printf("RIGHT\n"); sdl->position->x += 10; } if (event.key.keysym.sym == SDLK_LEFT) { printf("LEFT\n"); sdl->position->x -= 10; } if (event.key.keysym.sym == SDLK_UP) { printf("UP\n"); sdl->position->y -= 10; } if (event.key.keysym.sym == SDLK_DOWN) { printf("DOWN\n"); sdl->position->y += 10; } } creation_rect(sdl); } return (0); } int creation_rect(t_sdl *sdl) { sdl->rectangle = NULL; if (SDL_FillRect(sdl->screen, NULL, SDL_MapRGB(sdl->screen->format, 255, 32, 45)) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if ((sdl->rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 32, 0, 0, 0, 0)) == NULL) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_FillRect(sdl->rectangle, NULL, SDL_MapRGB(sdl->screen->format, 255, 255, 45)) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_BlitSurface(sdl->rectangle, NULL, sdl->screen, sdl->position) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_Flip(sdl->screen) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } return (0); }
#ifndef H_H_
#define H_H_
/**
* STRUCTURE
*/
typedef struct s_sdl
{
SDL_Surface *screen;
SDL_Surface *rectangle;
SDL_Rect *position;
} t_sdl;
/**
* PROTOTYPE
*/
/* main.c */
int init(t_sdl *sdl);
/* manager_sdl.c */
int manager_event(t_sdl *sdl);
int creation_rect(t_sdl *sdl);
#endif /* H_H_ */
$ gcc main.c manager_sdl.c -c ; gcc main.o manager_sdl.o -lSDL -o go ; ./go
Well done, you made it.
Add new comment