aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUnavailableDev <ggwildplay@gmail.com>2023-03-13 09:57:34 +0100
committerUnavailableDev <ggwildplay@gmail.com>2023-03-13 09:57:34 +0100
commit5c4bf7d451135cd3af3e51976251f01cbb6e6573 (patch)
tree82990aa7c7df22c0888543a87dbd05799217cc99
parentbb2839a81d64e8644c57d83806ae41cc4cfad9dd (diff)
camera, movement, collisions
-rw-r--r--src/engine/TODO/player_controller.h4
-rw-r--r--src/engine/camera.c20
-rw-r--r--src/engine/draw_screen.c18
-rw-r--r--src/engine/entity.c41
-rw-r--r--src/engine/entity.h6
-rw-r--r--src/engine/maths.c4
-rw-r--r--src/engine/maths.h4
-rw-r--r--src/engine/player_controller.c1
-rw-r--r--src/engine/player_controller.h7
-rw-r--r--src/engine/sprite_controller.c5
-rw-r--r--src/makefile1
-rw-r--r--src/ppusim/input.c1
-rw-r--r--src/ppusim/sim.c2
13 files changed, 77 insertions, 37 deletions
diff --git a/src/engine/TODO/player_controller.h b/src/engine/TODO/player_controller.h
deleted file mode 100644
index 1e9b86c..0000000
--- a/src/engine/TODO/player_controller.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "maths.h"
-#include "hh_entity.h"
-
-// inputs
diff --git a/src/engine/camera.c b/src/engine/camera.c
index 46c2d93..e756bd4 100644
--- a/src/engine/camera.c
+++ b/src/engine/camera.c
@@ -5,8 +5,26 @@
vec_cor hh_update_camera(vec_cen new, vec2 min, vec2 max){
- new = vec_cen2cor(new,(vec2){.x=20,.y=30});
+ //TODO: change floating point math to fix point math
+ //TODO: fix buggy y-axis ??
+
+ // new = vec_cen2cor(new,(vec2){.x=max.x/2,.y=max.y/2});
+ new = vec_cen2cor((vec2){.x=new.x+(HH_PPU_SPRITE_WIDTH/2),.y=(new.y+(HH_PPU_SPRITE_HEIGHT/2))*2},(vec2){.x=max.x/2,.y=max.y/2});
+ // new.x = new.x << HH_MATH_FIXED_POINT;
+ // new.y = new.y << HH_MATH_FIXED_POINT;
static vec_cor old;
+ // old.x = old.x << HH_MATH_FIXED_POINT;
+ // old.y = old.y << HH_MATH_FIXED_POINT;
+
+ // int16_t some = 0;
+ // some = some <<= HH_MATH_FIXED_POINT-1;
+
+ new.x = (int)((float)new.x*0.1f + (float)old.x*0.9f);
+ new.y = (int)((float)new.y*0.1f + (float)old.y*0.9f);
+
+ // old.x = old.x >> HH_MATH_FIXED_POINT;
+ // old.y = old.y >> HH_MATH_FIXED_POINT;
+
old.x = CLAMP(new.x,min.x,max.x);
old.y = CLAMP(new.y,min.y,max.y);
diff --git a/src/engine/draw_screen.c b/src/engine/draw_screen.c
index 0295241..c4f3389 100644
--- a/src/engine/draw_screen.c
+++ b/src/engine/draw_screen.c
@@ -3,20 +3,20 @@
uint8_t hh_world_to_tile(vec2 pos){
- FILE* level = fopen("../test/bin/test_map.bin", "rb"); /* open binary file */
+ FILE* level = fopen("../test/bin/level1_test.bin", "rb"); /* open binary file */
if (!level) { /* check if file opened successfully */
fprintf(stderr, "Error: Failed to open file.\n");
return 0;
}
- int index = (pos.y + pos.x);
+ int index = ((pos.y/16)*40 + pos.x/16);//TODO: remove magic number(s)
fseek(level, (index * sizeof(int)) + sizeof(int), SEEK_SET);
- int* tile = (int*)malloc(sizeof(int));
- fread(tile, sizeof(int), 1, level); // read 1 tile from binary
+ int tile;// = (int*)malloc(sizeof(int));
+ fread(&tile, sizeof(int), 1, level); // read 1 tile from binary
fclose(level);
- int val = *tile;
- free(tile);
- return val;
+ // int val = tile;
+ // free(tile);
+ return tile;
}
@@ -26,8 +26,8 @@ void hh_draw_screen(vec_cor viewport){
if (viewport.x == previousViewport.x && viewport.y == previousViewport.y) return;
hh_ppu_update_aux((hh_s_ppu_loc_aux){
- .bg_shift_x = viewport.x*HH_PPU_SPRITE_WIDTH,
- .bg_shift_y = viewport.y*HH_PPU_SPRITE_HEIGHT,
+ .bg_shift_x = viewport.x,
+ .bg_shift_y = viewport.y,
.fg_fetch = 0,
.sysreset = 0,
});
diff --git a/src/engine/entity.c b/src/engine/entity.c
index 1dc1df8..152cf1d 100644
--- a/src/engine/entity.c
+++ b/src/engine/entity.c
@@ -1,6 +1,6 @@
#include <stdbool.h>
-#include "engine/hh_entity.h"
+#include "engine/entity.h"
#include "engine/maths.h"
/*
@@ -12,30 +12,35 @@
*/
-bool hh_collision(vec2* pos1, vec2* pos2){
- if (pos2->x == CLAMP(pos2->x,pos1->x,pos1->x+1.0f)){// hit x
+bool hh_collision(vec_cor pos1, vec2 pos2){
+ if (pos2.x == CLAMP(pos2.x, pos1.x, pos1.x+16)){// hit x
return true;
}
- if (pos2->y == CLAMP(pos2->y,pos1->y,pos1->y+0.99f)){// hit y
+ if (pos2.y == CLAMP(pos2.y, pos1.y, pos1.y+16)){// hit y
return true;
}
return false;
}
-void hh_solve_collision(vec2* pos_environment, hh_entity* entity){
- if (entity->vec.x > 0.0f){
- entity->pos.x = MIN(entity->pos.x,pos_environment->x-1.0f);
- entity->vec.x = 0.0f;
- } else if (entity->vec.x < 0.0f){
- entity->pos.x = MAX(entity->pos.x,pos_environment->x+1.0f);
- entity->vec.x = 0.0f;
- } else if (entity->vec.y > 0.0f){
- entity->pos.x = MIN(entity->pos.x,pos_environment->x-1.0f);
- entity->vec.x = 0.0f;
- } else if (entity->vec.y < 0.0f){
- entity->pos.x = MAX(entity->pos.x,pos_environment->x+1.0f);
- entity->vec.x = 0.0f;
- }
+void hh_solve_collision(vec2 pos_environment, hh_entity* entity){
+ if (!hh_collision(pos_environment,entity->pos))
+ return;
+
+ printf("BONK!/n");
+ // if (entity->vec.y > 0){
+ // entity->pos.y = MAX(entity->pos.y,pos_environment.y);
+ // entity->vec.y = 0;
+ // } else {
+ // entity->pos.y = MIN(entity->pos.y,pos_environment.y);
+ // entity->vec.y = 0;
+ // }
+ // if (entity->vec.x <= 0){
+ // entity->pos.x = MIN(entity->pos.x,pos_environment.x-16);
+ // entity->vec.x = 0;
+ // } else {
+ // entity->pos.x = MAX(entity->pos.x,pos_environment.x+16);
+ // entity->vec.x = 0;
+ // }
}
diff --git a/src/engine/entity.h b/src/engine/entity.h
index b2a0c49..dee4aed 100644
--- a/src/engine/entity.h
+++ b/src/engine/entity.h
@@ -1,6 +1,7 @@
#pragma once
#include <stdint.h>
+#include <stdbool.h>
#include "engine/maths.h"
@@ -8,6 +9,7 @@ typedef struct {
vec2 pos, vec;
bool is_grounded;
int8_t hp;
+ int8_t speed;
//armor/block?
}hh_entity;
@@ -15,10 +17,10 @@ typedef struct {
/// @param pos1 position of environment tile to be checked
/// @param pos2 position entity
/// @return true if collision between enity and environment
-bool hh_collision(vec2* pos1, vec2* pos2);
+bool hh_collision(vec2 pos1, vec2 pos2);
/// @brief solve collisions
/// @param environment position
/// @param entity position
/// @return solved new entity position
-void hh_solve_collision(vec2* pos_environment, hh_entity* entity);
+void hh_solve_collision(vec2 pos_environment, hh_entity* entity);
diff --git a/src/engine/maths.c b/src/engine/maths.c
index ebd699c..475bba2 100644
--- a/src/engine/maths.c
+++ b/src/engine/maths.c
@@ -1,5 +1,9 @@
#include "engine/maths.h"
+vec2 vec_add(vec2 a, vec2 b){
+ return (vec2){a.x + b.x, a.y + b.y};
+}
+
vec_cor vec_cen2cor(vec_cen in, vec2 halfDistance){
return (vec_cor){
.x = in.x - halfDistance.x,
diff --git a/src/engine/maths.h b/src/engine/maths.h
index bd20202..bef287e 100644
--- a/src/engine/maths.h
+++ b/src/engine/maths.h
@@ -3,12 +3,14 @@
// #include <math.h>
typedef struct {
- uint32_t x,y;
+ int32_t x,y;
} vec2;
typedef vec2 vec_cen;//centered
typedef vec2 vec_cor;//left upper corner
+vec2 vec_add(vec2 a, vec2 b);
+
vec_cor vec_cen2cor(vec_cen in, vec2 halfDistance);
vec_cor vec_cor2cen(vec_cen in, vec2 halfDistance);
diff --git a/src/engine/player_controller.c b/src/engine/player_controller.c
new file mode 100644
index 0000000..27e522e
--- /dev/null
+++ b/src/engine/player_controller.c
@@ -0,0 +1 @@
+#include "engine/player_controller.h"
diff --git a/src/engine/player_controller.h b/src/engine/player_controller.h
new file mode 100644
index 0000000..400c18e
--- /dev/null
+++ b/src/engine/player_controller.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "engine/maths.h"
+#include "engine/entity.h"
+// inputs
+
+void hh_player_actions();
diff --git a/src/engine/sprite_controller.c b/src/engine/sprite_controller.c
index d4c44ab..5d93cf8 100644
--- a/src/engine/sprite_controller.c
+++ b/src/engine/sprite_controller.c
@@ -1,7 +1,6 @@
#include <stdint.h>
#include "engine/sprite_controller.h"
-// #include "engine/maths.h"
#include "ppu/types.h"
#include "ppu/consts.h"
#include "ppu/ppu.h"
@@ -17,3 +16,7 @@ void hh_setup_palettes(){
}
}
}
+
+bool hh_colidable(uint8_t tile_idx){
+ return (hh_get_palette(tile_idx) != 0);
+}
diff --git a/src/makefile b/src/makefile
index 142d918..d7d9087 100644
--- a/src/makefile
+++ b/src/makefile
@@ -33,6 +33,7 @@ LOCAL_SRCS += main.c \
demo.c \
engine/engine.c \
engine/sprite_controller.c \
+ engine/player_controller.c \
engine/draw_screen.c \
engine/camera.c \
engine/maths.c \
diff --git a/src/ppusim/input.c b/src/ppusim/input.c
index 08bc382..5323fb1 100644
--- a/src/ppusim/input.c
+++ b/src/ppusim/input.c
@@ -12,4 +12,5 @@ void hh_input_read() {
g_hh_controller_p1.dpad_down = kb[SDL_SCANCODE_S];
g_hh_controller_p1.dpad_left = kb[SDL_SCANCODE_A];
g_hh_controller_p1.dpad_right = kb[SDL_SCANCODE_D];
+ g_hh_controller_p1.button_primary = kb[SDL_SCANCODE_SPACE];
}
diff --git a/src/ppusim/sim.c b/src/ppusim/sim.c
index 1e7e609..a5fec45 100644
--- a/src/ppusim/sim.c
+++ b/src/ppusim/sim.c
@@ -32,7 +32,7 @@ void hh_ppu_load_tilemap() {
char* filename = "../test/bin/tiles.bin";
FILE* fp = fopen(filename,"rb");
if (!fp){
- fprintf(stderr,"File error!");
+ fprintf(stderr,"Error: Failed to load tiles.");
return;//error
}
int sprite_size = (HH_PPU_SPRITE_WIDTH * HH_PPU_SPRITE_HEIGHT);