aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNielsCoding <48092678+heavydemon21@users.noreply.github.com>2023-03-30 13:02:36 +0200
committerNielsCoding <48092678+heavydemon21@users.noreply.github.com>2023-03-30 13:02:36 +0200
commit552dcc17db2b98287ba1b480c2e70759cd94d81f (patch)
tree7f7bbd7a8b3964bbebc2878d33be0ed8a9382e3f
parent7f51cd925883bbf958baa289d4d19231667c9eba (diff)
gameloop/bullet/levels
gameloop moet nog wat gefixt worden. shop moet nog wat art en functie krijgen zefde voor gameover/highscore bullet moet meerdere entityten kunnen doen nu nog alleen gemaakt voor 1. levels moet alleen nog backwords kunnen
-rw-r--r--src/GameLoop/game_over.c28
-rw-r--r--src/GameLoop/game_over.h18
-rw-r--r--src/GameLoop/gameplay.c44
-rw-r--r--src/GameLoop/gameplay.h17
-rw-r--r--src/GameLoop/shop.c28
-rw-r--r--src/GameLoop/shop.h12
-rw-r--r--src/demo.c35
-rw-r--r--src/engine/bullet.c65
-rw-r--r--src/engine/bullet.h17
-rw-r--r--src/engine/draw_screen.c103
-rw-r--r--src/engine/draw_screen.h22
-rw-r--r--src/engine/level_const.c22
-rw-r--r--src/engine/level_const.h31
-rw-r--r--src/makefile3
14 files changed, 299 insertions, 146 deletions
diff --git a/src/GameLoop/game_over.c b/src/GameLoop/game_over.c
new file mode 100644
index 0000000..09e6858
--- /dev/null
+++ b/src/GameLoop/game_over.c
@@ -0,0 +1,28 @@
+#include "game_over.h"
+
+
+void hh_game_over(hh_e_GameState* hh_game_state){
+ static hh_e_game_over hh_e_states_game_over = hh_e_game_over_SHOW;
+
+ switch (hh_e_states_game_over)
+ {
+ case hh_e_game_over_SHOW:
+ hh_clear_screen();
+ hh_clear_sprite();
+ // TODO: make function to show game over
+ hh_e_states_game_over = hh_e_game_over_Input;
+ break;
+ case hh_e_game_over_Input:
+ if(g_hh_controller_p1.button_primary){
+ hh_e_states_game_over = hh_e_game_over_END;
+ }
+ break;
+ case hh_e_game_over_END:
+ hh_e_states_game_over = hh_e_game_over_SHOW;
+ *hh_game_state = hh_e_STATE_GameOver;
+ break;
+ default:
+ hh_e_states_game_over = hh_e_game_over_SHOW;
+ break;
+ }
+}
diff --git a/src/GameLoop/game_over.h b/src/GameLoop/game_over.h
new file mode 100644
index 0000000..0d40b6c
--- /dev/null
+++ b/src/GameLoop/game_over.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "input.h"
+#include "engine/draw_screen.h"
+#include "engine/level_const.h"
+
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef enum {
+ hh_e_game_over_SHOW,
+ hh_e_game_over_Input,
+ hh_e_game_over_END,
+} hh_e_game_over;
+
+
+void hh_game_over(hh_e_GameState*);
diff --git a/src/GameLoop/gameplay.c b/src/GameLoop/gameplay.c
new file mode 100644
index 0000000..72297f5
--- /dev/null
+++ b/src/GameLoop/gameplay.c
@@ -0,0 +1,44 @@
+#include "gameplay.h"
+
+
+
+void hh_gameplay(hh_g_all_levels game, hh_e_GameState* hh_game_state){
+ static hh_e_gameplay gameplay = hh_e_setup_screen;
+
+ switch (gameplay)
+ {
+ case hh_e_setup_screen:
+ hh_setup_screen(game.level[game.currentLevel]);
+ gameplay = hh_e_play_level;
+ break;
+ case hh_e_play_level:
+ // TODO: here come all the different functions for the gameplay
+ hh_player_actions();
+
+
+
+ if(game.level[game.currentLevel].hh_level_completed){
+ gameplay = hh_e_level_complete;
+ }
+ break;
+ case hh_e_level_complete:
+ if(game.currentLevel < 3){
+ game.currentLevel++;
+ gameplay = hh_e_setup_screen;
+ }
+ else {
+ gameplay = hh_e_game_over;
+ }
+ break;
+ case hh_e_game_over:
+ // TODO make reset levels
+ hh_reset_levels();
+ gameplay = hh_e_setup_screen;
+ *hh_game_state = hh_e_STATE_GameOver;
+ break;
+ default:
+ break;
+ }
+
+}
+void hh_reset_levels(){}
diff --git a/src/GameLoop/gameplay.h b/src/GameLoop/gameplay.h
new file mode 100644
index 0000000..6e8c1ec
--- /dev/null
+++ b/src/GameLoop/gameplay.h
@@ -0,0 +1,17 @@
+#pragma once
+#include "engine/draw_screen.h"
+#include "engine/player_controller.h"
+#include "engine/sprite_controller.h"
+#include "GameLoop/startingScreen.h"
+#include "engine/level_const.h"
+
+typedef enum {
+ hh_e_setup_screen,
+ hh_e_play_level,
+ hh_e_level_complete,
+ hh_e_game_over,
+}hh_e_gameplay;
+
+void hh_reset_levels();
+void hh_gameplay(hh_g_all_levels, hh_e_GameState*);
+
diff --git a/src/GameLoop/shop.c b/src/GameLoop/shop.c
index eb6bed5..8e6dc71 100644
--- a/src/GameLoop/shop.c
+++ b/src/GameLoop/shop.c
@@ -1,30 +1,30 @@
#include "shop.h"
-bool hh_show_Shop(){
- static hh_e_ShopStates hh_e_Shop = hh_e_STATE_SHOW;
+void hh_Shop(hh_e_GameState* hh_game_state){
+ static hh_e_ShopStates hh_e_Shop = hh_e_shop_SHOW;
switch (hh_e_Shop)
{
- case hh_e_STATE_SHOW:
- //hh_clear_screen();
-
+ case hh_e_shop_SHOW:
+ hh_clear_screen();
+ hh_clear_sprite();
+ // TODO: make function to show shop
//hh_setup_shop();
- hh_e_Shop = hh_e_STATE_Input;
- return false;
+ hh_e_Shop = hh_e_shop_Input;
break;
- case hh_e_STATE_Input:
+ case hh_e_shop_Input:
+ // TODO: make it so that you can choose between shop
if(g_hh_controller_p1.button_primary){
- hh_e_Shop = hh_e_STATE_END;
+ hh_e_Shop = hh_e_shop_END;
}
break;
- case hh_e_STATE_END:
- hh_e_Shop = hh_e_STATE_SHOW;
- return true;
+ case hh_e_shop_END:
+ hh_e_Shop = hh_e_shop_SHOW;
+ *hh_game_state = hh_e_STATE_Gameplay;
break;
default:
- hh_e_Shop = hh_e_STATE_SHOW;
+ hh_e_Shop = hh_e_shop_SHOW;
break;
}
- return false;
}
diff --git a/src/GameLoop/shop.h b/src/GameLoop/shop.h
index 4014f58..1efc057 100644
--- a/src/GameLoop/shop.h
+++ b/src/GameLoop/shop.h
@@ -1,16 +1,18 @@
+#pragma once
+
#include "input.h"
#include "engine/draw_screen.h"
-
+#include "engine/level_const.h"
#include <stdint.h>
#include <stdbool.h>
typedef enum {
- hh_e_STATE_SHOW,
- hh_e_STATE_Input,
- hh_e_STATE_END
+ hh_e_shop_SHOW,
+ hh_e_shop_Input,
+ hh_e_shop_END,
} hh_e_ShopStates;
-bool hh_show_Shop();
+void hh_Shop(hh_e_GameState*);
diff --git a/src/demo.c b/src/demo.c
index 22ee8b7..886dda8 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -11,19 +11,14 @@
#include "engine/draw_screen.h"
#include "engine/player_controller.h"
#include "engine/sprite_controller.h"
-#include "GameLoop/startingScreen.h"
-
+#include "engine/level_const.h"
-typedef enum {
- hh_e_STATE_startingScreen,
- hh_e_STATE_Shop,
- hh_e_STATE_Gameplay,
- hh_e_STATE_GameOver,
- hh_e_STATE_HighScore
-} hh_e_GameState;
-hh_e_GameState hh_gameStates;
+#include "GameLoop/startingScreen.h"
+#include "GameLoop/gameplay.h"
+#include "GameLoop/shop.h"
+hh_g_all_levels hh_game;
uint16_t g_hh_pos_x = 1000; // 0b0000 0001 0011 0110
uint16_t g_hh_pos_y;
@@ -43,13 +38,13 @@ typedef struct {
}hh_s_tiles;
+hh_e_GameState hh_gameStates;
hh_entity hh_g_player, hh_g_player_new;
void hh_demo_setup() {
hh_setup_palettes();
// hh_setup_screen();
-
-
+ hh_game = hh_init_game_levels();
}
void hh_demo_loop(unsigned long frame) {
@@ -64,22 +59,10 @@ void hh_demo_loop(unsigned long frame) {
}
break;
case hh_e_STATE_Shop:
- // TODO:
- // if(hh_show_Shop()){
- hh_clear_screen();
- hh_clear_sprite();
- hh_setup_screen();
- hh_clear_sprite();
- hh_gameStates = hh_e_STATE_Gameplay;
- // }
- // function: new level is chosen goto level
+ hh_Shop(&hh_gameStates);
break;
case hh_e_STATE_Gameplay:
- hh_player_actions();
-
- // TODO:
- // function: if level complete goto shop
- // function: if player is dead goto game over
+ hh_gameplay(hh_game, &hh_gameStates);
break;
case hh_e_STATE_GameOver:
// TODO:
diff --git a/src/engine/bullet.c b/src/engine/bullet.c
index 5aa9e51..2016a4d 100644
--- a/src/engine/bullet.c
+++ b/src/engine/bullet.c
@@ -1,44 +1,35 @@
#include "bullet.h"
-#include "engine/sprite_controller.h"
-void shootBullet(vec2 playerPos, Bullet* bullet){
- // Set bullet's x and y coordinates to player's coordinates
- bullet->x = playerPos.x;
- bullet->y = playerPos.y;
- // Set bullet's velocity to a fixed value
- bullet->velocity = 1;
- // Set bullet's status to active
- bullet->isActive = true;
-}
-void updateBullet(Bullet* bullet, int deltaTime){
- // Only update bullet if it is active
- static int latestLocationBullet = 0;
- if (bullet->isActive) {
- // Move bullet based on velocity and deltaTime
- bullet->x += bullet->velocity * deltaTime;
- drawBullet(bullet);
- // Check if bullet has moved 16 pixels
- if (bullet->x - latestLocationBullet > 32) {
- // Set bullet's status to inactive
- bullet->isActive = false;
- drawBullet(&(Bullet){.x = -16,.y = -16. });
- }
- }
- else{
- latestLocationBullet = bullet->x;
- }
+
+// TODO: use hh_entity as bullet struct
+void shootBullet(vec2 playerPos, vec_cor cam_pos, hh_entity* bullet){
+ vec2 temp;
+ if(g_hh_controller_p1.button_secondary){
+ if(bullet->is_grounded){
+ bullet->is_grounded=false;
+ bullet->pos = playerPos;
+ }
+ }
+ else{
+ if(!bullet->is_grounded){
+ updateBullet(bullet , cam_pos, temp);
+ drawBullet(*bullet);
+ }
+ }
+
+
}
-void drawBullet(Bullet* bullet){
+void collision
+void updateBullet(hh_entity* bullet, vec_cor cam_pos, vec2 start){
+ bullet->pos.x += 1;
+ // update bullet sprite on ppu
+ bullet->render.fam.position_x = (bullet->pos.x-cam_pos.x);
+ bullet->render.fam.position_y = (bullet->pos.y-cam_pos.y);
- hh_ppu_update_foreground(10, (hh_s_ppu_loc_fam_entry)
- {
- .position_x = bullet->x,
- .position_y = bullet->y,
- .horizontal_flip = false,
- .vertical_flip = false,
- .palette_index = 7,
- .tilemap_index = 84, // change tilemap to the correct foreground index;
- });
+}
+void drawBullet(hh_entity bullet){
+ hh_s_ppu_loc_fam_entry temp = bullet.render.fam;
+ hh_ppu_update_foreground(10,temp);
}
diff --git a/src/engine/bullet.h b/src/engine/bullet.h
index ad67d84..5bbc031 100644
--- a/src/engine/bullet.h
+++ b/src/engine/bullet.h
@@ -1,16 +1,11 @@
#pragma once
#include "player_controller.h"
+#include "engine/sprite_controller.h"
+#include "input.h"
-typedef struct {
- int x;
- int y;
- int velocity;
- int isActive;
- int hit;
-} Bullet;
+void shootBullet(vec2 playerPos, vec_cor cam_pos, hh_entity*);
-//Bullet* createBullet(float x, float y, float velocity, float direction);
-void shootBullet(vec2 playerPos, Bullet* bullet);
-void updateBullet(Bullet* bullet, int deltaTime);
-void drawBullet(Bullet* bullet);
+void updateBullet(hh_entity* , vec_cor, vec2 );
+
+void drawBullet(hh_entity);
diff --git a/src/engine/draw_screen.c b/src/engine/draw_screen.c
index 0c31bf6..4a5ca68 100644
--- a/src/engine/draw_screen.c
+++ b/src/engine/draw_screen.c
@@ -1,66 +1,77 @@
#include "engine/draw_screen.h"
-#include "engine/sprite_controller.h"
+//#include "engine/sprite_controller.h"
+hh_level_entity level;
+uint64_t offset=0;
uint8_t hh_world_to_tile(vec2 pos){
- //TODO: remove magic file name here
- FILE* level = fopen("static/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/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
-
- fclose(level);
- // int val = tile;
- // free(tile);
+
+ int index = (((pos.y/16)*hh_max_x_size) + (pos.x/16));//TODO: remove magic number(s)
+ int tile= level.place[index];
return tile;
}
+void hh_update_screen(vec2 view, vec2 player){
+ int currentTileY = view.y / 16;
+ int offset_px = view.y-(offset / 40 * 16);
-// remeber old value to know which part to update.
-vec2 previousViewport = { .x = 0, .y = 0 };
-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,
- .bg_shift_y = viewport.y,
- .fg_fetch = 0,
- .sysreset = 0,
- });
- // update previous viewport values
- previousViewport = viewport;
-}
+ // || (offset_px == 0 && lastUpdated != 0 && player.y/16 == currentTileY-5)
+ if( (offset_px > 230) ){
+ int size = (hh_max_x_size) * hh_max_y_size;
+ offset = currentTileY * level.x;
-void hh_setup_screen(){
- //(HH_map_size_X*HH_map_size_Y)
- int size = 2400; // max X = 40 en max Y = 80
- //TODO: remove magic file name here
- FILE* level = fopen("static/level1_test.bin", "rb"); /* open binary file */
- if (!level) { /* check if file opened successfully */
- fprintf(stderr, "Error: Failed to open level file.\n");
- return;
+ // Update the background screen
+ for (int BAM_index = 0; BAM_index < size; BAM_index++) {
+ hh_ppu_update_background(BAM_index, (hh_s_ppu_loc_bam_entry){
+ .horizontal_flip = false,
+ .vertical_flip = false,
+ .palette_index = hh_get_palette(level.place[offset+BAM_index]),
+ .tilemap_index = level.place[offset+BAM_index],
+ });
+ }
}
- fseek(level, (0* sizeof(int)) + sizeof(int), SEEK_SET);
- int* tile = (int*)malloc(size*sizeof(int));
- fread(tile, sizeof(int), size, level); // read 1 tile from binary
-
- fclose(level);
-
+}
+void hh_setup_screen(hh_level_entity currentlevel){
+ hh_clear_screen();
+ hh_clear_sprite();
+ level = currentlevel;
+ int size = hh_max_x_size* hh_max_y_size;
+ printf("hier\n");
for(int BAM_index = 0; BAM_index < size; BAM_index++){
hh_ppu_update_background(BAM_index, (hh_s_ppu_loc_bam_entry){
.horizontal_flip = false,
.vertical_flip = false,
- .palette_index = hh_get_palette(tile[BAM_index]),
- .tilemap_index = tile[BAM_index],
+ .palette_index = hh_get_palette(currentlevel.place[BAM_index]),
+ .tilemap_index = currentlevel.place[BAM_index],
});
}
- free(tile);
}
+vec_cor hh_draw_screen(vec2 player) {
+ static vec_cor previousViewport = {0, 0};
+ int offset_px = offset/40*16;
+ //printf("%d\n",offset_px%2);
+ vec_cor viewport = hh_update_camera(player,(vec2){.x=0,.y=offset_px},(vec2){.x=20*16,.y=30*16+offset_px/4});//TODO: remove magic number(s)
+
+ hh_update_screen((vec2){.y=viewport.y,.x=0},player);
+ if (viewport.x == previousViewport.x && viewport.y == previousViewport.y){}
+ else{
+ // update previous viewport values
+
+ //printf("viewport y %d\n",viewport.y-(offset/40*16));
+ //printf("offset %d\n",offset);
+ hh_ppu_update_aux((hh_s_ppu_loc_aux){
+ .bg_shift_x = viewport.x - 0,
+ .bg_shift_y = viewport.y-(offset/40*16),
+ .fg_fetch = 0,
+ .sysreset = 0,
+ });
+ previousViewport = viewport;
+
+ }
+
+ return viewport;
+}
+
void hh_clear_screen(){
// (HH_PPU_SCREEN_HEIGHT*HH_PPU_SCREEN_WIDTH)/(HH_PPU_SPRITE_HEIGHT*HH_PPU_SPRITE_WIDTH)
for (int i = 0; i < HH_PPU_BG_CANVAS_TILES_H*HH_PPU_BG_CANVAS_TILES_V; i++) {
diff --git a/src/engine/draw_screen.h b/src/engine/draw_screen.h
index 95765e5..0d1b68a 100644
--- a/src/engine/draw_screen.h
+++ b/src/engine/draw_screen.h
@@ -3,24 +3,32 @@
// every function call for drawing the screen goes here.
#include "engine/maths.h"
-#include "ppu/consts.h"
#include "ppu/ppu.h"
-
+#include "engine/level_const.h"
+#include "engine/sprite_controller.h"
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include "engine/camera.h"
-
-#define HH_map_size_X 80
-#define HH_map_size_Y 60
+#define hh_max_x_size 40
+#define hh_max_y_size 30
/** @brief return a single tile from world binary */
uint8_t hh_world_to_tile(vec2 pos);
+
/** @brief shift to level if viewport changed position */
-void hh_draw_screen(vec2 viewport);
+vec_cor hh_draw_screen(vec2 player);
+
/** @brief send data to BAM memory from binary level */
-void hh_setup_screen();
+void hh_setup_screen(hh_level_entity currentlevel);
+/** @brief updates screen based on view and maybe player position if it needs to turn back*/
+void hh_update_screen(vec2 view, vec2 );
+
/** @brief send black screen to background memory */
void hh_clear_screen();
+
/** @brief clears all sprite data */
void hh_clear_sprite();
+/** @brief send data to BAM memory from binary from shop */
+void hh_setup_Shop();
diff --git a/src/engine/level_const.c b/src/engine/level_const.c
new file mode 100644
index 0000000..b568e86
--- /dev/null
+++ b/src/engine/level_const.c
@@ -0,0 +1,22 @@
+#include "engine/level_const.h"
+
+
+hh_g_all_levels hh_init_game_levels(){
+ hh_g_all_levels levels;
+ levels.currentLevel=0;
+
+ levels.level[0].x=40;
+ levels.level[0].y=60;
+ levels.level[0].hh_level_completed=false;
+ FILE *fp = fopen("../test/bin/level1_test.bin", "rb");
+ fseek(fp, 0, SEEK_END);
+ int size = ftell(fp) / sizeof(int);
+ fseek(fp, (0 * sizeof(int)) + sizeof(int), SEEK_SET);
+ int* hh_game_level1 = malloc(size * sizeof(int));
+ fread(hh_game_level1, sizeof(int), size, fp);
+ fclose(fp);
+ levels.level[0].place = hh_game_level1;
+
+ return levels;
+}
+
diff --git a/src/engine/level_const.h b/src/engine/level_const.h
new file mode 100644
index 0000000..7a4aac5
--- /dev/null
+++ b/src/engine/level_const.h
@@ -0,0 +1,31 @@
+#pragma once
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <math.h>`
+
+typedef enum {
+ hh_e_STATE_startingScreen,
+ hh_e_STATE_Shop,
+ hh_e_STATE_Gameplay,
+ hh_e_STATE_GameOver,
+ hh_e_STATE_HighScore
+} hh_e_GameState;
+
+typedef struct {
+ int x;
+ int y;
+ int hh_total_enemies;
+ int* place;
+ bool hh_level_completed;
+}hh_level_entity;
+
+typedef struct {
+ hh_level_entity level[1];
+ int currentLevel;
+
+
+}hh_g_all_levels;
+
+hh_g_all_levels hh_init_game_levels();
diff --git a/src/makefile b/src/makefile
index cd248e2..d00b0ee 100644
--- a/src/makefile
+++ b/src/makefile
@@ -40,7 +40,10 @@ LOCAL_SRCS += main.c \
engine/entity.c \
engine/bullet.c \
engine/title_screen.c \
+ engine/level_const.c \
GameLoop/shop.c \
+ GameLoop/gameplay.c \
+ GameLoop/game_over.c \
GameLoop/startingScreen.c
CFLAGS += $(SHARED_FLAGS)