diff options
Diffstat (limited to 'src/engine')
-rw-r--r-- | src/engine/bullet.c | 65 | ||||
-rw-r--r-- | src/engine/bullet.h | 17 | ||||
-rw-r--r-- | src/engine/draw_screen.c | 103 | ||||
-rw-r--r-- | src/engine/draw_screen.h | 22 | ||||
-rw-r--r-- | src/engine/level_const.c | 22 | ||||
-rw-r--r-- | src/engine/level_const.h | 31 |
6 files changed, 159 insertions, 101 deletions
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(); |