make cart move
This commit is contained in:
		
							parent
							
								
									56e08f0cd2
								
							
						
					
					
						commit
						fbc349bb59
					
				
							
								
								
									
										257
									
								
								game.c
									
									
									
									
									
								
							
							
						
						
									
										257
									
								
								game.c
									
									
									
									
									
								
							| @ -1,27 +1,47 @@ | ||||
| #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 500 | ||||
| #define WINDOW_HEIGHT 300 | ||||
| #define WINDOW_WIDTH 700 | ||||
| #define WINDOW_HEIGHT 500 | ||||
| #define FPS 60 | ||||
| 
 | ||||
| #define SPEED 400 // pixels per second
 | ||||
| #define STIRE_SPEED PI*2 | ||||
| 
 | ||||
| int main(void){ | ||||
| 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(); | ||||
| @ -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; | ||||
|   } | ||||
| 
 | ||||
|   // car
 | ||||
|   SDL_Rect car; | ||||
|   SDL_QueryTexture(texture, NULL, NULL, &car.w, &car.h); | ||||
| 
 | ||||
|   car.x = (WINDOW_WIDTH - car.w) / 2; | ||||
|   car.y = (WINDOW_HEIGHT- car.h) / 2; | ||||
| 
 | ||||
|   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, NULL); | ||||
|     SDL_RenderCopy(renderer, texture, NULL, &car); | ||||
|     SDL_RenderPresent(renderer); | ||||
| 
 | ||||
|     // wait
 | ||||
|   SDL_Delay(5000); | ||||
|     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; | ||||
| } | ||||
|  | ||||
							
								
								
									
										
											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