make cart move
This commit is contained in:
		
							parent
							
								
									56e08f0cd2
								
							
						
					
					
						commit
						fbc349bb59
					
				
							
								
								
									
										277
									
								
								game.c
									
									
									
									
									
								
							
							
						
						
									
										277
									
								
								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(); | ||||||
| @ -32,7 +52,7 @@ int main(void){ | |||||||
|   renderer = SDL_CreateRenderer( |   renderer = SDL_CreateRenderer( | ||||||
|     window, -1, |     window, -1, | ||||||
|     SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC |     SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC | ||||||
|   );  |   ); | ||||||
| 
 | 
 | ||||||
|   if(!renderer){ |   if(!renderer){ | ||||||
|     printf("error create renderer: %s\n", SDL_GetError()); |     printf("error create renderer: %s\n", SDL_GetError()); | ||||||
| @ -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