practice/sdl/whatever/whatever.c

210 lines
4.3 KiB
C

#include "SDL2/SDL.h"
//Write a function that moves an image based on which arrow keys are pressed.
//something like
//functionize, everything
//void move_image(direction, image);
/* start SDL and create a window */
int init();
/* load the media durr */
int loadMedia();
/* Free the surfaces and whatnot */
void close_game();
/* Our main window */
SDL_Window* gScreen;
/*screen dimensions*/
const int screen_width = 1024;
const int screen_height = 768;
/* Our renderer */
SDL_Renderer* gRenderer;
/* Surface for loading BMP */
SDL_Surface* gTemp;
/* Texture for background */
SDL_Texture* gBackground_texture;
/* Texture for characters */
SDL_Texture* gPlayer;
/* Player coors */
SDL_Rect gPlayer_dest = { 0 };
int main ( int argc, char *argv[] )
{
/* How fast our player moves */
int movement_speed = 1;
if (init() == 1)
{
printf("init failed!\n");
close_game();
return 1;
}
if (loadMedia() == 1)
{
printf("loadMedia failed!\n");
close_game();
return 1;
}
/*Event handler */
SDL_Event e;
/* quit if gameover is not 0 */
int gameover = 0;
/* message pump */
while (!gameover)
{
/*handle events on queue */
while ( SDL_PollEvent( &e ) != 0)
{
if (e.type == SDL_QUIT)
{
gameover = 1;
}
}
const Uint8* currentKeyStates = SDL_GetKeyboardState( NULL );
if (currentKeyStates[ SDL_SCANCODE_ESCAPE ] ||
currentKeyStates[ SDL_SCANCODE_Q ] )
{
gameover = 1;
}
if (currentKeyStates[ SDL_SCANCODE_LEFT ] )
{
gPlayer_dest.x -= movement_speed;
}
if (currentKeyStates[ SDL_SCANCODE_RIGHT ] )
{
gPlayer_dest.x += movement_speed;
}
if (currentKeyStates[ SDL_SCANCODE_UP ] )
{
gPlayer_dest.y -= movement_speed;
}
if (currentKeyStates[ SDL_SCANCODE_DOWN ] )
{
gPlayer_dest.y += movement_speed;
}
/* render the background */
SDL_RenderCopy(gRenderer, gBackground_texture, NULL, NULL);
/* Render entire gPlayer to center of screen */
SDL_RenderCopy(gRenderer, gPlayer, NULL, &gPlayer_dest);
/* Render here */
SDL_RenderPresent(gRenderer);
}
return 0;
}
int init()
{
/* initialize SDL */
if (SDL_Init(SDL_INIT_EVERYTHING) != 0){
printf("Unable to init SDL!: %s\n", SDL_GetError());
return 1;
}
/* create window of size 640x480 and set title bar*/
gScreen = SDL_CreateWindow("SDL TEST",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
screen_width, screen_height,
0);
if (gScreen == NULL){
printf("Unable to set video mode: %s\n", SDL_GetError());
return 1;
}
return 0;
}
int loadMedia()
{
const char background_imagefile[] = "sdl_logo.bmp";
gRenderer = SDL_CreateRenderer(gScreen, -1, 0);
if (gRenderer == NULL){
printf("Unable to create renderer: %s\n", SDL_GetError());
}
/* load background bitmap to surface */
gTemp = SDL_LoadBMP(background_imagefile);
if (gTemp == NULL){
printf("Unable to find image!!: %s\n", SDL_GetError());
return 1;
}
else{
/* convert bitmap to texture */
gBackground_texture = SDL_CreateTextureFromSurface(gRenderer, gTemp);
SDL_FreeSurface(gTemp); // No longer need the surface
gTemp = NULL;
if(gBackground_texture == NULL) {
printf("Failed to create texture from background surface: %s\n", SDL_GetError());
return 1;
}
}
/* load gPlayer image to practice blit on top of surface*/
gTemp = SDL_LoadBMP("dinowheel.bmp");
if (gTemp == NULL){
printf("Unable to load gPlayer: %s/n", SDL_GetError());
return 1;
}
else{
gPlayer = SDL_CreateTextureFromSurface(gRenderer, gTemp);
SDL_FreeSurface(gTemp);
gTemp = NULL;
if(gPlayer == NULL) {
printf("Failed to create texture from gPlayer: %s\n", SDL_GetError());
return 1;
}
}
int player_image_width, player_image_height;
/* Get height and width of gPlayer */
SDL_QueryTexture(gPlayer, NULL, NULL, &player_image_width, &player_image_height);
/* Prepare gPlayer for inital position */
gPlayer_dest.x = (screen_width / 2) - (player_image_width / 2);
gPlayer_dest.y = (screen_width / 2) - (player_image_height / 2);
gPlayer_dest.w = player_image_width;
gPlayer_dest.h = player_image_height;
return 0;
}
void close_game()
{
/* cleanup SDL */
if (gRenderer) SDL_DestroyRenderer(gRenderer);
if (gScreen) SDL_DestroyWindow(gScreen);
if (gBackground_texture) SDL_DestroyTexture(gBackground_texture);
if (gPlayer) SDL_DestroyTexture(gPlayer);
SDL_Quit();
}