cartrace/game.c
Mats van Reenen 2d6717aac9 fix stiring
2019-04-24 20:46:51 +02:00

213 lines
5.1 KiB
C

#include <stdio.h>
#include <math.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_timer.h>
#define PI 3.14159265
#define WINDOW_WIDTH 700
#define WINDOW_HEIGHT 500
#define FPS 60
#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,
WINDOW_WIDTH, WINDOW_HEIGHT, 0);
if(!window){
printf("error create window: %s\n", SDL_GetError());
SDL_Quit();
return 2;
}
// create renderer
renderer = SDL_CreateRenderer(
window, -1,
SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC
);
if(!renderer){
printf("error create renderer: %s\n", SDL_GetError());
SDL_DestroyWindow(window);
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 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(car_moving == 1){
if(direction == 1){
heading += sspeed;
}else if(direction == -1){
heading -= sspeed;
}
car_pos[0] += (sin(heading)*speed);
car_pos[1] += (cos(heading)*speed);
}else if(car_moving == -1){
if(direction == 1){
heading -= sspeed;
}else if(direction == -1){
heading += sspeed;
}
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;
}