gba-trycatch
diff src/main_sdl.c @ 5:850be43b3135
sdl version
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 16 Jun 2014 22:01:45 +0300 |
parents | |
children | 73b5f2e5d18a |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/main_sdl.c Mon Jun 16 22:01:45 2014 +0300 1.3 @@ -0,0 +1,182 @@ 1.4 +#include "config.h" 1.5 +#include <stdio.h> 1.6 +#include <stdlib.h> 1.7 +#include <SDL.h> 1.8 +#include "gbasys.h" 1.9 +#include "game.h" 1.10 + 1.11 +static int proc_events(SDL_Event *ev); 1.12 +static void handle_keyboard(int key, int state); 1.13 + 1.14 +struct pixel_buffer *back_buffer, *front_buffer; 1.15 + 1.16 +static SDL_Surface *surf; 1.17 +static struct pixel_buffer bbuf; 1.18 +static unsigned int keystate; 1.19 + 1.20 +int main(void) 1.21 +{ 1.22 + int i, j; 1.23 + 1.24 + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_NOPARACHUTE); 1.25 + 1.26 + if(!(surf = SDL_SetVideoMode(WIDTH * SDLSCALE, HEIGHT * SDLSCALE, 16, SDL_SWSURFACE))) { 1.27 + fprintf(stderr, "failed to initialize graphics\n"); 1.28 + return 1; 1.29 + } 1.30 + SDL_WM_SetCaption("trycatch", 0); 1.31 + 1.32 + bbuf.x = WIDTH; 1.33 + bbuf.y = HEIGHT; 1.34 + bbuf.bpp = 16; 1.35 + if(!(bbuf.pixels = malloc(WIDTH * HEIGHT * 2))) { 1.36 + fprintf(stderr, "failed to allocate framebuffer (%dx%d)\n", WIDTH, HEIGHT); 1.37 + SDL_Quit(); 1.38 + return 1; 1.39 + } 1.40 + 1.41 + back_buffer = front_buffer = &bbuf; 1.42 + 1.43 + for(;;) { 1.44 + SDL_Event ev; 1.45 + uint16_t *dest, *src; 1.46 + 1.47 + while(SDL_PollEvent(&ev)) { 1.48 + if(proc_events(&ev) == -1) { 1.49 + goto done; 1.50 + } 1.51 + } 1.52 + 1.53 + game_draw(); 1.54 + 1.55 + if(SDL_MUSTLOCK(surf)) { 1.56 + SDL_LockSurface(surf); 1.57 + } 1.58 + 1.59 + src = bbuf.pixels; 1.60 + dest = surf->pixels; 1.61 + 1.62 + for(i=0; i<HEIGHT; i++) { 1.63 + for(j=0; j<WIDTH; j++) { 1.64 + dest[0] = dest[1] = dest[WIDTH] = dest[WIDTH + 1] = *src++; 1.65 + dest += 2; 1.66 + } 1.67 + dest += WIDTH; 1.68 + } 1.69 + 1.70 + if(SDL_MUSTLOCK(surf)) { 1.71 + SDL_UnlockSurface(surf); 1.72 + } 1.73 + keystate = 0; 1.74 + } 1.75 + 1.76 +done: 1.77 + SDL_Quit(); 1.78 + return 0; 1.79 +} 1.80 + 1.81 +void flip(void) 1.82 +{ 1.83 + SDL_Flip(surf); 1.84 +} 1.85 + 1.86 +void clear_buffer(struct pixel_buffer *pbuf, unsigned short color) 1.87 +{ 1.88 + int i; 1.89 + unsigned short *pixels = pbuf->pixels; 1.90 + 1.91 + for(i=0; i<pbuf->x * pbuf->y; i++) { 1.92 + *pixels++ = color; 1.93 + } 1.94 +} 1.95 + 1.96 +int get_key_state(int key) 1.97 +{ 1.98 + return keystate & key; 1.99 +} 1.100 + 1.101 +unsigned long get_millisec(void) 1.102 +{ 1.103 + return SDL_GetTicks(); 1.104 +} 1.105 + 1.106 +static int proc_events(SDL_Event *ev) 1.107 +{ 1.108 + switch(ev->type) { 1.109 + case SDL_KEYDOWN: 1.110 + case SDL_KEYUP: 1.111 + handle_keyboard(ev->key.keysym.sym, ev->key.state == SDL_KEYDOWN); 1.112 + break; 1.113 + 1.114 + case SDL_QUIT: 1.115 + return -1; 1.116 + } 1.117 + 1.118 + return 0; 1.119 +} 1.120 + 1.121 +static void handle_keyboard(int key, int state) 1.122 +{ 1.123 + int gba_key = -1; 1.124 + 1.125 + switch(key) { 1.126 + case SDLK_ESCAPE: 1.127 + { 1.128 + SDL_Event ev; 1.129 + ev.type = SDL_QUIT; 1.130 + SDL_PushEvent(&ev); 1.131 + } 1.132 + break; 1.133 + 1.134 + case 'a': 1.135 + case 'A': 1.136 + case SDLK_LEFT: 1.137 + gba_key = KEY_LEFT; 1.138 + break; 1.139 + 1.140 + case 'd': 1.141 + case 'D': 1.142 + case SDLK_RIGHT: 1.143 + gba_key = KEY_RIGHT; 1.144 + break; 1.145 + 1.146 + case 'w': 1.147 + case 'W': 1.148 + case SDLK_UP: 1.149 + gba_key = KEY_UP; 1.150 + break; 1.151 + 1.152 + case 's': 1.153 + case 'S': 1.154 + case SDLK_DOWN: 1.155 + gba_key = KEY_DOWN; 1.156 + break; 1.157 + 1.158 + case '\n': 1.159 + gba_key = KEY_A; 1.160 + break; 1.161 + case '\b': 1.162 + gba_key = KEY_B; 1.163 + break; 1.164 + 1.165 + case ',': 1.166 + gba_key = KEY_SELECT; 1.167 + break; 1.168 + case '.': 1.169 + gba_key = KEY_START; 1.170 + break; 1.171 + 1.172 + case '[': 1.173 + gba_key = KEY_L; 1.174 + break; 1.175 + case ']': 1.176 + gba_key = KEY_R; 1.177 + break; 1.178 + 1.179 + default: 1.180 + return; 1.181 + } 1.182 + 1.183 + keystate |= gba_key; 1.184 + game_keyb(gba_key, state); 1.185 +}