]> git.lizzy.rs Git - nothing.git/blob - src/main.c
6638d1646aa1386c7b86bdfb2d5ece31ac033390
[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 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 *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\n");
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 The 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("./platforms.txt");
78     if (platforms == NULL) {
79         perror("Could not read platforms from ./platforms.txt");
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...");
111
112                     destroy_platforms(platforms);
113                     platforms = load_platforms_from_file("./platforms.txt");
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                 printf("Button: %d\n", e.jbutton.button);
125                 if (e.jbutton.button == 1) {
126                     player_jump(player);
127                 }
128                 break;
129             }
130
131         }
132
133         if (keyboard_state[SDL_SCANCODE_A]) {
134             player_move_left(player);
135         } else if (keyboard_state[SDL_SCANCODE_D]) {
136             player_move_right(player);
137         } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
138             player_move_left(player);
139         } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
140             player_move_right(player);
141         } else {
142             player_stop(player);
143         }
144
145         update_player(player, platforms, delay_ms);
146         player_focus_camera(player, camera);
147
148         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
149         SDL_RenderClear(renderer);
150         render_player(player, renderer, camera);
151         render_platforms(platforms, renderer, camera);
152         SDL_RenderPresent(renderer);
153         SDL_Delay(delay_ms);
154     }
155
156 reload_platforms_failed:
157     destroy_camera(camera);
158 create_camera_fail:
159     if (platforms) { destroy_platforms(platforms); }
160 create_platforms_fail:
161     destroy_player(player);
162 create_player_fail:
163     if (the_stick_of_joy) { SDL_JoystickClose(the_stick_of_joy); }
164 sdl_joystick_open_fail:
165     SDL_DestroyRenderer(renderer);
166 sdl_create_renderer_fail:
167     SDL_DestroyWindow(window);
168 sdl_create_window_fail:
169     SDL_Quit();
170 sdl_init_fail:
171     return exit_code;
172 }