-
Le-Bao-Tin.Ha authoredLe-Bao-Tin.Ha authored
main.c 5.87 KiB
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#define WINDOW_WIDTH (1024)
#define WINDOW_HEIGHT (1024)
#define SPEED (450)
int main(int argc, char* args[])
{
// attempt to initialize graphics and timer system
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
{
printf("error initializing SDL: %s\n", SDL_GetError());
return 1;
}
SDL_Window* win = SDL_CreateWindow("INSAGAME",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
WINDOW_WIDTH, WINDOW_HEIGHT,0);
if (!win)
{
printf("error creating window: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
// create a renderer, which sets up the graphics hardware
Uint32 render_flags = SDL_RENDERER_ACCELERATED;
SDL_Renderer* rend = SDL_CreateRenderer(win, -1, render_flags);
if (!rend)
{
printf("error creating renderer: %s\n", SDL_GetError());
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
// load the background into memory using SDL_image library function
SDL_Surface* background = IMG_Load("ressource/map (2).bmp");
if (!background)
{
printf("error creating surface\n");
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
// load the image data into the graphics hardware's memory
SDL_Texture* tex = SDL_CreateTextureFromSurface(rend, background);
SDL_FreeSurface(background);
if (!tex)
{
printf("error creating texture: %s\n", SDL_GetError());
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
SDL_Surface* man = IMG_Load("ressource/man.png");
if (!man)
{
printf("error creating surface\n");
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
// load the image data into the graphics hardware's memory
SDL_Texture* tex2 = SDL_CreateTextureFromSurface(rend, man);
SDL_FreeSurface(man);
if (!tex2)
{
printf("error creating texture: %s\n", SDL_GetError());
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
return 1;
}
// struct to hold the position and size of the sprite
SDL_Rect dest;
// get and scale the dimensions of texture
SDL_QueryTexture(tex2, NULL, NULL, &dest.w, &dest.h);
dest.w /= 8;
dest.h /= 8;
// start sprite in center of screen
float x_pos = 70;
float y_pos = 70;
float x_vel = 0;
float y_vel = 0;
// keep track of which inputs are given
int up = 0;
int down = 0;
int left = 0;
int right = 0;
// set to 1 when window close button is pressed
int close_requested = 0;
// animation loop
while (!close_requested)
{
// process events
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
close_requested = 1;
break;
case SDL_KEYDOWN:
switch (event.key.keysym.scancode)
{
case SDL_SCANCODE_W:
case SDL_SCANCODE_UP:
up = 1;
break;
case SDL_SCANCODE_A:
case SDL_SCANCODE_LEFT:
left = 1;
break;
case SDL_SCANCODE_S:
case SDL_SCANCODE_DOWN:
down = 1;
break;
case SDL_SCANCODE_D:
case SDL_SCANCODE_RIGHT:
right = 1;
break;
}
break;
case SDL_KEYUP:
switch (event.key.keysym.scancode)
{
case SDL_SCANCODE_W:
case SDL_SCANCODE_UP:
up = 0;
break;
case SDL_SCANCODE_A:
case SDL_SCANCODE_LEFT:
left = 0;
break;
case SDL_SCANCODE_S:
case SDL_SCANCODE_DOWN:
down = 0;
break;
case SDL_SCANCODE_D:
case SDL_SCANCODE_RIGHT:
right = 0;
break;
}
break;
}
}
// determine velocity
x_vel = y_vel = 0;
if (up && !down) y_vel = -SPEED;
if (down && !up) y_vel = SPEED;
if (left && !right) x_vel = -SPEED;
if (right && !left) x_vel = SPEED;
// update positions
x_pos += x_vel / 60;
y_pos += y_vel / 60;
// collision detection with bounds
if (x_pos <= 0) x_pos = 0;
if (y_pos <= 0) y_pos = 0;
if (x_pos >= WINDOW_WIDTH - dest.w) x_pos = WINDOW_WIDTH - dest.w;
if (y_pos >= WINDOW_HEIGHT - dest.h) y_pos = WINDOW_HEIGHT - dest.h;
// set the positions in the struct
dest.y = (int) y_pos;
dest.x = (int) x_pos;
// clear the window
SDL_RenderClear(rend);
// draw the image to the window
SDL_RenderCopy(rend, tex, NULL, NULL);
SDL_RenderCopy(rend, tex2, NULL, &dest);
SDL_RenderPresent(rend);
// wait 1/60th of a second
SDL_Delay(1000/60);
}
// clean up resources before exiting
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(rend);
SDL_DestroyWindow(win);
SDL_Quit();
}