Add emitter config to asset file loading

scene_man
En Yi 2023-11-06 21:36:23 +08:00
parent e39e549cd0
commit 26cc567b7f
5 changed files with 41 additions and 11 deletions

View File

@ -142,7 +142,7 @@ Font* add_font(Assets_t* assets, const char* name, const char* path)
return &fonts[fnt_idx].font;
}
EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name, Sprite_t* sprite)
EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name)
{
uint8_t emitter_idx = n_loaded[5];
assert(emitter_idx < MAX_EMITTER_CONF);

View File

@ -59,7 +59,7 @@ Texture2D* add_texture_rres(Assets_t* assets, const char* name, const char* file
LevelPack_t* add_level_pack_rres(Assets_t* assets, const char* name, const char* filename, const RresFileInfo_t* rres_file);
Sprite_t* add_sprite(Assets_t* assets, const char* name, Texture2D* texture);
EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name, Sprite_t* sprite);
EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name);
Texture2D* get_texture(Assets_t* assets, const char* name);
Sprite_t* get_sprite(Assets_t* assets, const char* name);

View File

@ -10,6 +10,7 @@
typedef enum PartEmitterType
{
EMITTER_BURST = 0,
EMITTER_UNKNOWN,
} PartEmitterType_t;
typedef struct Particle

View File

@ -62,15 +62,6 @@ int main(void)
scenes[0] = &scene.scene;
change_scene(&engine, 0);
EmitterConfig_t* conf = add_emitter_conf(&engine.assets, "pe_burst", get_sprite(&engine.assets, "bomb"));
conf->launch_range[0] = 240;
conf->launch_range[1] = 300;
conf->one_shot = true;
conf->speed_range[0] = 200;
conf->speed_range[1] = 300;
conf->particle_lifetime[0] = 30;
conf->particle_lifetime[1] = 110;
#if defined(PLATFORM_WEB)
puts("Setting emscripten main loop");
emscripten_set_main_loop(update_loop, 0, 1);

View File

@ -36,6 +36,27 @@ static bool parse_sprite_info(char* sprite_info_str, SpriteInfo_t* spr_info)
return data_count == 6;
}
static bool parse_emitter_info(char* emitter_info_str, EmitterConfig_t* conf)
{
char emitter_type;
uint8_t one_shot;
int data_count = sscanf(
emitter_info_str, "%c,%f-%f,%f-%f,%u-%u,%c",
&emitter_type,
conf->launch_range, conf->launch_range + 1,
conf->speed_range, conf->speed_range + 1,
conf->particle_lifetime, conf->particle_lifetime + 1,
&one_shot
);
if (data_count == 8)
{
conf->type = (emitter_type == 'b') ? EMITTER_BURST : EMITTER_UNKNOWN;
conf->one_shot = (one_shot == 1);
}
return data_count == 8;
}
bool load_from_rres(const char* file, Assets_t* assets)
{
RresFileInfo_t rres_file;
@ -192,6 +213,10 @@ bool load_from_infofile(const char* file, Assets_t* assets)
{
info_type = SOUND_INFO;
}
else if (strcmp(tmp, "Emitter") == 0)
{
info_type = EMITTER_INFO;
}
else if (strcmp(tmp, "LevelPack") == 0)
{
info_type = LEVELPACK_INFO;
@ -265,6 +290,19 @@ bool load_from_infofile(const char* file, Assets_t* assets)
spr->speed = spr_info.speed;
}
break;
case EMITTER_INFO:
{
EmitterConfig_t parsed_conf;
if (!parse_emitter_info(info_str, &parsed_conf))
{
printf("Parse error for emitter %s", name);
break;
}
EmitterConfig_t* conf = add_emitter_conf(assets, name);
*conf = parsed_conf;
printf("Added Emitter %s\n", name);
}
break;
default:
break;
}