summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnny Richard <johnny@johnnyrichard.com>2022-04-20 03:34:03 +0200
committerJohnny Richard <johnny@johnnyrichard.com>2022-04-20 03:34:03 +0200
commit9dadbc4409e2ce32eee80c7a8a6ee93e2524763b (patch)
treeaed9519ce13b50622b28d4b3868389a8733d8abc
parent2f537114acc74a9e09443f69ab2508b292fdfa91 (diff)
player: Introduce player object
-rw-r--r--.gitignore3
-rw-r--r--src/main.c28
-rw-r--r--src/player.c91
-rw-r--r--src/player.h55
4 files changed, 154 insertions, 23 deletions
diff --git a/.gitignore b/.gitignore
index 1f44161..449f08f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
*.exe
*.o
-/lib
/build
+/lib
blast_attack
+tags
diff --git a/src/main.c b/src/main.c
index 70b283d..f9b89bf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -35,6 +35,7 @@
#include <SDL.h>
#include "controller.h"
+#include "player.h"
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
@@ -76,12 +77,14 @@ main (int argc,
return EXIT_FAILURE;
}
- SDL_Rect rect = { .x = 0, .y = 0, .w = 20, .h = 20 };
SDL_Rect bg_rect = { .x = 0, .y = 0, .w = SCREEN_WIDTH, .h = SCREEN_HEIGHT };
bool quit = false;
controller_t ctrl = {0};
+ player_t player;
+ player_init(&player);
+
while (!quit) {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 1);
SDL_RenderClear(renderer);
@@ -99,28 +102,9 @@ main (int argc,
controller_update(&ctrl, &event);
}
- if (controller_is_up_pressed(&ctrl) && rect.y > 0) {
- rect.y -= 8;
- rect.y = rect.y < 0 ? 0 : rect.y;
- }
-
- if (controller_is_down_pressed(&ctrl) && rect.y + 8 < SCREEN_HEIGHT) {
- rect.y += 8;
- rect.y = rect.y + rect.h > SCREEN_HEIGHT ? SCREEN_HEIGHT - rect.h : rect.y;
- }
-
- if (controller_is_left_pressed(&ctrl) && rect.x > 0) {
- rect.x -= 8;
- rect.x = rect.x < 0 ? 0 : rect.x;
- }
-
- if (controller_is_right_pressed(&ctrl) && rect.x + 8 < SCREEN_WIDTH) {
- rect.x += 8;
- rect.x = rect.x + rect.h > SCREEN_WIDTH ? SCREEN_WIDTH - rect.h : rect.x;
- }
+ player_update(&player, &ctrl, SCREEN_WIDTH, SCREEN_HEIGHT);
+ player_draw(&player, renderer);
- SDL_SetRenderDrawColor(renderer, 0xFF, 0, 0, 1);
- SDL_RenderFillRect(renderer, &rect);
SDL_RenderPresent(renderer);
uint64_t end = SDL_GetPerformanceCounter();
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 */