Mirai's Miscellaneous Misadventures
M32 / engines / sdl2.c
1
2
3
4
5
6#include <stdlib.h>
7#include <SDL2/SDL.h>
8
9#include "../mimimi.h"
10
11struct mimimi_sdl2
12{
13 SDL_Renderer *renderer;
14 struct mimimi_image *images;
15 SDL_Texture **textures;
16};
17
18static void mimimi_sdl2_stamp(void *opaque, int x, int y, struct mimimi_image *image)
19{
20 struct mimimi_sdl2 *data = opaque;
21 SDL_Renderer *renderer = data->renderer;
22
23 SDL_Rect rect;
24 rect.x = x;
25 rect.y = y;
26 rect.w = image->width;
27 rect.h = image->height;
28
29 int i = image - data->images;
30
31 SDL_RenderCopy(renderer, data->textures[i], NULL, &rect);
32}
33
34int main(int argc, char **argv)
35{
36 atexit(&SDL_Quit);
37
38 SDL_Init(SDL_INIT_VIDEO);
39
40 SDL_Window *window;
41 SDL_Renderer *renderer;
42
43 SDL_CreateWindowAndRenderer(mimimi_width, mimimi_height, 0, &window, &renderer);
44 SDL_RenderSetLogicalSize(renderer, mimimi_width, mimimi_height);
45 SDL_SetWindowTitle(window, "Mirai's Miscellaneous Misadventures");
46
47 struct mimimi_image *images = mimimi_assets();
48 struct mimimi_image *image = images;
49 int image_count = 0;
50
51 while (image->width != 0)
52 {
53 image_count++;
54 image++;
55 }
56 image = images;
57
58 SDL_Texture **textures = malloc(image_count * sizeof *textures);
59
60 for (int i = 0 ; image->width != 0 ; i++)
61 {
62 SDL_Surface *surface = SDL_CreateRGBSurface(0, image->width, image->height, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);
63 for (int x = 0 ; x < image->width ; x++)
64 for (int y = 0 ; y < image->height ; y++)
65 {
66 static unsigned char xterm[] = {0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF};
67
68 Uint32 o = x * 4 + y * surface->pitch;
69 Uint32 *pixel = (Uint32 *) ((char *) surface->pixels + o);
70
71 Uint32 r, g, b, a;
72 unsigned char color = image->colors[x + y * image->width];
73 if (color == 0)
74 {
75 r = 0x00;
76 g = 0x00;
77 b = 0x00;
78 a = 0x00;
79 }
80 else
81 {
82 color -= 16;
83 r = xterm[(color / 36) % 6];
84 g = xterm[(color / 6) % 6];
85 b = xterm[color % 6];
86 a = 0xFF;
87 }
88
89 *pixel = (r << 24) | (g << 16) | (b << 8) | (a << 0);
90 }
91
92 textures[i] = SDL_CreateTextureFromSurface(renderer, surface);
93
94 SDL_FreeSurface(surface);
95 image++;
96 }
97
98 struct mimimi_sdl2 data = {renderer, images, textures};
99
100 struct mimimi_engine engine = {&data, &mimimi_sdl2_stamp};
101 struct mimimi_game *game = malloc(mimimi_game_size);
102 mimimi_start(game, &engine, mimimi_test);
103
104 Uint32 past = SDL_GetTicks();
105
106 for (;;)
107 {
108 Uint32 current = SDL_GetTicks();
109 Uint32 delay = current - past;
110 past = current;
111 if (delay < 33) SDL_Delay(33 - delay);
112
113 SDL_Event event;
114 while (SDL_PollEvent(&event))
115 {
116 if (event.type == SDL_QUIT) return 0;
117
118 if (event.type == SDL_KEYDOWN)
119 {
120 switch (event.key.keysym.sym)
121 {
122 default: continue;
123 case SDLK_q: return 0;
124 }
125 }
126 }
127
128 struct mimimi_keys keys = {0, 0};
129
130 unsigned char *keyboard = SDL_GetKeyboardState(NULL);
131 if (keyboard[SDL_SCANCODE_LEFT]) keys.left = 1;
132 if (keyboard[SDL_SCANCODE_RIGHT]) keys.right = 1;
133
134 SDL_Rect rect = {0, 0, mimimi_width, mimimi_height};
135 SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
136 SDL_RenderClear(renderer);
137 SDL_SetRenderDrawColor(renderer, 0xEE, 0xEE, 0xEE, 0xFF);
138 SDL_RenderFillRect(renderer, &rect);
139 mimimi_step(game, keys);
140 SDL_RenderPresent(renderer);
141 }
142}