make cart move
This commit is contained in:
parent
56e08f0cd2
commit
fbc349bb59
275
game.c
275
game.c
@ -1,27 +1,47 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <SDL2/SDL_image.h>
|
#include <SDL2/SDL_image.h>
|
||||||
#include <SDL2/SDL_timer.h>
|
#include <SDL2/SDL_timer.h>
|
||||||
|
#define PI 3.14159265
|
||||||
|
|
||||||
#define WINDOW_WIDTH 500
|
#define WINDOW_WIDTH 700
|
||||||
#define WINDOW_HEIGHT 300
|
#define WINDOW_HEIGHT 500
|
||||||
|
#define FPS 60
|
||||||
|
|
||||||
int main(void){
|
#define SPEED 400 // pixels per second
|
||||||
SDL_Window* window;
|
#define STIRE_SPEED PI*2
|
||||||
SDL_Renderer* renderer;
|
|
||||||
SDL_Surface* surface;
|
|
||||||
SDL_Texture* texture;
|
|
||||||
|
|
||||||
|
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
|
// initialize SDL
|
||||||
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0){
|
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0){
|
||||||
printf("error initializing SDL: %s\n", SDL_GetError());
|
printf("error initializing SDL: %s\n", SDL_GetError());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create window
|
// create window
|
||||||
window = SDL_CreateWindow("Cart Race",
|
window = SDL_CreateWindow("Cart Race",
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
640, 480, 0);
|
WINDOW_WIDTH, WINDOW_HEIGHT, 0);
|
||||||
if(!window){
|
if(!window){
|
||||||
printf("error create window: %s\n", SDL_GetError());
|
printf("error create window: %s\n", SDL_GetError());
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
@ -40,9 +60,39 @@ int main(void){
|
|||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
return 3;
|
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
|
// create surface
|
||||||
surface = IMG_Load("img/hello.png");
|
surface = IMG_Load("img/car.png");
|
||||||
if(!surface){
|
if(!surface){
|
||||||
printf("error create surface: %s\n", SDL_GetError());
|
printf("error create surface: %s\n", SDL_GetError());
|
||||||
SDL_DestroyRenderer(renderer);
|
SDL_DestroyRenderer(renderer);
|
||||||
@ -62,19 +112,212 @@ int main(void){
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear the window
|
// car
|
||||||
SDL_RenderClear(renderer);
|
SDL_Rect car;
|
||||||
|
SDL_QueryTexture(texture, NULL, NULL, &car.w, &car.h);
|
||||||
|
|
||||||
// drow image
|
car.x = (WINDOW_WIDTH - car.w) / 2;
|
||||||
SDL_RenderCopy(renderer, texture, NULL, NULL);
|
car.y = (WINDOW_HEIGHT- car.h) / 2;
|
||||||
SDL_RenderPresent(renderer);
|
|
||||||
|
|
||||||
// wait
|
Uint8 close_requested = 0;
|
||||||
SDL_Delay(5000);
|
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
|
// clean up resources before exiting
|
||||||
SDL_DestroyTexture(texture);
|
SDL_DestroyTexture(texture);
|
||||||
SDL_DestroyRenderer(renderer);
|
SDL_DestroyRenderer(renderer);
|
||||||
SDL_DestroyWindow(window);
|
SDL_DestroyWindow(window);
|
||||||
SDL_Quit();
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
img/Untitled.xcf
Normal file
BIN
img/Untitled.xcf
Normal file
Binary file not shown.
BIN
img/car.png
Normal file
BIN
img/car.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Loading…
x
Reference in New Issue
Block a user