summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFabio Maciel <6810827+fabiomaciel@users.noreply.github.com>2022-12-07 17:49:43 -0300
committerFabio Maciel <6810827+fabiomaciel@users.noreply.github.com>2022-12-07 17:49:43 -0300
commit3b62cccc277e1e2bc465528a7b9a06e8ee09629f (patch)
treea97ef67c6b88923c459ff981e0fc45262592422b /src
parentd9e4bcd542f3efe97e6b8951ee47f10c223a6bf3 (diff)
parent394ffe17766082c6895208f3fc5710a53cb4f01f (diff)
Merge remote-tracking branch 'johnny/master'
Diffstat (limited to 'src')
-rw-r--r--src/controller.c106
-rw-r--r--src/controller.h52
-rw-r--r--src/main.c103
-rw-r--r--src/player.c91
-rw-r--r--src/player.h55
5 files changed, 345 insertions, 62 deletions
diff --git a/src/controller.c b/src/controller.c
index 5fb1e0b..4e488e9 100644
--- a/src/controller.c
+++ b/src/controller.c
@@ -1,46 +1,96 @@
+/*
+ * Copyright (c) 2021, Johnny Richard
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
#include <SDL.h>
#include "controller.h"
-void
-controller_update(controller_t *self,
+void
+controller_update(controller_t *self,
SDL_Event *event)
{
if (event->type == SDL_KEYDOWN) {
switch (event->key.keysym.sym) {
- case SDLK_UP:
- self->up = true;
- break;
- case SDLK_DOWN:
- self->down = true;
- break;
- case SDLK_LEFT:
- self->left = true;
- break;
- case SDLK_RIGHT:
- self->right = true;
- break;
+ case SDLK_UP:
+ self->pressed_buttons |= BTN_UP;
+ break;
+ case SDLK_DOWN:
+ self->pressed_buttons |= BTN_DOWN;
+ break;
+ case SDLK_LEFT:
+ self->pressed_buttons |= BTN_LEFT;
+ break;
+ case SDLK_RIGHT:
+ self->pressed_buttons |= BTN_RIGHT;
+ break;
}
}
if (event->type == SDL_KEYUP) {
switch (event->key.keysym.sym) {
- case SDLK_UP:
- self->up = false;
- break;
+ case SDLK_UP:
+ self->pressed_buttons ^= BTN_UP;
+ break;
+ case SDLK_DOWN:
+ self->pressed_buttons ^= BTN_DOWN;
+ break;
+ case SDLK_LEFT:
+ self->pressed_buttons ^= BTN_LEFT;
+ break;
+ case SDLK_RIGHT:
+ self->pressed_buttons ^= BTN_RIGHT;
+ break;
+ }
+ }
+}
- case SDLK_DOWN:
- self->down = false;
- break;
+bool
+controller_is_up_pressed(controller_t *self)
+{
+ return self->pressed_buttons & BTN_UP;
+}
- case SDLK_LEFT:
- self->left = false;
- break;
+bool
+controller_is_down_pressed(controller_t *self)
+{
+ return self->pressed_buttons & BTN_DOWN;
+}
- case SDLK_RIGHT:
- self->right = false;
- break;
- }
- }
+bool
+controller_is_right_pressed(controller_t *self)
+{
+ return self->pressed_buttons & BTN_RIGHT;
}
+bool
+controller_is_left_pressed(controller_t *self)
+{
+ return self->pressed_buttons & BTN_LEFT;
+}
diff --git a/src/controller.h b/src/controller.h
index a97fc7a..ecc0389 100644
--- a/src/controller.h
+++ b/src/controller.h
@@ -1,25 +1,57 @@
+/*
+ * Copyright (c) 2021, Johnny Richard
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
#ifndef CONTROLLER_H
#define CONTROLLER_H
#include <SDL.h>
#include <stdbool.h>
+#include <stdint.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+enum btn_t {
+ BTN_UP = 1 << 0,
+ BTN_DOWN = 1 << 1,
+ BTN_RIGHT = 1 << 2,
+ BTN_LEFT = 1 << 3
+};
typedef struct controller_t {
- bool up;
- bool down;
- bool left;
- bool right;
+ uint8_t pressed_buttons;
} controller_t;
void controller_update(controller_t *self,
SDL_Event *event);
-#ifdef __cplusplus
-}
-#endif
+bool controller_is_up_pressed(controller_t *self);
+bool controller_is_down_pressed(controller_t *self);
+bool controller_is_right_pressed(controller_t *self);
+bool controller_is_left_pressed(controller_t *self);
#endif /* CONTROLLER_H */
diff --git a/src/main.c b/src/main.c
index 19c4acf..f9b89bf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,64 +1,119 @@
+/*
+* Copyright (c) 2021, Johnny Richard
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this
+* list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materials provided with the distribution.
+*
+* 3. Neither the name of the copyright holder nor the names of its
+* contributors may be used to endorse or promote products derived from
+* this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
+#include <math.h>
#include <SDL.h>
#include "controller.h"
+#include "player.h"
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
-int
+int
main (int argc,
char *args[])
{
- SDL_Window* window = NULL;
- SDL_Surface* screenSurface = NULL;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
- fprintf(stderr, "SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
+ fprintf(
+ stderr,
+ "SDL could not be initialized! SDL_Error: %s\n",
+ SDL_GetError()
+ );
return EXIT_FAILURE;
}
- window = SDL_CreateWindow(
- "SDL Tutorial",
- SDL_WINDOWPOS_UNDEFINED,
- SDL_WINDOWPOS_UNDEFINED,
- SCREEN_WIDTH, SCREEN_HEIGHT,
- SDL_WINDOW_SHOWN
+ SDL_Window* window = SDL_CreateWindow(
+ "Blast Attack",
+ SDL_WINDOWPOS_UNDEFINED,
+ SDL_WINDOWPOS_UNDEFINED,
+ SCREEN_WIDTH, SCREEN_HEIGHT,
+ SDL_WINDOW_RESIZABLE
);
-
if (window == NULL) {
fprintf(stderr, "Window could not be created! SDL_Error: %s\n", SDL_GetError());
return EXIT_FAILURE;
}
-
- SDL_Rect rect = { .x = 0, .y = 0, .w = 20, .h = 20 };
+
+ SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
+ if (renderer == NULL) {
+ fprintf(stderr, "Could not create renderer: %s\n", SDL_GetError());
+ return EXIT_FAILURE;
+ }
+
+ if (SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT) < 0) {
+ fprintf(stderr, "Could not set logical size: %s\n", SDL_GetError());
+ return EXIT_FAILURE;
+ }
+
+ SDL_Rect bg_rect = { .x = 0, .y = 0, .w = SCREEN_WIDTH, .h = SCREEN_HEIGHT };
bool quit = false;
- controller_t controller = {0};
+ controller_t ctrl = {0};
+
+ player_t player;
+ player_init(&player);
while (!quit) {
- screenSurface = SDL_GetWindowSurface(window);
- SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 1);
+ SDL_RenderClear(renderer);
+
+ uint64_t start = SDL_GetPerformanceCounter();
+
+ SDL_SetRenderDrawColor(renderer, 0XCC, 0XCC, 0XCC, 1);
+ SDL_RenderFillRect(renderer, &bg_rect);
SDL_Event event;
- while (SDL_PollEvent(&event) != 0) {
+ while (SDL_PollEvent(&event) != 0) {
if (event.type == SDL_QUIT) {
quit = true;
}
- controller_update(&controller, &event);
+ controller_update(&ctrl, &event);
}
- if (controller.up) rect.y -= 1;
- if (controller.down) rect.y += 1;
- if (controller.left) rect.x -= 1;
- if (controller.right) rect.x += 1;
+ player_update(&player, &ctrl, SCREEN_WIDTH, SCREEN_HEIGHT);
+ player_draw(&player, renderer);
+
+ SDL_RenderPresent(renderer);
+
+ uint64_t end = SDL_GetPerformanceCounter();
- SDL_FillRect(screenSurface, &rect, SDL_MapRGB(screenSurface->format, 0xFF, 0x0, 0x0));
- SDL_UpdateWindowSurface(window);
+ float elapsedMS = (end - start) / (float)SDL_GetPerformanceFrequency() * 1000.0f;
+ SDL_Delay(floor(16.666f - elapsedMS));
}
+ SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
diff --git a/src/player.c b/src/player.c
new file mode 100644
index 0000000..000eb76
--- /dev/null
+++ b/src/player.c
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2021, Johnny Richard
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this
+* list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materials provided with the distribution.
+*
+* 3. Neither the name of the copyright holder nor the names of its
+* contributors may be used to endorse or promote products derived from
+* this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "player.h"
+
+#include <assert.h>
+#include <SDL.h>
+
+void
+player_init(player_t *player)
+{
+ assert(player && "player is required");
+ player->x = 0;
+ player->y = 0;
+ player->width = 20;
+ player->height = 20;
+ player->speed = 8;
+}
+
+void player_update(player_t *player,
+ controller_t *ctrl,
+ int screen_width,
+ int screen_height)
+{
+ if (controller_is_up_pressed(ctrl) && player->y > 0) {
+ player->y -= player->speed;
+ player->y = player->y < 0 ? 0 : player->y;
+ }
+
+ if (controller_is_down_pressed(ctrl) && player->y < screen_height) {
+ player->y += player->speed;
+ player->y = player->y + player->height > screen_height
+ ? screen_height - player->height
+ : player->y;
+ }
+
+ if (controller_is_left_pressed(ctrl) && player->x > 0) {
+ player->x -= player->speed;
+ player->x = player->x < 0
+ ? 0
+ : player->x;
+ }
+
+ if (controller_is_right_pressed(ctrl) && player->x < screen_width) {
+ player->x += player->speed;
+ player->x = player->x + player->width > screen_width
+ ? screen_width - player->width
+ : player->x;
+ }
+}
+
+void
+player_draw(player_t *player, SDL_Renderer *renderer)
+{
+ SDL_Rect rect = {
+ .x = player->x,
+ .y = player->y,
+ .w = player->width,
+ .h = player->height
+ };
+
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0xFF, 1);
+ SDL_RenderFillRect(renderer, &rect);
+}
diff --git a/src/player.h b/src/player.h
new file mode 100644
index 0000000..1f211c7
--- /dev/null
+++ b/src/player.h
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2021, Johnny Richard
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this
+* list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materials provided with the distribution.
+*
+* 3. Neither the name of the copyright holder nor the names of its
+* contributors may be used to endorse or promote products derived from
+* this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef PLAYER_H
+#define PLAYER_H
+
+#include "controller.h"
+
+#include <stdint.h>
+
+typedef struct player {
+ uint16_t x;
+ uint16_t y;
+ uint16_t width;
+ uint16_t height;
+ uint16_t speed;
+} player_t;
+
+void player_init(player_t *player);
+
+// FIXME: Find out a better way to provide screen w and h properties
+void player_update(player_t *player,
+ controller_t *ctrl,
+ int screen_width,
+ int screen_height);
+
+void player_draw(player_t *player, SDL_Renderer *renderer);
+
+#endif /* PLAYER_H */