aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.vscode/settings.json4
-rw-r--r--src/GameLoop/shop.c30
-rw-r--r--src/GameLoop/shop.h16
-rw-r--r--src/GameLoop/startingScreen.c32
-rw-r--r--src/GameLoop/startingScreen.h14
-rw-r--r--src/demo.c54
-rw-r--r--src/engine/bullet.c44
-rw-r--r--src/engine/bullet.h16
-rw-r--r--src/engine/draw_screen.c26
-rw-r--r--src/engine/draw_screen.h5
-rw-r--r--src/engine/player_controller.c35
-rw-r--r--src/engine/title_screen.c93
-rw-r--r--src/engine/title_screen.h3
-rw-r--r--src/makefile6
-rw-r--r--src/ppusim/input.c1
15 files changed, 367 insertions, 12 deletions
diff --git a/.vscode/settings.json b/.vscode/settings.json
index d027762..f4d72ed 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -8,5 +8,7 @@
}
},
"cmake.configureOnOpen": false,
- "files.eol": "\n"
+ "files.eol": "\n",
+ "nrf-connect.topdir": "${nrf-connect.sdk:2.1.2}",
+ "nrf-connect.toolchain.path": "${nrf-connect.toolchain:2.1.2}"
}
diff --git a/src/GameLoop/shop.c b/src/GameLoop/shop.c
new file mode 100644
index 0000000..eb6bed5
--- /dev/null
+++ b/src/GameLoop/shop.c
@@ -0,0 +1,30 @@
+#include "shop.h"
+
+
+bool hh_show_Shop(){
+ static hh_e_ShopStates hh_e_Shop = hh_e_STATE_SHOW;
+
+ switch (hh_e_Shop)
+ {
+ case hh_e_STATE_SHOW:
+ //hh_clear_screen();
+
+ //hh_setup_shop();
+ hh_e_Shop = hh_e_STATE_Input;
+ return false;
+ break;
+ case hh_e_STATE_Input:
+ if(g_hh_controller_p1.button_primary){
+ hh_e_Shop = hh_e_STATE_END;
+ }
+ break;
+ case hh_e_STATE_END:
+ hh_e_Shop = hh_e_STATE_SHOW;
+ return true;
+ break;
+ default:
+ hh_e_Shop = hh_e_STATE_SHOW;
+ break;
+ }
+ return false;
+}
diff --git a/src/GameLoop/shop.h b/src/GameLoop/shop.h
new file mode 100644
index 0000000..4014f58
--- /dev/null
+++ b/src/GameLoop/shop.h
@@ -0,0 +1,16 @@
+#include "input.h"
+#include "engine/draw_screen.h"
+
+
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef enum {
+ hh_e_STATE_SHOW,
+ hh_e_STATE_Input,
+ hh_e_STATE_END
+} hh_e_ShopStates;
+
+
+bool hh_show_Shop();
diff --git a/src/GameLoop/startingScreen.c b/src/GameLoop/startingScreen.c
new file mode 100644
index 0000000..4fc5af9
--- /dev/null
+++ b/src/GameLoop/startingScreen.c
@@ -0,0 +1,32 @@
+#include "startingScreen.h"
+#include "input.h"
+#include "engine/title_screen.h"
+#include "engine/draw_screen.h"
+// #include "engine/player_controller.h"
+
+bool hh_show_startingScreen(){
+ static hh_e_screenStates hh_e_startingScreen = hh_e_STATE_SHOW;
+
+ switch (hh_e_startingScreen)
+ {
+ case hh_e_STATE_SHOW:
+ hh_clear_screen();
+ hh_init_title_screen();
+ hh_e_startingScreen = hh_e_STATE_Input;
+ return false;
+ break;
+ case hh_e_STATE_Input:
+ if(g_hh_controller_p1.button_primary){
+ hh_e_startingScreen = hh_e_STATE_END;
+ }
+ break;
+ case hh_e_STATE_END:
+ hh_e_startingScreen = hh_e_STATE_SHOW;
+ return true;
+ break;
+ default:
+ hh_e_startingScreen = hh_e_STATE_SHOW;
+ break;
+ }
+ return false;
+}
diff --git a/src/GameLoop/startingScreen.h b/src/GameLoop/startingScreen.h
new file mode 100644
index 0000000..f51cc66
--- /dev/null
+++ b/src/GameLoop/startingScreen.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef enum {
+ hh_e_STATE_SHOW,
+ hh_e_STATE_Input,
+ hh_e_STATE_END
+} hh_e_screenStates;
+
+
+bool hh_show_startingScreen();
+
diff --git a/src/demo.c b/src/demo.c
index d4d1bf7..22ee8b7 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -11,8 +11,18 @@
#include "engine/draw_screen.h"
#include "engine/player_controller.h"
#include "engine/sprite_controller.h"
+#include "GameLoop/startingScreen.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;
+
uint16_t g_hh_pos_x = 1000; // 0b0000 0001 0011 0110
@@ -37,7 +47,7 @@ hh_entity hh_g_player, hh_g_player_new;
void hh_demo_setup() {
hh_setup_palettes();
- hh_setup_screen();
+ // hh_setup_screen();
}
@@ -45,8 +55,46 @@ void hh_demo_setup() {
void hh_demo_loop(unsigned long frame) {
- hh_player_actions();
-
+ switch (hh_gameStates)
+ {
+ case hh_e_STATE_startingScreen:
+ bool ret = hh_show_startingScreen();
+ if(ret){
+ hh_gameStates = hh_e_STATE_Shop;
+ }
+ 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
+ break;
+ case hh_e_STATE_Gameplay:
+ hh_player_actions();
+
+ // TODO:
+ // function: if level complete goto shop
+ // function: if player is dead goto game over
+ break;
+ case hh_e_STATE_GameOver:
+ // TODO:
+ // function: show game over screen
+ // function: after time goto high score
+ break;
+ case hh_e_STATE_HighScore:
+ // TODO:
+ // fucntion: show all previously scored points
+ // function: button pressed goto starting screen
+ break;
+ default:
+ hh_gameStates = hh_e_STATE_startingScreen;
+ break;
+ }
}
// void sendData(uint8_t address, uint16_t data) {
diff --git a/src/engine/bullet.c b/src/engine/bullet.c
new file mode 100644
index 0000000..5aa9e51
--- /dev/null
+++ b/src/engine/bullet.c
@@ -0,0 +1,44 @@
+#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;
+ }
+}
+void drawBullet(Bullet* bullet){
+
+
+ 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;
+ });
+}
diff --git a/src/engine/bullet.h b/src/engine/bullet.h
new file mode 100644
index 0000000..ad67d84
--- /dev/null
+++ b/src/engine/bullet.h
@@ -0,0 +1,16 @@
+#pragma once
+#include "player_controller.h"
+
+typedef struct {
+ int x;
+ int y;
+ int velocity;
+ int isActive;
+ int hit;
+} Bullet;
+
+
+//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);
diff --git a/src/engine/draw_screen.c b/src/engine/draw_screen.c
index c4f3389..fed2cfa 100644
--- a/src/engine/draw_screen.c
+++ b/src/engine/draw_screen.c
@@ -60,3 +60,29 @@ void hh_setup_screen(){
}
free(tile);
}
+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++) {
+ hh_s_ppu_loc_bam_entry temp = {
+ .vertical_flip=false,.horizontal_flip = false,
+ .palette_index = 3,.tilemap_index = 0
+ };
+ hh_ppu_update_background(i,temp);
+ hh_ppu_update_color(3,0,(hh_ppu_rgb_color_t){0x0,0x0,0x0});
+ }
+ hh_ppu_update_aux((hh_s_ppu_loc_aux){
+ .bg_shift_x = 0,
+ .bg_shift_y = 0,
+ .fg_fetch = 0,
+ .sysreset = 0,
+ });
+}
+
+void hh_clear_sprite(){
+ for (int i = 0; i < HH_PPU_FG_SPRITE_COUNT; i++) {
+ hh_ppu_update_foreground(i,(hh_s_ppu_loc_fam_entry){
+ .position_x = -16,
+ .position_y = -16,
+ });
+ }
+}
diff --git a/src/engine/draw_screen.h b/src/engine/draw_screen.h
index b181108..d3abca6 100644
--- a/src/engine/draw_screen.h
+++ b/src/engine/draw_screen.h
@@ -19,3 +19,8 @@ uint8_t hh_world_to_tile(vec2 pos);
void hh_draw_screen(vec2 viewport);
/** @brief send data to BAM memory from binary level */
void hh_setup_screen();
+
+/** @brief send black screen to background memory */
+void hh_clear_screen();
+/** @brief clears all sprite data */
+void hh_clear_sprite();
diff --git a/src/engine/player_controller.c b/src/engine/player_controller.c
index d351bee..647b00c 100644
--- a/src/engine/player_controller.c
+++ b/src/engine/player_controller.c
@@ -6,7 +6,11 @@
#include "input.h"
+#include "engine/bullet.h"
void hh_player_actions() {
+ static Bullet bullet ={
+ .isActive=false,
+ };
static hh_entity player={
.hp = 4,
.speed = 6,
@@ -17,13 +21,13 @@ void hh_player_actions() {
.vel = (vec2){0,0},
.vec = (vec2){0,0},
.render = {
- .frame0 = 20,
- .palette = 7,
+ .frame0 = 80,
+ .palette = 3,
.fam = (hh_s_ppu_loc_fam_entry){
.horizontal_flip = false,
.vertical_flip = false,
- .palette_index = 7,
- .tilemap_index = 2,
+ .palette_index = 2,
+ .tilemap_index = 60,
}
}
}, player_new = {0};
@@ -114,6 +118,10 @@ void hh_player_actions() {
player.vel.y += 1; //gravity
}
+ if(g_hh_controller_p1.button_secondary==true){
+ shootBullet(player.pos,&bullet);
+ }
+ updateBullet(&bullet,5);
@@ -202,7 +210,7 @@ void hh_player_actions() {
// hh_solve_collision(tiles[i].pos, &player);
// }
// }
-
+
player = hh_background_collision ( player, player_new);
//player = player_new;
@@ -221,9 +229,22 @@ void hh_player_actions() {
player.render.fam.tilemap_index = 2;//TODO: these two lines should be redundant
player.render.fam.palette_index = 7;
- hh_ppu_update_foreground(0, player.render.fam);
+ // hh_ppu_update_foreground(0, player.render.fam);
+
+ for (int i = 0; i < 4; i++)
+ {
+ hh_s_ppu_loc_fam_entry temp = player.render.fam;
+ temp.position_x = player.render.fam.position_x+(!(player.vel.x>0)?-1:1)*(i%2?8:-8);
+ temp.position_y = player.render.fam.position_y+(i>1?0:-16);
+ temp.tilemap_index = player.render.frame0 + i;
+ temp.palette_index = player.render.palette;
+ temp.horizontal_flip = !(player.vel.x>0);
+ hh_ppu_update_foreground(i,temp);
+ }
+
+
- hh_ppu_update_foreground(1, enemy.render.fam);
+ hh_ppu_update_foreground(4, enemy.render.fam);
}
diff --git a/src/engine/title_screen.c b/src/engine/title_screen.c
new file mode 100644
index 0000000..9c7ed48
--- /dev/null
+++ b/src/engine/title_screen.c
@@ -0,0 +1,93 @@
+#include "ppu/ppu.h"
+#include "ppu/types.h"
+#include "ppu/consts.h"
+
+
+#include "engine/draw_screen.h"
+#include "engine/entity.h"
+
+void hh_init_title_screen(){
+
+ // hh_clear_screen();
+
+ //send data
+ uint8_t idx = 0;
+ const uint8_t tilemap_offset = 59;
+ int tiles_h = HH_PPU_BG_CANVAS_TILES_H;
+ int vp_h = HH_PPU_SCREEN_WIDTH/HH_PPU_SPRITE_WIDTH; //screen_h in tiles
+ int vert_offset = tiles_h*3;
+
+ const uint8_t arr[4][4] = {
+ {0,1,1,0},
+ {2,3,3,2},
+ {4,0,0,4},
+ {5,6,6,5},
+ };
+ int val, counter =0;
+ hh_ppu_update_color(5, 0, (hh_ppu_rgb_color_t) {0x1, 0x1, 0x1});
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ val = arr[i][j];
+
+ hh_s_ppu_loc_bam_entry temp = {
+ .vertical_flip=false, .horizontal_flip = ((j % 4 < 2) ? false : true),
+ .palette_index = (counter == 9 || counter == 10? 5:3), .tilemap_index = (val > 0 ? (tilemap_offset + val) : 0)
+ };
+
+ int vert_pos = tiles_h*i;
+ int x_pos = j;
+ idx = vert_offset + vert_pos + x_pos + vp_h/2-2;
+
+ hh_ppu_update_background(idx,temp);
+ counter++;
+ }
+
+ }
+
+
+ const uint8_t letters_offset = 66;
+ const int _size_hooded = 7, _size_v = 2;
+
+ // char* hh = "hooded";
+ int hooded_lookup[7][2]={
+ {0,1},{0,2},//H
+ {3,4},{3,4},//oo
+ {5,6},{13,9},//de
+ {5,6}//d
+ };
+
+ counter = 8;
+ for (int i = 0; i < _size_hooded; i++) {
+ for (int vert = 1; vert <= _size_v; vert++) {
+ //TODO: move 'H' a few pixels to the right for a more cohesive font spacing
+ hh_ppu_update_foreground(counter++, (hh_s_ppu_loc_fam_entry) {
+ .vertical_flip = false, .horizontal_flip = false,
+ .palette_index = 6, .tilemap_index = letters_offset + hooded_lookup[i][vert-1],
+ .position_x = (16*i + 64+48), .position_y = (16*(vert > 1 ? 0:1)*-1 + 64+8+16 +(i==2 || i==3 ? 6:0))
+ });
+ }
+ }
+
+
+ hh_ppu_update_color(5, 1, (hh_ppu_rgb_color_t) {0xa, 0x3, 0x3});
+ hh_ppu_update_color(5, 2, (hh_ppu_rgb_color_t) {0xc, 0x5, 0x3});
+
+ const int _size_havoc = 6;
+ int lookup_havoc[6][2]={
+ {0,1},{0,2},//H
+ {13,10},{7,8},//av
+ {13,11},{13,12}//oc
+ };
+
+ counter = 8 + (_size_hooded * _size_v);
+ for (int i = 0; i < _size_havoc; i++) {
+ for (int vert = 1; vert <= _size_v; vert++) {
+ //TODO: move 'H' a few pixels to the right for a more cohesive font spacing
+ hh_ppu_update_foreground(counter++, (hh_s_ppu_loc_fam_entry) {
+ .vertical_flip = false, .horizontal_flip = (i > 4 && vert==0 ? 1:0),
+ .palette_index = 5, .tilemap_index = letters_offset + lookup_havoc[i][vert-1],
+ .position_x = (16*i +64+32+8), .position_y = (16*(vert > 1 ? 0:1)*-1 + 64+8+48)
+ });
+ }
+ }
+}
diff --git a/src/engine/title_screen.h b/src/engine/title_screen.h
new file mode 100644
index 0000000..b5eda63
--- /dev/null
+++ b/src/engine/title_screen.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void hh_init_title_screen();
diff --git a/src/makefile b/src/makefile
index d7d9087..cd248e2 100644
--- a/src/makefile
+++ b/src/makefile
@@ -37,7 +37,11 @@ LOCAL_SRCS += main.c \
engine/draw_screen.c \
engine/camera.c \
engine/maths.c \
- engine/entity.c
+ engine/entity.c \
+ engine/bullet.c \
+ engine/title_screen.c \
+ GameLoop/shop.c \
+ GameLoop/startingScreen.c
CFLAGS += $(SHARED_FLAGS)
LFLAGS += $(SHARED_FLAGS)
diff --git a/src/ppusim/input.c b/src/ppusim/input.c
index 5323fb1..4bc7018 100644
--- a/src/ppusim/input.c
+++ b/src/ppusim/input.c
@@ -13,4 +13,5 @@ void hh_input_read() {
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];
+ g_hh_controller_p1.button_secondary = kb[SDL_SCANCODE_R];
}