- entity structure
- SpriteID
- generic sprite entity rendering
This commit is contained in:
randy 2024-07-08 15:33:42 +07:00
parent 9ebd7fa7eb
commit 339d690627

View file

@ -1,4 +1,25 @@
typedef struct Sprite {
Gfx_Image* image;
Vector2 size;
} Sprite;
typedef enum SpriteID {
SPRITE_nil,
SPRITE_player,
SPRITE_tree0,
SPRITE_tree1,
SPRITE_rock0,
SPRITE_MAX,
} SpriteID;
// randy: maybe we make this an X macro?? https://chatgpt.com/share/260222eb-2738-4d1e-8b1d-4973a097814d
Sprite sprites[SPRITE_MAX];
Sprite* get_sprite(SpriteID id) {
if (id >= 0 && id < SPRITE_MAX) {
return &sprites[id];
}
return &sprites[0];
}
typedef enum EntityArchetype { typedef enum EntityArchetype {
arch_nil = 0, arch_nil = 0,
arch_rock = 1, arch_rock = 1,
@ -10,6 +31,8 @@ typedef struct Entity {
bool is_valid; bool is_valid;
EntityArchetype arch; EntityArchetype arch;
Vector2 pos; Vector2 pos;
bool render_sprite;
SpriteID sprite_id;
} Entity; } Entity;
#define MAX_ENTITY_COUNT 1024 #define MAX_ENTITY_COUNT 1024
@ -36,11 +59,23 @@ void entity_destroy(Entity* entity) {
memset(entity, 0, sizeof(Entity)); memset(entity, 0, sizeof(Entity));
} }
void setup_player(Entity* en) {
en->arch = arch_player;
en->sprite_id = SPRITE_player;
}
void setup_rock(Entity* en) { void setup_rock(Entity* en) {
en->arch = arch_rock; en->arch = arch_rock;
// ... en->sprite_id = SPRITE_rock0;
} }
void setup_tree(Entity* en) {
en->arch = arch_tree;
en->sprite_id = SPRITE_tree0;
// en->sprite_id = SPRITE_tree1;
}
int entry(int argc, char **argv) { int entry(int argc, char **argv) {
window.title = STR("Randy's Game"); window.title = STR("Randy's Game");
window.width = 1280; window.width = 1280;
@ -51,22 +86,24 @@ int entry(int argc, char **argv) {
world = alloc(get_heap_allocator(), sizeof(World)); world = alloc(get_heap_allocator(), sizeof(World));
memset(world, 0, sizeof(World)); memset(world, 0, sizeof(World));
Gfx_Image* player = load_image_from_disk(STR("player.png"), get_heap_allocator()); sprites[SPRITE_player] = (Sprite){ .image=load_image_from_disk(STR("player.png"), get_heap_allocator()), .size=v2(6.0, 8.0) };
assert(player, "fuckie wucky happen"); sprites[SPRITE_tree0] = (Sprite){ .image=load_image_from_disk(STR("tree0.png"), get_heap_allocator()), .size=v2(7, 12) };
Gfx_Image* tree0 = load_image_from_disk(STR("tree0.png"), get_heap_allocator()); sprites[SPRITE_tree1] = (Sprite){ .image=load_image_from_disk(STR("tree1.png"), get_heap_allocator()), .size=v2(7, 12) };
assert(tree0, "fuckie wucky happen"); sprites[SPRITE_rock0] = (Sprite){ .image=load_image_from_disk(STR("rock0.png"), get_heap_allocator()), .size=v2(7, 4) };
Gfx_Image* tree1 = load_image_from_disk(STR("tree1.png"), get_heap_allocator());
assert(tree1, "fuckie wucky happen");
Gfx_Image* rock0 = load_image_from_disk(STR("rock0.png"), get_heap_allocator());
assert(rock0, "fuckie wucky happen");
Entity* player_en = entity_create(); Entity* player_en = entity_create();
setup_player(player_en);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
Entity* en = entity_create(); Entity* en = entity_create();
setup_rock(en); setup_rock(en);
en->pos = v2(i * 10.0, 0.0); en->pos = v2(get_random_float32_in_range(-200, 200), get_random_float32_in_range(-200, 200));
}
for (int i = 0; i < 10; i++) {
Entity* en = entity_create();
setup_tree(en);
en->pos = v2(get_random_float32_in_range(-200, 200), get_random_float32_in_range(-200, 200));
} }
float64 seconds_counter = 0.0; float64 seconds_counter = 0.0;
@ -83,30 +120,25 @@ int entry(int argc, char **argv) {
float64 now = os_get_current_time_in_seconds(); float64 now = os_get_current_time_in_seconds();
float64 delta_t = now - last_time; float64 delta_t = now - last_time;
last_time = now; last_time = now;
os_update(); os_update();
// :render
for (int i = 0; i < MAX_ENTITY_COUNT; i++) { for (int i = 0; i < MAX_ENTITY_COUNT; i++) {
Entity* en = &world->entities[i]; Entity* en = &world->entities[i];
if (en->is_valid) { if (en->is_valid) {
switch (en->arch) { switch (en->arch) {
case arch_rock: default:
{ {
Vector2 size = v2(7.0, 4.0); Sprite* sprite = get_sprite(en->sprite_id);
Matrix4 xform = m4_scalar(1.0); Matrix4 xform = m4_scalar(1.0);
xform = m4_translate(xform, v3(en->pos.x, en->pos.y, 0)); xform = m4_translate(xform, v3(en->pos.x, en->pos.y, 0));
xform = m4_translate(xform, v3(size.x * -0.5, 0.0, 0)); xform = m4_translate(xform, v3(sprite->size.x * -0.5, 0.0, 0));
draw_image_xform(rock0, xform, size, COLOR_RED); draw_image_xform(sprite->image, xform, sprite->size, COLOR_WHITE);
break;
} }
case arch_player:
{
}
default: {}
} }
} }
@ -132,22 +164,7 @@ int entry(int argc, char **argv) {
input_axis = v2_normalize(input_axis); input_axis = v2_normalize(input_axis);
player_en->pos = v2_add(player_en->pos, v2_mulf(input_axis, 100.0 * delta_t)); player_en->pos = v2_add(player_en->pos, v2_mulf(input_axis, 100.0 * delta_t));
{
Vector2 size = v2(6.0, 8.0);
Matrix4 xform = m4_scalar(1.0);
xform = m4_translate(xform, v3(player_en->pos.x, player_en->pos.y, 0));
xform = m4_translate(xform, v3(size.x * -0.5, 0.0, 0));
draw_image_xform(player, xform, size, COLOR_RED);
}
{
Vector2 size = v2(7.0, 12.0);
Matrix4 xform = m4_scalar(1.0);
xform = m4_translate(xform, v3(size.x * -0.5, 0.0, 0));
draw_image_xform(tree0, xform, size, COLOR_RED);
}
gfx_update(); gfx_update();
seconds_counter += delta_t; seconds_counter += delta_t;
frame_count += 1; frame_count += 1;