Compare commits

..

5 Commits

Author SHA1 Message Date
En Yi bda335fd6a Fix mouse mode not activating buttons 2023-08-15 21:52:56 +08:00
En Yi e7c6f9929b Add sprite info for all crates 2023-08-15 21:08:46 +08:00
En Yi b980f16def Add sprite info for arrows and bombs 2023-08-15 20:43:04 +08:00
En Yi 6d97272420 Fix missing grid bound checking in game systems 2023-08-15 20:03:32 +08:00
En Yi cd8ec0c7ed Fix grid entities set update bug for OOB entities
When entities are marked for deletion, the tilecoord components
still exists, which can update the grid entities set, even if the
entity is not alive
2023-08-15 19:58:14 +08:00
5 changed files with 74 additions and 38 deletions

View File

@ -38,6 +38,8 @@
#define GROUND_X_FRICTION 5.8
#define GROUND_Y_FRICTION 1.0
#define ARROW_SPEED 350
#define MAX_WATER_LEVEL 4
#define WATER_BBOX_STEP (TILE_SIZE / MAX_WATER_LEVEL)

View File

@ -4,12 +4,15 @@
void remove_entity_from_tilemap(EntityManager_t *p_manager, TileGrid_t* tilemap, Entity_t* p_ent)
{
CTileCoord_t* p_tilecoord = get_component(p_ent, CTILECOORD_COMP_T);
for (size_t i = 0;i < p_tilecoord->n_tiles; ++i)
if (p_tilecoord != NULL)
{
// Use previously store tile position
// Clear from those positions
unsigned int tile_idx = p_tilecoord->tiles[i];
sc_map_del_64v(&(tilemap->tiles[tile_idx].entities_set), p_ent->m_id);
for (size_t i = 0;i < p_tilecoord->n_tiles; ++i)
{
// Use previously store tile position
// Clear from those positions
unsigned int tile_idx = p_tilecoord->tiles[i];
sc_map_del_64v(&(tilemap->tiles[tile_idx].entities_set), p_ent->m_id);
}
}
remove_entity(p_manager, p_ent->m_id);
}

View File

@ -1305,6 +1305,7 @@ void update_tilemap_system(Scene_t* scene)
sc_map_foreach(&scene->ent_manager.component_map[CTILECOORD_COMP_T], ent_idx, p_tilecoord)
{
Entity_t* p_ent = get_entity(&scene->ent_manager, ent_idx);
if (!p_ent->m_alive) continue;
CTransform_t* p_ctransform = get_component(p_ent, CTRANSFORM_COMP_T);
if (p_ctransform == NULL) continue;
CBBox_t* p_bbox = get_component(p_ent, CBBOX_COMP_T);
@ -1330,6 +1331,8 @@ void update_tilemap_system(Scene_t* scene)
tile_x2 = (p_ctransform->position.x + p_bbox->size.x - 1) / TILE_SIZE;
tile_y2 = (p_ctransform->position.y + p_bbox->size.y - 1) / TILE_SIZE;
}
tile_x2 = (tile_x2 >= tilemap.width) ? tilemap.width - 1 : tile_x2;
tile_y2 = (tile_y2 >= tilemap.height) ? tilemap.width - 1 : tile_y2;
for (unsigned int tile_y = tile_y1; tile_y <= tile_y2; tile_y++)
{
@ -1371,6 +1374,8 @@ void hitbox_update_system(Scene_t* scene)
unsigned int tile_y1 = (hitbox_pos.y) / TILE_SIZE;
unsigned int tile_x2 = (hitbox_pos.x + p_hitbox->boxes[i].width - 1) / TILE_SIZE;
unsigned int tile_y2 = (hitbox_pos.y + p_hitbox->boxes[i].height - 1) / TILE_SIZE;
tile_x2 = (tile_x2 >= tilemap.width) ? tilemap.width - 1 : tile_x2;
tile_y2 = (tile_y2 >= tilemap.height) ? tilemap.width - 1 : tile_y2;
for (unsigned int tile_y = tile_y1; tile_y <= tile_y2; tile_y++)
{

View File

@ -2,14 +2,29 @@
#include "constants.h"
#include "raymath.h"
static SpriteRenderInfo_t item_sprite_map[3] = {0};
static SpriteRenderInfo_t item_sprite_map[17] = {0};
bool init_item_creation(Assets_t* assets)
{
item_sprite_map[0].sprite = get_sprite(assets, "w_crate");
item_sprite_map[1].sprite = get_sprite(assets, "m_crate");
item_sprite_map[2].sprite = get_sprite(assets, "arrow");
item_sprite_map[2].sprite = get_sprite(assets, "r_arrow");
item_sprite_map[2].offset = (Vector2){-8, 4};
item_sprite_map[3].sprite = get_sprite(assets, "u_arrow");
item_sprite_map[4].sprite = get_sprite(assets, "l_arrow");
item_sprite_map[5].sprite = get_sprite(assets, "d_arrow");
item_sprite_map[6].sprite = get_sprite(assets, "bomb");
item_sprite_map[6].offset = (Vector2){0, -4};
item_sprite_map[7].sprite = get_sprite(assets, "w_ra_crate");
item_sprite_map[8].sprite = get_sprite(assets, "m_ra_crate");
item_sprite_map[9].sprite = get_sprite(assets, "w_ua_crate");
item_sprite_map[10].sprite = get_sprite(assets, "m_ua_crate");
item_sprite_map[11].sprite = get_sprite(assets, "w_la_crate");
item_sprite_map[12].sprite = get_sprite(assets, "m_la_crate");
item_sprite_map[13].sprite = get_sprite(assets, "w_da_crate");
item_sprite_map[14].sprite = get_sprite(assets, "m_da_crate");
item_sprite_map[15].sprite = get_sprite(assets, "w_b_crate");
item_sprite_map[16].sprite = get_sprite(assets, "m_b_crate");
return true;
}
@ -23,13 +38,6 @@ Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool meta
p_bbox->solid = true;
p_bbox->fragile = !metal;
if (item == CONTAINER_EMPTY)
{
CSprite_t* p_cspr = add_component(p_crate, CSPRITE_T);
p_cspr->sprites = item_sprite_map;
p_cspr->current_idx = metal? 1 : 0;
}
CTransform_t* p_ctransform = add_component(p_crate, CTRANSFORM_COMP_T);
p_ctransform->grav_delay = 7;
p_ctransform->shape_factor = metal ? (Vector2){0.7,0.7} : (Vector2){0.8,0.8} ;
@ -40,11 +48,24 @@ Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool meta
p_hurtbox->def = metal ? 2 : 1;
p_hurtbox->damage_src = -1;
CSprite_t* p_cspr = add_component(p_crate, CSPRITE_T);
p_cspr->sprites = item_sprite_map;
if (item != CONTAINER_EMPTY)
{
CContainer_t* p_container = add_component(p_crate, CCONTAINER_T);
p_container->item = item;
}
switch(item)
{
case CONTAINER_RIGHT_ARROW: p_cspr->current_idx = 7; break;
case CONTAINER_UP_ARROW: p_cspr->current_idx = 9; break;
case CONTAINER_LEFT_ARROW: p_cspr->current_idx = 11; break;
case CONTAINER_DOWN_ARROW: p_cspr->current_idx = 13; break;
case CONTAINER_BOMB: p_cspr->current_idx = 15; break;
default: p_cspr->current_idx = 0; break;
}
if (metal) p_cspr->current_idx++;
return p_crate;
}
@ -95,19 +116,22 @@ Entity_t* create_arrow(EntityManager_t* ent_manager, Assets_t* assets, uint8_t d
{
case 0:
p_hitbox->boxes[0] = (Rectangle){10, TILE_SIZE / 2 - 5, 10, 5};
p_ctransform->velocity.x = -250;
p_ctransform->velocity.x = -ARROW_SPEED;
p_cspr->current_idx += 2;
break;
case 2:
p_hitbox->boxes[0] = (Rectangle){TILE_SIZE / 2 - 5, 10, 5, 10};
p_ctransform->velocity.y = -250;
p_ctransform->velocity.y = -ARROW_SPEED;
p_cspr->current_idx += 1;
break;
case 3:
p_hitbox->boxes[0] = (Rectangle){TILE_SIZE / 2 - 5, 10, 5, 10};
p_ctransform->velocity.y = 250;
p_ctransform->velocity.y = ARROW_SPEED;
p_cspr->current_idx += 3;
break;
default:
p_hitbox->boxes[0] = (Rectangle){10, TILE_SIZE / 2 - 5, 10, 5};
p_ctransform->velocity.x = 250;
p_ctransform->velocity.x = ARROW_SPEED;
break;
}
@ -129,6 +153,10 @@ Entity_t* create_bomb(EntityManager_t* ent_manager, Assets_t* assets, Vector2 la
CContainer_t* p_container = add_component(p_bomb, CCONTAINER_T);
p_container->item = CONTAINER_EXPLOSION;
CSprite_t* p_cspr = add_component(p_bomb, CSPRITE_T);
p_cspr->sprites = item_sprite_map;
p_cspr->current_idx = 6;
CTransform_t* p_ctransform = add_component(p_bomb, CTRANSFORM_COMP_T);
p_ctransform->active = true;
p_ctransform->shape_factor = (Vector2){0.1, 0.1};

View File

@ -16,6 +16,21 @@ static void menu_scene_render_func(Scene_t* scene)
EndDrawing();
}
static void exec_component_function(Scene_t* scene, int sel)
{
switch(sel)
{
case 0:
change_scene(scene->engine, 1);
break;
case 1:
change_scene(scene->engine, 2);
break;
default:
break;
}
}
static void menu_do_action(Scene_t* scene, ActionType_t action, bool pressed)
{
MenuSceneData_t* data = &(CONTAINER_OF(scene, MenuScene_t, scene)->data);
@ -53,17 +68,7 @@ static void menu_do_action(Scene_t* scene, ActionType_t action, bool pressed)
data->selected_comp = new_selection;
if (action == ACTION_CONFIRM && scene->engine != NULL)
{
switch(data->selected_comp)
{
case 0:
change_scene(scene->engine, 1);
break;
case 1:
change_scene(scene->engine, 2);
break;
default:
break;
}
exec_component_function(scene, data->selected_comp);
}
}
}
@ -103,14 +108,7 @@ static void gui_loop(Scene_t* scene)
data->buttons[i].pressed = true;
if (scene->engine != NULL)
{
switch(i)
{
case 0:
change_scene(scene->engine, 1);
break;
default:
break;
}
exec_component_function(scene, i);
}
}
data->selected_comp = i;
@ -149,7 +147,7 @@ void init_menu_scene(MenuScene_t* scene)
};
scene->data.max_comp = 4;
scene->data.selected_comp = 0;
scene->data.mode = KEYBOARD_MODE;
scene->data.mode = MOUSE_MODE;
sc_map_put_64(&scene->scene.action_map, KEY_UP, ACTION_UP);
sc_map_put_64(&scene->scene.action_map, KEY_DOWN, ACTION_DOWN);