[Add] Command line option.
[Add] Finished(tm) joypad support. [Change] Input comes from player.
This commit is contained in:
		
							parent
							
								
									e124672464
								
							
						
					
					
						commit
						223a6185fb
					
				| @ -1,13 +1,15 @@ | |||||||
| DEBUG = 1 | DEBUG = 1 | ||||||
| APPNAME = Lephisto | APPNAME = Lephisto | ||||||
| 
 | 
 | ||||||
|  | VERSION = -DVMAJOR=0 -DVMINOR=0 -DVREV=1 | ||||||
|  | 
 | ||||||
| OBJS := $(shell find ../src/ -name '*.c' -print) | OBJS := $(shell find ../src/ -name '*.c' -print) | ||||||
| OBJS := $(OBJS:../src/%.c=../src/%.o) | OBJS := $(OBJS:../src/%.c=../src/%.o) | ||||||
| 
 | 
 | ||||||
| DATA = data | DATA = data | ||||||
| DATAFILES = $(shell find ../gfx/ ../dat/ -name '*.png' -o -name '*.xml' -print) | DATAFILES = $(shell find ../gfx/ ../dat/ -name '*.png' -o -name '*.xml' -print) | ||||||
| 
 | 
 | ||||||
| CFLAGS = -Wall `sdl-config --cflags` `xml2-config --cflags` | CFLAGS = -Wall `sdl-config --cflags` `xml2-config --cflags` $(VERSION) | ||||||
| ifdef DEBUG | ifdef DEBUG | ||||||
| CFLAGS += -g3 -DDEBUG | CFLAGS += -g3 -DDEBUG | ||||||
| else | else | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
| 		<class>1</class> | 		<class>1</class> | ||||||
| 		<movement> | 		<movement> | ||||||
| 			<thrust>400</thrust> | 			<thrust>400</thrust> | ||||||
| 			<turn>360</turn> | 			<turn>960</turn> | ||||||
| 			<speed>360</speed> | 			<speed>360</speed> | ||||||
| 		</movement> | 		</movement> | ||||||
| 		<health> | 		<health> | ||||||
|  | |||||||
| @ -3,6 +3,8 @@ | |||||||
| #define MALLOC_L(type)(malloc(sizeof(type))) | #define MALLOC_L(type)(malloc(sizeof(type))) | ||||||
| #define CALLOC_L(type)(calloc(1, sizeof(type))) | #define CALLOC_L(type)(calloc(1, sizeof(type))) | ||||||
| 
 | 
 | ||||||
|  | #define ABS(X) ((X<0)?-X:X) | ||||||
|  | 
 | ||||||
| typedef float FP; | typedef float FP; | ||||||
| 
 | 
 | ||||||
| #define DATA "data" | #define DATA "data" | ||||||
|  | |||||||
| @ -3,14 +3,31 @@ | |||||||
| #include "log.h" | #include "log.h" | ||||||
| #include "joystick.h" | #include "joystick.h" | ||||||
| 
 | 
 | ||||||
| static SDL_Joystick* joystick; | static SDL_Joystick* joystick = NULL; | ||||||
|  | 
 | ||||||
|  | int joystick_use(int indjoystick) { | ||||||
|  |   // Start using the joystick.
 | ||||||
|  |   LOG("Using joystick %d", indjoystick); | ||||||
|  |   joystick = SDL_JoystickOpen(indjoystick); | ||||||
|  |   if(joystick == NULL) { | ||||||
|  |     WARN("Error opening joystick %d [%s]", indjoystick, SDL_JoystickName(indjoystick)); | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  |   DEBUG("\t\tWith %d axes, %d buttons, %d balls, and %d hats", | ||||||
|  |         SDL_JoystickNumAxes(joystick), SDL_JoystickNumButtons(joystick), | ||||||
|  |         SDL_JoystickNumBalls(joystick), SDL_JoystickNumHats(joystick)); | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| int joystick_init(void) { | int joystick_init(void) { | ||||||
|   int indjoystick, numjoysticks, i; |   int numjoysticks, i; | ||||||
|   indjoystick = 1; |  | ||||||
| 
 | 
 | ||||||
|   // Init the SDL subsys.
 |   // Init the SDL subsys.
 | ||||||
|   SDL_InitSubSystem(SDL_INIT_JOYSTICK); |   if(SDL_InitSubSystem(SDL_INIT_JOYSTICK)) { | ||||||
|  |     WARN("Unable to init the joystick subsystem."); | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|   // Figure out how many joysticks there are.
 |   // Figure out how many joysticks there are.
 | ||||||
|   numjoysticks = SDL_NumJoysticks(); |   numjoysticks = SDL_NumJoysticks(); | ||||||
| @ -18,10 +35,13 @@ int joystick_init(void) { | |||||||
|   for(i = 0; i < numjoysticks; i++) |   for(i = 0; i < numjoysticks; i++) | ||||||
|     LOG("\t\t%d. %s", i, SDL_JoystickName(i)); |     LOG("\t\t%d. %s", i, SDL_JoystickName(i)); | ||||||
| 
 | 
 | ||||||
|   // Start using that bitch.
 |   // Enable joystick events.
 | ||||||
|   LOG("Using joystick %d", indjoystick); |   SDL_JoystickEventState(SDL_ENABLE); | ||||||
|   joystick = SDL_JoystickOpen(indjoystick); |  | ||||||
| 
 | 
 | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void joystick_exit(void) { | ||||||
|  |   SDL_JoystickClose(joystick); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -1,2 +1,7 @@ | |||||||
| int joystick_init(void); | #pragma once | ||||||
|  | 
 | ||||||
|  | int joystick_use(int indjoystick); | ||||||
|  | 
 | ||||||
|  | int joystick_init(void); | ||||||
|  | void joystick_exit(void); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										108
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								src/main.c
									
									
									
									
									
								
							| @ -1,15 +1,15 @@ | |||||||
| #include <SDL.h> | #include <SDL.h> | ||||||
| #include <stdlib.h> | #include <unistd.h> | ||||||
| 
 | 
 | ||||||
| #include "def.h" | #include "def.h" | ||||||
| #include "log.h" | #include "log.h" | ||||||
| #include "log.h" |  | ||||||
| #include "physics.h" | #include "physics.h" | ||||||
| #include "opengl.h" | #include "opengl.h" | ||||||
| #include "ship.h" | #include "ship.h" | ||||||
| #include "pilot.h" | #include "pilot.h" | ||||||
| #include "player.h" | #include "player.h" | ||||||
| #include "joystick.h" | #include "joystick.h" | ||||||
|  | #include "rng.h" | ||||||
| #include "pilot.h" | #include "pilot.h" | ||||||
| 
 | 
 | ||||||
| static int quit = 0; | static int quit = 0; | ||||||
| @ -17,19 +17,54 @@ static int quit = 0; | |||||||
| static unsigned int time = 0; | static unsigned int time = 0; | ||||||
| 
 | 
 | ||||||
| // Prototypes.
 | // Prototypes.
 | ||||||
| static void handle_keydown(SDLKey key); |  | ||||||
| static void handle_keyup(SDLKey key); |  | ||||||
| 
 | 
 | ||||||
| // Update.
 | // Update.
 | ||||||
| static void update_all(void); | static void update_all(void); | ||||||
| 
 | 
 | ||||||
| int main(int argc, const char** argv) { | // Usage.
 | ||||||
|  | void print_usage(char** argv) { | ||||||
|  |   LOG("USAGE: %s [-f] [-j n] [-hv]", argv[0]); | ||||||
|  |   LOG("Options are:"); | ||||||
|  |   LOG("\t-f   - Fullscreen"); | ||||||
|  |   LOG("\t-w n - Set width to (n)"); | ||||||
|  |   LOG("\t-h n - Set height to (n)"); | ||||||
|  |   LOG("\t-j n - Use joystick (n)"); | ||||||
|  |   LOG("\t-h   - Display this message and exit."); | ||||||
|  |   LOG("\t-v   - Print the version and exit"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main(int argc, char** argv) { | ||||||
|   SDL_Event event; |   SDL_Event event; | ||||||
| 
 | 
 | ||||||
|   // Default window params.
 |   // Default values..
 | ||||||
|   gl_screen.w = 800; |   gl_screen.w = 800; | ||||||
|   gl_screen.h = 640; |   gl_screen.h = 640; | ||||||
|   gl_screen.fullscreen = 0; |   gl_screen.fullscreen = 0; | ||||||
|  |   // Joystick.
 | ||||||
|  |   int indjoystick = -1; | ||||||
|  | 
 | ||||||
|  |   // Parse arguments.
 | ||||||
|  |   int c = 0; | ||||||
|  |   while((c = getopt(argc, argv, "fj:hv")) != -1) { | ||||||
|  |     switch(c) { | ||||||
|  |       case 'f': | ||||||
|  |         gl_screen.fullscreen = 1; | ||||||
|  |         break; | ||||||
|  |       case 'j': | ||||||
|  |         indjoystick = atoi(optarg); | ||||||
|  |         break; | ||||||
|  |       case 'v': | ||||||
|  |         LOG("Lephisto: version %d.%d.%d\n", VMAJOR, VMINOR, VREV); | ||||||
|  |       case 'h': | ||||||
|  |         print_usage(argv); | ||||||
|  |         exit(EXIT_SUCCESS); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Random numbers.
 | ||||||
|  |   rng_init(); | ||||||
|  | 
 | ||||||
|  |   // default window params.
 | ||||||
|   if(gl_init()) { |   if(gl_init()) { | ||||||
|     // Initializes video output.
 |     // Initializes video output.
 | ||||||
|     WARN("Error initializing video output, exiting..."); |     WARN("Error initializing video output, exiting..."); | ||||||
| @ -37,8 +72,11 @@ int main(int argc, const char** argv) { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Input.
 |   // Input.
 | ||||||
|  |   if(indjoystick >= 0) { | ||||||
|     if(joystick_init()) |     if(joystick_init()) | ||||||
|       WARN("Error initializing joystick input"); |       WARN("Error initializing joystick input"); | ||||||
|  |     joystick_use(indjoystick); | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|   // Data loading.
 |   // Data loading.
 | ||||||
|   ships_load(); |   ships_load(); | ||||||
| @ -56,70 +94,20 @@ int main(int argc, const char** argv) { | |||||||
|   while(!quit) { |   while(!quit) { | ||||||
|     // Event loop.
 |     // Event loop.
 | ||||||
|     while(SDL_PollEvent(&event)) { |     while(SDL_PollEvent(&event)) { | ||||||
|       switch(event.type) { |       if(event.type == SDL_QUIT) quit = 1; // Handle quit.
 | ||||||
|         case SDL_KEYDOWN: |       handle_input(&event); | ||||||
|           handle_keydown(event.key.keysym.sym); |  | ||||||
|           break; |  | ||||||
|         case SDL_KEYUP: |  | ||||||
|           handle_keyup(event.key.keysym.sym); |  | ||||||
|           break; |  | ||||||
|         case SDL_QUIT: |  | ||||||
|           quit = 1; |  | ||||||
|           break; |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|     update_all(); |     update_all(); | ||||||
|   } |   } | ||||||
|   // Unload data.
 |   // Unload data.
 | ||||||
|   pilots_free(); |   pilots_free(); | ||||||
|   ships_free(); |   ships_free(); | ||||||
|  |   // Exit subsystems.
 | ||||||
|  |   joystick_exit(); | ||||||
|   gl_exit(); // Kills video output.
 |   gl_exit(); // Kills video output.
 | ||||||
|   exit(EXIT_SUCCESS); |   exit(EXIT_SUCCESS); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Handle keydown events.
 |  | ||||||
| static void handle_keydown(SDLKey key) { |  | ||||||
|   switch(key) { |  | ||||||
|     case SDLK_ESCAPE: |  | ||||||
|       quit = 1; |  | ||||||
|       break; |  | ||||||
|     case SDLK_a: |  | ||||||
|     case SDLK_LEFT: |  | ||||||
|       player_setFlag(PLAYER_FLAG_MOV_LEFT); |  | ||||||
|       break; |  | ||||||
|     case SDLK_d: |  | ||||||
|     case SDLK_RIGHT: |  | ||||||
|       player_setFlag(PLAYER_FLAG_MOV_RIGHT); |  | ||||||
|       break; |  | ||||||
|     case SDLK_w: |  | ||||||
|     case SDLK_UP: |  | ||||||
|       player_setFlag(PLAYER_FLAG_MOV_ACC); |  | ||||||
|       break;       |  | ||||||
|     default: |  | ||||||
|       break; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Handle keyup events.
 |  | ||||||
| static void handle_keyup(SDLKey key) { |  | ||||||
|   switch(key) { |  | ||||||
|     case SDLK_a: |  | ||||||
|     case SDLK_LEFT: |  | ||||||
|       player_rmFlag(PLAYER_FLAG_MOV_LEFT); |  | ||||||
|       break; |  | ||||||
|     case SDLK_d: |  | ||||||
|     case SDLK_RIGHT: |  | ||||||
|       player_rmFlag(PLAYER_FLAG_MOV_RIGHT); |  | ||||||
|       break; |  | ||||||
|     case SDLK_w: |  | ||||||
|     case SDLK_UP: |  | ||||||
|       player_rmFlag(PLAYER_FLAG_MOV_ACC); |  | ||||||
|       break; |  | ||||||
|     default: |  | ||||||
|       break; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Update all the things.
 | // Update all the things.
 | ||||||
| // Pilots:
 | // Pilots:
 | ||||||
| //  -- Think (ai).
 | //  -- Think (ai).
 | ||||||
|  | |||||||
							
								
								
									
										180
									
								
								src/opengl.c
									
									
									
									
									
								
							
							
						
						
									
										180
									
								
								src/opengl.c
									
									
									
									
									
								
							| @ -4,19 +4,8 @@ | |||||||
| #include "log.h" | #include "log.h" | ||||||
| #include "opengl.h" | #include "opengl.h" | ||||||
| 
 | 
 | ||||||
| // Recommended for compatibility bullshit.
 | #define SCREEN_W    gl_screen.w | ||||||
| #if SDL_BYTEORDER == SDL_BIG_ENDIAN | #define SCREEN_H    gl_screen.h | ||||||
| #  define RMASK 0xff000000 |  | ||||||
| #  define GMASK 0x00ff0000 |  | ||||||
| #  define BMASK 0x0000ff00 |  | ||||||
| #  define AMASK 0x000000ff |  | ||||||
| #else |  | ||||||
| #  define RMASK 0x000000ff |  | ||||||
| #  define GMASK 0x0000ff00 |  | ||||||
| #  define BMASK 0x00ff0000 |  | ||||||
| #  define AMASK 0xff000000 |  | ||||||
| #endif |  | ||||||
| #define RGBMASK RMASK,GMASK,BMASK,AMASK |  | ||||||
| 
 | 
 | ||||||
| // The screen info, gives data of current opengl settings.
 | // The screen info, gives data of current opengl settings.
 | ||||||
| gl_info gl_screen; | gl_info gl_screen; | ||||||
| @ -52,38 +41,19 @@ static int flip_surface(SDL_Surface* surface) { | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Load the image directly as an opengl texture.
 | // Load the SDL_Surface to an opengl texture.
 | ||||||
| gl_texture* gl_newImage(const char* path) { | gl_texture* gl_loadImage(SDL_Surface* surface) { | ||||||
|   SDL_Surface* tmp, *surface; |   SDL_Surface* tmp; | ||||||
|   Uint32 saved_flags; |   Uint32 saved_flags; | ||||||
|   Uint8  saved_alpha; |   Uint8  saved_alpha; | ||||||
|   int potw, poth; |   int potw, poth; | ||||||
| 
 | 
 | ||||||
|   tmp = IMG_Load(path); // Load the surface.
 |  | ||||||
|   if(tmp == 0) { |  | ||||||
|     WARN("'%s' could not be opened: %s", path, IMG_GetError()); |  | ||||||
|     return NULL; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   surface = SDL_DisplayFormatAlpha(tmp); // Set the surface to what we use.
 |  | ||||||
|   if(surface == 0) { |  | ||||||
|     WARN("Error converting image to screen format: %s", SDL_GetError()); |  | ||||||
|     return NULL; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   SDL_FreeSurface(tmp); // Free the temp surface.
 |  | ||||||
| 
 |  | ||||||
|   if(flip_surface(surface)) { |  | ||||||
|     WARN("Error flipping surface"); |  | ||||||
|     return NULL; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // Set up the texture defaults.
 |   // Set up the texture defaults.
 | ||||||
|   gl_texture* texture = MALLOC_L(gl_texture); |   gl_texture* texture = MALLOC_L(gl_texture); | ||||||
|   texture->w = (FP)surface->w; |   texture->w = (FP)surface->w; | ||||||
|   texture->h = (FP)surface->h; |   texture->h = (FP)surface->h; | ||||||
|   texture->sx = 1.0; |   texture->sx = 1.; | ||||||
|   texture->sy = 1.0; |   texture->sy = 1.; | ||||||
| 
 | 
 | ||||||
|   // Ensure size is power of two.
 |   // Ensure size is power of two.
 | ||||||
|   potw = surface->w; |   potw = surface->w; | ||||||
| @ -132,6 +102,27 @@ gl_texture* gl_newImage(const char* path) { | |||||||
| 
 | 
 | ||||||
|     surface = tmp; |     surface = tmp; | ||||||
| 
 | 
 | ||||||
|  |     // Set saved alpha.
 | ||||||
|  |     if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) | ||||||
|  |       SDL_SetAlpha(surface, 0, 0); | ||||||
|  | 
 | ||||||
|  |     // Create the temp POT surface.
 | ||||||
|  |     tmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, | ||||||
|  |           texture->rw, texture->rh, surface->format->BytesPerPixel*8, RGBMASK); | ||||||
|  |     if(tmp == NULL) { | ||||||
|  |       WARN("Unable to create POT surface %s", SDL_GetError()); | ||||||
|  |       return NULL; | ||||||
|  |     } | ||||||
|  |     if(SDL_FillRect(tmp, NULL, SDL_MapRGBA(surface->format, 0, 0, 0, SDL_ALPHA_TRANSPARENT))) { | ||||||
|  |       WARN("Unable to fill rect: %s", SDL_GetError()); | ||||||
|  |       return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     SDL_BlitSurface(surface, &rtemp, tmp, &rtemp); | ||||||
|  |     SDL_FreeSurface(surface); | ||||||
|  | 
 | ||||||
|  |     surface = tmp; | ||||||
|  |    | ||||||
|     // Set saved alpha.
 |     // Set saved alpha.
 | ||||||
|     if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) |     if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) | ||||||
|       SDL_SetAlpha(surface, saved_flags, saved_alpha); |       SDL_SetAlpha(surface, saved_flags, saved_alpha); | ||||||
| @ -142,8 +133,6 @@ gl_texture* gl_newImage(const char* path) { | |||||||
| 
 | 
 | ||||||
|   // Filtering, LINEAR is better for scaling, nearest looks nicer, LINEAR
 |   // Filtering, LINEAR is better for scaling, nearest looks nicer, LINEAR
 | ||||||
|   // also seems to create a bit of artifacts around the edges.
 |   // also seems to create a bit of artifacts around the edges.
 | ||||||
|   //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 |  | ||||||
|   //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 |  | ||||||
|   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | ||||||
|   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | ||||||
| 
 | 
 | ||||||
| @ -154,9 +143,39 @@ gl_texture* gl_newImage(const char* path) { | |||||||
|   SDL_UnlockSurface(surface); |   SDL_UnlockSurface(surface); | ||||||
|   SDL_FreeSurface(surface); |   SDL_FreeSurface(surface); | ||||||
| 
 | 
 | ||||||
|  |   texture->sx = 1.; | ||||||
|  |   texture->sy = 1.; | ||||||
|  |   texture->sw = texture->w; | ||||||
|  |   texture->sh = texture->h; | ||||||
|  |    | ||||||
|   return texture; |   return texture; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Load the image directly as an opengl texture.
 | ||||||
|  | gl_texture* gl_newImage(const char* path) { | ||||||
|  |   SDL_Surface* tmp, *surface; | ||||||
|  | 
 | ||||||
|  |   tmp = IMG_Load(path); // Load the surface.
 | ||||||
|  |   if(tmp == 0) { | ||||||
|  |     WARN("'%s' could not be opened: %s", path, IMG_GetError()); | ||||||
|  |     return NULL; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   surface = SDL_DisplayFormatAlpha(tmp); // Sets the surface to what we use.
 | ||||||
|  |   if(surface == 0) { | ||||||
|  |     WARN("Error converting image to screen format: %s", SDL_GetError()); | ||||||
|  |     return NULL; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   SDL_FreeSurface(tmp); // Free the temp surface.
 | ||||||
|  | 
 | ||||||
|  |   if(flip_surface(surface)) { | ||||||
|  |     WARN("Error flipping surface"); | ||||||
|  |     return NULL; | ||||||
|  |   } | ||||||
|  |   return gl_loadImage(surface); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Load the texture immediately, but also set is as a sprite.
 | // Load the texture immediately, but also set is as a sprite.
 | ||||||
| gl_texture* gl_newSprite(const char* path, const int sx, const int sy) { | gl_texture* gl_newSprite(const char* path, const int sx, const int sy) { | ||||||
|   gl_texture* texture; |   gl_texture* texture; | ||||||
| @ -180,22 +199,23 @@ void gl_blitSprite(gl_texture* sprite, Vec2* pos, const int sx, const int sy) { | |||||||
|   glMatrixMode(GL_TEXTURE); |   glMatrixMode(GL_TEXTURE); | ||||||
|   glPushMatrix(); |   glPushMatrix(); | ||||||
|   glTranslatef(sprite->sw * (FP)(sx)/sprite->rw, |   glTranslatef(sprite->sw * (FP)(sx)/sprite->rw, | ||||||
|         sprite->sh*(sprite->sy-(FP)sy-1)/sprite->rh, 0.0f); |         sprite->sh*(sprite->sy-(FP)sy-1)/sprite->rh, 0.); | ||||||
| 
 | 
 | ||||||
|   glMatrixMode(GL_PROJECTION); |   glMatrixMode(GL_PROJECTION); | ||||||
|   glPushMatrix(); // Projection translation matrix.
 |   glPushMatrix(); // Projection translation matrix.
 | ||||||
|   glTranslatef(pos->x - gl_camera->x - sprite->sw/2.0, |   glTranslatef(pos->x - gl_camera->x - sprite->sw/2., | ||||||
|         pos->y - gl_camera->y - sprite->sh/2.0, 0.0f); |         pos->y - gl_camera->y - sprite->sh/2., 0.); | ||||||
|  |   glScalef((FP)gl_screen.w/SCREEN_W, (FP)gl_screen.h/SCREEN_H, 0.); | ||||||
| 
 | 
 | ||||||
|   // Actual blitting....
 |   // Actual blitting....
 | ||||||
|   glBindTexture(GL_TEXTURE_2D, sprite->texture); |   glBindTexture(GL_TEXTURE_2D, sprite->texture); | ||||||
|   glBegin(GL_TRIANGLE_STRIP); |   glBegin(GL_TRIANGLE_STRIP); | ||||||
|     glTexCoord2f(0.0f, 0.0f); |     glTexCoord2f(0., 0.); | ||||||
|       glVertex2f(0.0f, 0.0f); |       glVertex2f(0., 0.); | ||||||
|     glTexCoord2f(sprite->sw/sprite->rw, 0.0f); |     glTexCoord2f(sprite->sw/sprite->rw, 0.); | ||||||
|       glVertex2f(sprite->sw, 0.0f); |       glVertex2f(sprite->sw, 0.); | ||||||
|     glTexCoord2f(0.0f, sprite->sh/sprite->rh); |     glTexCoord2f(0., sprite->sh/sprite->rh); | ||||||
|       glVertex2f(0.0f, sprite->sh); |       glVertex2f(0., sprite->sh); | ||||||
|     glTexCoord2f(sprite->sw/sprite->rw, sprite->sh/sprite->rh); |     glTexCoord2f(sprite->sw/sprite->rw, sprite->sh/sprite->rh); | ||||||
|       glVertex2f(sprite->sw, sprite->sh); |       glVertex2f(sprite->sw, sprite->sh); | ||||||
|   glEnd(); |   glEnd(); | ||||||
| @ -210,17 +230,18 @@ void gl_blitSprite(gl_texture* sprite, Vec2* pos, const int sx, const int sy) { | |||||||
| void gl_blitStatic(gl_texture* texture, Vec2* pos) { | void gl_blitStatic(gl_texture* texture, Vec2* pos) { | ||||||
|   glMatrixMode(GL_PROJECTION); |   glMatrixMode(GL_PROJECTION); | ||||||
|   glPushMatrix(); // Set up translation matrix.
 |   glPushMatrix(); // Set up translation matrix.
 | ||||||
|   glTranslatef(pos->x, pos->y, 0); |   glTranslatef(pos->x - (FP)gl_screen.w/2., pos->y - (FP)gl_screen.h/2., 0); | ||||||
|  |   glScalef((FP)gl_screen.w/SCREEN_W, (FP)gl_screen.h/SCREEN_H, 0.); | ||||||
|    |    | ||||||
|   // Actual blitting..
 |   // Actual blitting..
 | ||||||
|   glBindTexture(GL_TEXTURE_2D, texture->texture); |   glBindTexture(GL_TEXTURE_2D, texture->texture); | ||||||
|   glBegin(GL_TRIANGLE_STRIP); |   glBegin(GL_TRIANGLE_STRIP); | ||||||
|     glTexCoord2f(0.0f, 0.0f); |     glTexCoord2f(0., 0.); | ||||||
|       glVertex2f(0.0f, 0.0f); |       glVertex2f(0., 0.); | ||||||
|     glTexCoord2f(texture->w/texture->rw, 0.0f); |     glTexCoord2f(texture->w/texture->rw, 0.); | ||||||
|       glVertex2f(texture->w, 0.0f); |       glVertex2f(texture->w, 0.); | ||||||
|     glTexCoord2f(0.0f, texture->h/texture->rh); |     glTexCoord2f(0., texture->h/texture->rh); | ||||||
|       glVertex2f(0.0f, texture->h); |       glVertex2f(0., texture->h); | ||||||
|     glTexCoord2f(texture->w/texture->rw, texture->h/texture->rh); |     glTexCoord2f(texture->w/texture->rw, texture->h/texture->rh); | ||||||
|       glVertex2f(texture->w, texture->h); |       glVertex2f(texture->w, texture->h); | ||||||
|   glEnd(); |   glEnd(); | ||||||
| @ -235,8 +256,10 @@ void gl_bindCamera(Vec2* pos) { | |||||||
| 
 | 
 | ||||||
| // Initialize SDL/OpenGL etc.
 | // Initialize SDL/OpenGL etc.
 | ||||||
| int gl_init(void) { | int gl_init(void) { | ||||||
|   int depth; |   int depth, i, supported = 0; | ||||||
|  |   SDL_Rect** modes; | ||||||
|   int flags = SDL_OPENGL; |   int flags = SDL_OPENGL; | ||||||
|  |   flags |= SDL_FULLSCREEN * gl_screen.fullscreen; | ||||||
| 
 | 
 | ||||||
|   // Initializes video.
 |   // Initializes video.
 | ||||||
|   if(SDL_Init(SDL_INIT_VIDEO) < 0) { |   if(SDL_Init(SDL_INIT_VIDEO) < 0) { | ||||||
| @ -248,8 +271,35 @@ int gl_init(void) { | |||||||
|   // -- Ok, Maybe for now.
 |   // -- Ok, Maybe for now.
 | ||||||
|   //SDL_ShowCursor(SDL_DISABLE);
 |   //SDL_ShowCursor(SDL_DISABLE);
 | ||||||
| 
 | 
 | ||||||
|   flags |= SDL_FULLSCREEN* gl_screen.fullscreen; |   // Get available fullscreen modes.
 | ||||||
|   depth = SDL_VideoModeOK(gl_screen.w, gl_screen.h, gl_screen.depth, flags); // Test set up.
 |   modes = SDL_ListModes(NULL, SDL_OPENGL | SDL_FULLSCREEN); | ||||||
|  |   if(modes == NULL) { | ||||||
|  |     WARN("No fullscreen modes available"); | ||||||
|  |     if(flags & SDL_FULLSCREEN) { | ||||||
|  |       WARN("Disabling fullscreen mode"); | ||||||
|  |       flags ^= SDL_FULLSCREEN; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   else if(modes == (SDL_Rect**) -1) | ||||||
|  |     DEBUG("All fullscreen modes available."); | ||||||
|  |   else { | ||||||
|  |     DEBUG("Available fullscreen modes:"); | ||||||
|  |     for(i = 0; modes[i]; ++i) { | ||||||
|  |       DEBUG("\t\t%d x %d", modes[i]->w, modes[i]->h); | ||||||
|  |       if(flags & SDL_FULLSCREEN && modes[i]->w == gl_screen.w && modes[i]->h == gl_screen.h) | ||||||
|  |         supported = 1; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   // Make sure fullscreen mode is supported.
 | ||||||
|  |   if((flags & SDL_FULLSCREEN) && (!supported)) { | ||||||
|  |     WARN("Fullscreen mode %d x %d is not supported by your current setup, switching to another mode.", | ||||||
|  |           gl_screen.w, gl_screen.h); | ||||||
|  |     gl_screen.w = modes[0]->w; | ||||||
|  |     gl_screen.h = modes[0]->h; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Test the setup.
 | ||||||
|  |   depth = SDL_VideoModeOK(gl_screen.w, gl_screen.h, gl_screen.depth, flags); | ||||||
|   if(depth != gl_screen.depth) |   if(depth != gl_screen.depth) | ||||||
|     WARN("Depth: %d bpp unavailable, will use %d bpp", gl_screen.depth, depth); |     WARN("Depth: %d bpp unavailable, will use %d bpp", gl_screen.depth, depth); | ||||||
| 
 | 
 | ||||||
| @ -278,17 +328,17 @@ int gl_init(void) { | |||||||
|   DEBUG("Renderer: %s", glGetString(GL_RENDERER)); |   DEBUG("Renderer: %s", glGetString(GL_RENDERER)); | ||||||
| 
 | 
 | ||||||
|   // Some openGL options.
 |   // Some openGL options.
 | ||||||
|   glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |   glClearColor(0., 0., 0., 0.); | ||||||
|   glDisable(GL_DEPTH_TEST); // Set for doing 2D shidazles.
 |   glDisable(GL_DEPTH_TEST); // Set for doing 2D shidazles.
 | ||||||
|   glEnable(GL_TEXTURE_2D); |   glEnable(GL_TEXTURE_2D); | ||||||
|   glMatrixMode(GL_PROJECTION); |   glMatrixMode(GL_PROJECTION); | ||||||
|   glLoadIdentity(); |   glLoadIdentity(); | ||||||
|   glOrtho(-gl_screen.w/2,   // Left edge.
 |   glOrtho(-SCREEN_W /2,   // Left edge.
 | ||||||
|           gl_screen.w/2,    // Right edge.
 |           SCREEN_W  /2,   // Right edge.
 | ||||||
|           -gl_screen.h/2,   // Bottom edge.
 |           -SCREEN_H /2,   // Bottom edge.
 | ||||||
|           gl_screen.h/2,    // Top edge.
 |           SCREEN_H  /2,   // Top edge.
 | ||||||
|           -1.0f,            // Near.
 |           -1.,            // Near.
 | ||||||
|           1.0f);            // Far.
 |           1.);            // Far.
 | ||||||
|   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Alpha.
 |   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Alpha.
 | ||||||
|   glEnable(GL_BLEND); |   glEnable(GL_BLEND); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								src/opengl.h
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/opengl.h
									
									
									
									
									
								
							| @ -1,7 +1,22 @@ | |||||||
| #pragma once | #pragma once | ||||||
| #include "SDL_opengl.h" | #include <SDL.h> | ||||||
|  | #include <SDL_opengl.h> | ||||||
| #include "physics.h" | #include "physics.h" | ||||||
| 
 | 
 | ||||||
|  | // Recommended for compatibility bullshit.
 | ||||||
|  | #if SDL_BYTEORDER == SDL_BIG_ENDIAN | ||||||
|  | #  define RMASK 0xff000000 | ||||||
|  | #  define GMASK 0x00ff0000 | ||||||
|  | #  define BMASK 0x0000ff00 | ||||||
|  | #  define AMASK 0x000000ff | ||||||
|  | #else | ||||||
|  | #  define RMASK 0x000000ff | ||||||
|  | #  define GMASK 0x0000ff00 | ||||||
|  | #  define BMASK 0x00ff0000 | ||||||
|  | #  define AMASK 0xff000000 | ||||||
|  | #endif | ||||||
|  | #define RGBMASK RMASK,GMASK,BMASK,AMASK | ||||||
|  | 
 | ||||||
| #define WINDOW_CAPTION "Lephisto" | #define WINDOW_CAPTION "Lephisto" | ||||||
| 
 | 
 | ||||||
| // Info about opengl screen.
 | // Info about opengl screen.
 | ||||||
| @ -25,6 +40,7 @@ typedef struct { | |||||||
| } gl_texture; | } gl_texture; | ||||||
| 
 | 
 | ||||||
| // gl_texute loading/freeing.
 | // gl_texute loading/freeing.
 | ||||||
|  | gl_texture* gl_loadImage(SDL_Surface* surface); // Frees the surface.
 | ||||||
| gl_texture* gl_newImage(const char* path); | gl_texture* gl_newImage(const char* path); | ||||||
| gl_texture* gl_newSprite(const char* path, const int sx, const int sy); | gl_texture* gl_newSprite(const char* path, const int sx, const int sy); | ||||||
| void gl_free(gl_texture* texture); | void gl_free(gl_texture* texture); | ||||||
|  | |||||||
| @ -81,7 +81,8 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, const Vec2* vel, const Vec | |||||||
| 
 | 
 | ||||||
|   if(flags & PILOT_PLAYER) { |   if(flags & PILOT_PLAYER) { | ||||||
|     pilot->think = (void*)player_think; // Players don't need to thing! :P
 |     pilot->think = (void*)player_think; // Players don't need to thing! :P
 | ||||||
|     pilot->think = NULL; |     pilot->properties |= PILOT_PLAYER; | ||||||
|  |     player = pilot; | ||||||
|   } else |   } else | ||||||
|     pilot->think = NULL; |     pilot->think = NULL; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -22,6 +22,7 @@ struct Pilot { | |||||||
| }; | }; | ||||||
| typedef struct Pilot Pilot; | typedef struct Pilot Pilot; | ||||||
| 
 | 
 | ||||||
|  | extern Pilot* player; // The player.
 | ||||||
| Pilot* get_pilot(unsigned int id); | Pilot* get_pilot(unsigned int id); | ||||||
| 
 | 
 | ||||||
| // Creation.
 | // Creation.
 | ||||||
|  | |||||||
							
								
								
									
										98
									
								
								src/player.c
									
									
									
									
									
								
							
							
						
						
									
										98
									
								
								src/player.c
									
									
									
									
									
								
							| @ -3,17 +3,25 @@ | |||||||
| #include "log.h" | #include "log.h" | ||||||
| #include "player.h" | #include "player.h" | ||||||
| 
 | 
 | ||||||
|  | Pilot* player = NULL; | ||||||
| static unsigned int player_flags = PLAYER_FLAG_NULL; | static unsigned int player_flags = PLAYER_FLAG_NULL; | ||||||
| 
 | 
 | ||||||
|  | static FP player_turn = 0.; | ||||||
|  | static FP player_acc  = 0.; | ||||||
|  | 
 | ||||||
| // To be used in pilot.c
 | // To be used in pilot.c
 | ||||||
| void player_think(Pilot* player, const FP dt) { | void player_think(Pilot* player, const FP dt) { | ||||||
|   player->solid->dir_vel = 0.0; |   player->solid->dir_vel = 0.; | ||||||
|  |   if(player_turn) | ||||||
|  |     player->solid->dir_vel -= player->ship->turn*player_turn/(FP)(1<<15); | ||||||
|  | #if 0 | ||||||
|   if(player_isFlag(PLAYER_FLAG_MOV_LEFT)) |   if(player_isFlag(PLAYER_FLAG_MOV_LEFT)) | ||||||
|     player->solid->dir_vel += player->ship->turn; |     player->solid->dir_vel += player->ship->turn; | ||||||
|   if(player_isFlag(PLAYER_FLAG_MOV_RIGHT)) |   if(player_isFlag(PLAYER_FLAG_MOV_RIGHT)) | ||||||
|     player->solid->dir_vel -= player->ship->turn; |     player->solid->dir_vel -= player->ship->turn; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|   player->solid->force = (player_isFlag(PLAYER_FLAG_MOV_ACC)) ? player->ship->thrust : 0.0; |   player->solid->force = player->ship->thrust*player_acc/(FP)(1<<15); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Flag manipulationz.
 | // Flag manipulationz.
 | ||||||
| @ -31,3 +39,89 @@ void player_rmFlag(unsigned int flag) { | |||||||
|     player_flags ^= flag; |     player_flags ^= flag; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // --Events--
 | ||||||
|  | 
 | ||||||
|  | // Joystick.
 | ||||||
|  | static void handle_joyaxis(int axis, int value) { | ||||||
|  |   switch(axis) { | ||||||
|  |     case 0: | ||||||
|  |       player_turn = (FP)value; | ||||||
|  |       break; | ||||||
|  |     case 1: | ||||||
|  |       if(value <= 0) | ||||||
|  |         player_acc = (FP)-value; | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void handle_joybutton(int button) { | ||||||
|  |   switch(button) { | ||||||
|  |     case 0: | ||||||
|  |       break; | ||||||
|  |     case 1: | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Keyboard.
 | ||||||
|  | static void handle_keydown(SDLKey key) { | ||||||
|  |   SDL_Event quit; | ||||||
|  |   switch(key) { | ||||||
|  |     case SDLK_ESCAPE: | ||||||
|  |       quit.type = SDL_QUIT; | ||||||
|  |       SDL_PushEvent(&quit); | ||||||
|  |       break; | ||||||
|  |     case SDLK_LEFT: | ||||||
|  |     case SDLK_a: | ||||||
|  |       player_turn -= (FP)(1<<15); | ||||||
|  |       break; | ||||||
|  |     case SDLK_RIGHT: | ||||||
|  |     case SDLK_d: | ||||||
|  |       player_turn += (FP)(1<<15); | ||||||
|  |       break; | ||||||
|  |     case SDLK_UP: | ||||||
|  |     case SDLK_w: | ||||||
|  |       player_acc += (FP)(1<<15); | ||||||
|  |       break; | ||||||
|  |     default: | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void handle_keyup(SDLKey key) { | ||||||
|  |   switch(key) { | ||||||
|  |     case SDLK_LEFT: | ||||||
|  |     case SDLK_a: | ||||||
|  |       player_turn += (FP)(1<<15); | ||||||
|  |       break; | ||||||
|  |     case SDLK_RIGHT: | ||||||
|  |     case SDLK_d: | ||||||
|  |       player_turn -= (FP)(1<<15); | ||||||
|  |       break; | ||||||
|  |     case SDLK_UP: | ||||||
|  |     case SDLK_w: | ||||||
|  |       player_acc -= (FP)(1<<15); | ||||||
|  |       break; | ||||||
|  |     default: | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Global input.
 | ||||||
|  | void handle_input(SDL_Event* event) { | ||||||
|  |   switch(event->type) { | ||||||
|  |     case SDL_JOYAXISMOTION: | ||||||
|  |       handle_joyaxis(event->jaxis.axis, event->jaxis.value); | ||||||
|  |       break; | ||||||
|  |     case SDL_JOYBUTTONDOWN: | ||||||
|  |       handle_joybutton(event->jbutton.button); | ||||||
|  |       break; | ||||||
|  |     case SDL_KEYDOWN: | ||||||
|  |       handle_keydown(event->key.keysym.sym); | ||||||
|  |       break; | ||||||
|  |     case SDL_KEYUP: | ||||||
|  |       handle_keyup(event->key.keysym.sym); | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  | #include <SDL.h> | ||||||
| 
 | 
 | ||||||
|  | // Flags.
 | ||||||
| #define PLAYER_FLAG_NULL      (1<<0) | #define PLAYER_FLAG_NULL      (1<<0) | ||||||
| #define PLAYER_FLAG_MOV_LEFT  (1<<1) | #define PLAYER_FLAG_MOV_LEFT  (1<<1) | ||||||
| #define PLAYER_FLAG_MOV_RIGHT (1<<2) | #define PLAYER_FLAG_MOV_RIGHT (1<<2) | ||||||
| @ -9,3 +11,6 @@ int player_isFlag(unsigned int flag); | |||||||
| void player_setFlag(unsigned int flag); | void player_setFlag(unsigned int flag); | ||||||
| void player_rmFlag(unsigned int flag); | void player_rmFlag(unsigned int flag); | ||||||
| 
 | 
 | ||||||
|  | // Input.
 | ||||||
|  | void handle_input(SDL_Event* event); | ||||||
|  | 
 | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								src/rng.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/rng.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | #include <unistd.h> | ||||||
|  | #include <SDL.h> | ||||||
|  | #include "rng.h" | ||||||
|  | 
 | ||||||
|  | void rng_init(void) { | ||||||
|  |   srand(getpid() + SDL_GetTicks()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Allanis
						Allanis