]> git.lizzy.rs Git - nothing.git/blob - src/main.c
28fc97448751b21db369b93be604c92fdc6f4dc5
[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 60
11 #define LEVEL_FILE_NAME "./levels/platforms.txt"
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 *const window = SDL_CreateWindow("Nothing",
27                                                 100, 100,
28                                                 SCREEN_WIDTH, SCREEN_HEIGHT,
29                                                 SDL_WINDOW_SHOWN);
30
31     if (window == NULL) {
32         fprintf(stderr, "Could not create SDL window: %s", SDL_GetError());
33         exit_code = -1;
34         goto sdl_create_window_fail;
35     }
36
37     SDL_Renderer *const renderer = SDL_CreateRenderer(window, -1,
38                                                       SDL_RENDERER_ACCELERATED |
39                                                       SDL_RENDERER_PRESENTVSYNC);
40     if (renderer == NULL) {
41         fprintf(stderr, "Could not create SDL renderer: %s", SDL_GetError());
42         exit_code = -1;
43         goto sdl_create_renderer_fail;
44     }
45
46     SDL_Joystick *the_stick_of_joy = NULL;
47
48     if (SDL_NumJoysticks() > 0) {
49         the_stick_of_joy = SDL_JoystickOpen(0);
50
51         if (the_stick_of_joy == NULL) {
52             fprintf(stderr, "Could not open 0th Stick of the Joy: %s\n", SDL_GetError());
53             exit_code = -1;
54             goto sdl_joystick_open_fail;
55         }
56
57         printf("Opened Joystick 0\n");
58         printf("Name: %s\n", SDL_JoystickNameForIndex(0));
59         printf("Number of Axes: %d\n", SDL_JoystickNumAxes(the_stick_of_joy));
60         printf("Number of Buttons: %d\n", SDL_JoystickNumButtons(the_stick_of_joy));
61         printf("Number of Balls: %d\n", SDL_JoystickNumBalls(the_stick_of_joy));
62
63         SDL_JoystickEventState(SDL_ENABLE);
64     } else {
65         fprintf(stderr, "[WARNING] Could not find any Sticks of the Joy\n");
66     }
67
68     // ------------------------------
69
70     player_t *const player = create_player(100.0f, 0.0f);
71     if (player == NULL) {
72         perror("Could not create player");
73         exit_code = -1;
74         goto create_player_fail;
75     }
76
77     platforms_t *platforms = load_platforms_from_file(LEVEL_FILE_NAME);
78     if (platforms == NULL) {
79         perror("Could not read platforms from " LEVEL_FILE_NAME);
80         exit_code = -1;
81         goto create_platforms_fail;
82     }
83
84     camera_t *const camera = create_camera(vec(0.0f, 0.0f));
85     if (camera == NULL) {
86         perror("Could not create camera");
87         exit_code = -1;
88         goto create_camera_fail;
89     }
90
91     int quit = 0;
92
93     const Uint8 *const keyboard_state = SDL_GetKeyboardState(NULL);
94     const Uint32 delay_ms = (Uint32) roundf(1000.0f / GAME_FPS);
95     SDL_Event e;
96     while (!quit) {
97         while (SDL_PollEvent(&e)) {
98             switch (e.type) {
99             case SDL_QUIT:
100                 quit = 1;
101                 break;
102
103             case SDL_KEYDOWN:
104                 switch (e.key.keysym.sym) {
105                 case SDLK_SPACE:
106                     player_jump(player);
107                     break;
108
109                 case SDLK_q:
110                     printf("Reloading the level from '%s'...", LEVEL_FILE_NAME);
111
112                     destroy_platforms(platforms);
113                     platforms = load_platforms_from_file(LEVEL_FILE_NAME);
114
115                     if (platforms == NULL) {
116                         exit_code = -1;
117                         goto reload_platforms_failed;
118                     }
119                     break;
120                 }
121                 break;
122
123             case SDL_JOYBUTTONDOWN:
124                 if (e.jbutton.button == 1) {
125                     player_jump(player);
126                 }
127                 break;
128             }
129
130         }
131
132         if (keyboard_state[SDL_SCANCODE_A]) {
133             player_move_left(player);
134         } else if (keyboard_state[SDL_SCANCODE_D]) {
135             player_move_right(player);
136         } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
137             player_move_left(player);
138         } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
139             player_move_right(player);
140         } else {
141             player_stop(player);
142         }
143
144         update_player(player, platforms, delay_ms);
145         player_focus_camera(player, camera);
146
147         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
148         SDL_RenderClear(renderer);
149         render_player(player, renderer, camera);
150         render_platforms(platforms, renderer, camera);
151         SDL_RenderPresent(renderer);
152         SDL_Delay(delay_ms);
153     }
154
155 reload_platforms_failed:
156     destroy_camera(camera);
157 create_camera_fail:
158     if (platforms) { destroy_platforms(platforms); }
159 create_platforms_fail:
160     destroy_player(player);
161 create_player_fail:
162     if (the_stick_of_joy) { SDL_JoystickClose(the_stick_of_joy); }
163 sdl_joystick_open_fail:
164     SDL_DestroyRenderer(renderer);
165 sdl_create_renderer_fail:
166     SDL_DestroyWindow(window);
167 sdl_create_window_fail:
168     SDL_Quit();
169 sdl_init_fail:
170     return exit_code;
171 }