diff --git a/game.c b/game.c index 3f5eec9..7c96b9f 100644 --- a/game.c +++ b/game.c @@ -1,27 +1,47 @@ #include +#include #include #include #include +#define PI 3.14159265 -#define WINDOW_WIDTH 500 -#define WINDOW_HEIGHT 300 +#define WINDOW_WIDTH 700 +#define WINDOW_HEIGHT 500 +#define FPS 60 -int main(void){ - SDL_Window* window; - SDL_Renderer* renderer; - SDL_Surface* surface; - SDL_Texture* texture; +#define SPEED 400 // pixels per second +#define STIRE_SPEED PI*2 +SDL_Window* window; +SDL_Renderer* renderer; + +SDL_Texture* Car_texture; +SDL_Rect Car_pos; + +SDL_Surface* surface; +SDL_Texture* texture; + +void quit(void){ + SDL_DestroyTexture(Car_texture); + SDL_DestroyTexture(texture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); +} + +// initialize SDL, create window and renderer +int init(void){ // initialize SDL if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0){ printf("error initializing SDL: %s\n", SDL_GetError()); return 1; } + // create window window = SDL_CreateWindow("Cart Race", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - 640, 480, 0); + WINDOW_WIDTH, WINDOW_HEIGHT, 0); if(!window){ printf("error create window: %s\n", SDL_GetError()); SDL_Quit(); @@ -32,7 +52,7 @@ int main(void){ renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC - ); + ); if(!renderer){ printf("error create renderer: %s\n", SDL_GetError()); @@ -40,9 +60,39 @@ int main(void){ SDL_Quit(); return 3; } + return 0; +} + +int createCar(){ + // create surface + SDL_Surface* Car_surface = IMG_Load("img/car.png"); + if(!Car_surface){ + printf("error create surface: %s\n", SDL_GetError()); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 3; + } + + // create texture + Car_texture = SDL_CreateTextureFromSurface(renderer, Car_surface); + SDL_FreeSurface(Car_surface); + if(!Car_texture){ + printf("error create texture: %s\n", SDL_GetError()); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 3; + } + SDL_QueryTexture(Car_texture, NULL, NULL, &Car_pos.w, &Car_pos.h); + return 0; +} + +int mainv1(void){ + if(init() != 0) return 1; // create surface - surface = IMG_Load("img/hello.png"); + surface = IMG_Load("img/car.png"); if(!surface){ printf("error create surface: %s\n", SDL_GetError()); SDL_DestroyRenderer(renderer); @@ -62,19 +112,212 @@ int main(void){ return 3; } - // clear the window - SDL_RenderClear(renderer); + // car + SDL_Rect car; + SDL_QueryTexture(texture, NULL, NULL, &car.w, &car.h); - // drow image - SDL_RenderCopy(renderer, texture, NULL, NULL); - SDL_RenderPresent(renderer); + car.x = (WINDOW_WIDTH - car.w) / 2; + car.y = (WINDOW_HEIGHT- car.h) / 2; - // wait - SDL_Delay(5000); + Uint8 close_requested = 0; + int car_moving = 0; + int direction = 0; + + double heading = PI; + double speed = SPEED / FPS; + + 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_UP: + case SDL_SCANCODE_W: + car_moving = 1; + break; + case SDL_SCANCODE_DOWN: + case SDL_SCANCODE_S: + car_moving = -1; + break; + case SDL_SCANCODE_LEFT: + case SDL_SCANCODE_A: + direction = 1; + break; + case SDL_SCANCODE_RIGHT: + case SDL_SCANCODE_D: + direction = -1; + default: + break; + } + break; + case SDL_KEYUP: + switch (event.key.keysym.scancode) { + case SDL_SCANCODE_UP: + case SDL_SCANCODE_W: + case SDL_SCANCODE_DOWN: + case SDL_SCANCODE_S: + car_moving = 0; + break; + case SDL_SCANCODE_LEFT: + case SDL_SCANCODE_A: + case SDL_SCANCODE_RIGHT: + case SDL_SCANCODE_D: + direction = 0; + default: + break; + } + default: + break; + } + } + + // clear the window + SDL_RenderClear(renderer); + + // update position + if(car_moving == 1){ + car.x += (int) (sin(heading)*speed); + car.y += (int) (cos(heading)*speed); + }else if(car_moving == -1){ + car.x -= (int) (sin(heading)*speed); + car.y -= (int) (cos(heading)*speed); + } + + // drow image + SDL_RenderCopy(renderer, texture, NULL, &car); + SDL_RenderPresent(renderer); + + // wait + SDL_Delay(1000 / FPS); + } // clean up resources before exiting SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); + return 0; +} + +int main(void){ + if(init() != 0) return 1; + if(createCar() != 0) return 2; + + Car_pos.x = (WINDOW_WIDTH - Car_pos.w) / 2; + Car_pos.y = (WINDOW_HEIGHT- Car_pos.h) / 2; + + Uint8 close_requested = 0; + int car_moving = 0; + int direction = 0; + + double heading = PI; + double speed = SPEED / FPS; + double sspeed = STIRE_SPEED / FPS; + + double car_pos[2] = {Car_pos.x, Car_pos.y}; + + while(!close_requested){ + // process events + SDL_Event event; + if(SDL_PollEvent(&event)){ + switch (event.type) { + case SDL_QUIT: + close_requested = 1; + break; + case SDL_KEYDOWN: + switch (event.key.keysym.scancode) { + case SDL_SCANCODE_UP: + case SDL_SCANCODE_W: + car_moving = 1; + break; + case SDL_SCANCODE_DOWN: + case SDL_SCANCODE_S: + car_moving = -1; + break; + case SDL_SCANCODE_LEFT: + case SDL_SCANCODE_A: + direction = 1; + break; + case SDL_SCANCODE_RIGHT: + case SDL_SCANCODE_D: + direction = -1; + default: + break; + } + break; + case SDL_KEYUP: + switch (event.key.keysym.scancode) { + case SDL_SCANCODE_UP: + case SDL_SCANCODE_W: + case SDL_SCANCODE_DOWN: + case SDL_SCANCODE_S: + car_moving = 0; + break; + case SDL_SCANCODE_LEFT: + case SDL_SCANCODE_A: + case SDL_SCANCODE_RIGHT: + case SDL_SCANCODE_D: + direction = 0; + default: + break; + } + default: + break; + } + } + + // clear the window + SDL_RenderClear(renderer); + + // update position + if(direction == 1){ + heading += sspeed; + }else if(direction == -1){ + heading -= sspeed; + } + if(car_moving == 1){ + car_pos[0] += (sin(heading)*speed); + car_pos[1] += (cos(heading)*speed); + }else if(car_moving == -1){ + car_pos[0] -= (sin(heading)*speed); + car_pos[1] -= (cos(heading)*speed); + } + + if(car_pos[0] < 0){ + car_pos[0] = 0; + }else if(car_pos[0]+Car_pos.w > WINDOW_WIDTH){ + car_pos[0] = WINDOW_WIDTH-Car_pos.w; + } + if(car_pos[1]< 0){ + car_pos[1]= 0; + }else if(car_pos[1]+Car_pos.w > WINDOW_HEIGHT){ + car_pos[1]= WINDOW_HEIGHT-Car_pos.w; + } + + Car_pos.x = (int) car_pos[0]; + Car_pos.y = (int) car_pos[1]; + + printf("heading: %f\t%d\n", (heading), direction); + printf("car posf: %f, %f\n", car_pos[0], car_pos[1]); + printf("car pos: %u, %u\t%d\n", Car_pos.x, Car_pos.y, car_moving); + + // drow image + SDL_RenderCopyEx(renderer, Car_texture, NULL, &Car_pos, 180-(heading*(180/PI)), NULL, SDL_FLIP_NONE); + SDL_RenderPresent(renderer); + + // wait + SDL_Delay(1000 / FPS); + } + + // clean up resources before exiting + SDL_DestroyTexture(texture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; } diff --git a/img/Untitled.xcf b/img/Untitled.xcf new file mode 100644 index 0000000..1f8acd7 Binary files /dev/null and b/img/Untitled.xcf differ diff --git a/img/car.png b/img/car.png new file mode 100644 index 0000000..5661509 Binary files /dev/null and b/img/car.png differ