]> git.lizzy.rs Git - nothing.git/blob - src/main.c
Merge pull request #14 from tsoding/joystick
[nothing.git] / src / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <SDL2/SDL.h>
4
5 #include "./player.h"
6 #include "./platforms.h"
7
8 #define SCREEN_WIDTH 800
9 #define SCREEN_HEIGHT 600
10 #define GAME_FPS 30
11 #define GROUND_LEVEL 200.0f
12
13 int main(int argc, char *argv[])
14 {
15     (void) argc;                /* unused */
16     (void) argv;                /* unused */
17
18     int exit_code = 0;
19
20     if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
21         fprintf(stderr, "Could not initialize SDL: %s", SDL_GetError());
22         exit_code = -1;
23         goto sdl_init_fail;
24     }
25
26     SDL_Window *window = SDL_CreateWindow("Nothing",
27                                           100, 100,
28                                           SCREEN_WIDTH, SCREEN_HEIGHT,
29                                           SDL_WINDOW_SHOWN);
30     if (window == NULL) {
31         fprintf(stderr, "Could not create SDL window: %s", SDL_GetError());
32         exit_code = -1;
33         goto sdl_create_window_fail;
34     }
35
36     SDL_Renderer *renderer = SDL_CreateRenderer(window, -1,
37                                                 SDL_RENDERER_ACCELERATED |
38                                                 SDL_RENDERER_PRESENTVSYNC);
39     if (renderer == NULL) {
40         fprintf(stderr, "Could not create SDL renderer: %s", SDL_GetError());
41         exit_code = -1;
42         goto sdl_create_renderer_fail;
43     }
44
45     if (SDL_NumJoysticks() <= 0) {
46         fprintf(stderr, "Could not find any The Sticks of the Joy\n");
47         exit_code = -1;
48         goto sdl_num_joysticks_fail;
49     }
50
51     SDL_Joystick *the_stick_of_joy = SDL_JoystickOpen(0);
52     if (the_stick_of_joy == NULL) {
53         fprintf(stderr, "Could not open 0th Stick of the Joy\n");
54         exit_code = -1;
55         goto sdl_joystick_open_fail;
56     }
57
58     printf("Opened Joystick 0\n");
59     printf("Name: %s\n", SDL_JoystickNameForIndex(0));
60     printf("Number of Axes: %d\n", SDL_JoystickNumAxes(the_stick_of_joy));
61     printf("Number of Buttons: %d\n", SDL_JoystickNumButtons(the_stick_of_joy));
62     printf("Number of Balls: %d\n", SDL_JoystickNumBalls(the_stick_of_joy));
63
64     SDL_JoystickEventState(SDL_ENABLE);
65
66     // ------------------------------
67
68     struct player_t *player = create_player(100.0f, 0.0f);
69     if (player == NULL) {
70         perror("Could not create player");
71         exit_code = -1;
72         goto create_player_fail;
73     }
74
75     const struct rect_t platforms_rects[] = {
76         { .x = 0.0f,
77           .y = GROUND_LEVEL + 50.0f,
78           .w = 50.0f,
79           .h = 50.0f },
80         { .x = 150.0f,
81           .y = GROUND_LEVEL + 50.0f,
82           .w = SCREEN_WIDTH - 150.0f,
83           .h = 50.0f },
84         { .x = 0.0f,
85           .y = GROUND_LEVEL + 100.0f,
86           .w = 50.0f,
87           .h = 50.0f },
88         { .x = 150.0f,
89           .y = GROUND_LEVEL + 100.0f,
90           .w = 50.0f,
91           .h = 50.0f },
92         { .x = 0.0f,
93           .y = GROUND_LEVEL + 150.0f,
94           .w = 50.0f,
95           .h = 50.0f },
96         { .x = 150.0f,
97           .y = GROUND_LEVEL + 150.0f,
98           .w = 50.0f,
99           .h = 50.0f }
100     };
101     struct platforms_t *platforms = create_platforms(
102         platforms_rects,
103         sizeof(platforms_rects) / sizeof(struct rect_t));
104     if (platforms == NULL) {
105         perror("Could not create platforms");
106         exit_code = -1;
107         goto create_platforms_fail;
108     }
109
110     int quit = 0;
111
112     const Uint8 *keyboard_state = SDL_GetKeyboardState(NULL);
113     const Uint32 delay_ms = (Uint32) roundf(1000.0f / GAME_FPS);
114     SDL_Event e;
115     while (!quit) {
116         while (SDL_PollEvent(&e)) {
117             switch (e.type) {
118             case SDL_QUIT:
119                 quit = 1;
120                 break;
121
122             case SDL_KEYDOWN:
123                 switch (e.key.keysym.sym) {
124                 case SDLK_SPACE:
125                     player_jump(player);
126                     break;
127                 }
128                 break;
129
130             case SDL_JOYBUTTONDOWN:
131                 printf("Button: %d\n", e.jbutton.button);
132                 if (e.jbutton.button == 1) {
133                     player_jump(player);
134                 }
135                 break;
136             }
137
138         }
139
140         if (keyboard_state[SDL_SCANCODE_A]) {
141             player_move_left(player);
142         } else if (keyboard_state[SDL_SCANCODE_D]) {
143             player_move_right(player);
144         } else if (SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
145             player_move_left(player);
146         } else if (SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
147             player_move_right(player);
148         } else {
149             player_stop(player);
150         }
151
152         update_player(player, platforms, delay_ms);
153
154         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
155         SDL_RenderClear(renderer);
156         render_player(player, renderer);
157         render_platforms(platforms, renderer);
158         SDL_RenderPresent(renderer);
159         SDL_Delay(delay_ms);
160     }
161
162     destroy_platforms(platforms);
163 create_platforms_fail:
164     destroy_player(player);
165 create_player_fail:
166     SDL_JoystickClose(the_stick_of_joy);
167 sdl_joystick_open_fail:
168 sdl_num_joysticks_fail:
169     SDL_DestroyRenderer(renderer);
170 sdl_create_renderer_fail:
171     SDL_DestroyWindow(window);
172 sdl_create_window_fail:
173     SDL_Quit();
174 sdl_init_fail:
175     return exit_code;
176 }