From 8f9a43d1ec836e5bc5f43e7403192300156d5c6d Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Wed, 22 Jan 2020 20:24:13 +1100 Subject: [PATCH] Added turret rotation --- assets/entities/turret.symtres | 57 +++++++++++++++++++++++++++++ assets/scenes/Level_1.symtres | 58 ++++++++++++++++++++++++++++- src/common/limits.h | 2 +- src/common/version.h | 2 +- src/game/enemy.c | 67 +++++++++++++++++++++------------- src/game/entity.h | 2 + src/game/player.c | 12 +++--- src/game/scene.c | 1 + todo.txt | 1 + 9 files changed, 166 insertions(+), 36 deletions(-) create mode 100644 assets/entities/turret.symtres diff --git a/assets/entities/turret.symtres b/assets/entities/turret.symtres new file mode 100644 index 0000000..1d8f5a1 --- /dev/null +++ b/assets/entities/turret.symtres @@ -0,0 +1,57 @@ +Entity +{ + type : 8 + scale : 1.000 1.000 1.000 + max_turn_angle : 60.0000 + rotation : 0.000 0.423 0.000 0.906 + health : 116 + active : true + position : 5.000 3.000 6.000 + bouding_box_min : -0.500 -0.500 -0.500 + enemy_type : 0 + turn_direction_positive : true + name : Turret + bouding_box_max : 0.500 0.500 0.500 + damage : 10 + turn_speed : 500.0000 +} + +Entity +{ + type : 7 + scale : 1.000 1.000 1.000 + volume : 1.0000 + rolloff_factor : 0.9500 + rotation : 0.000 0.000 0.000 1.000 + loop : false + sound_min_distance : 0.0000 + active : true + playing : false + position : 0.000 0.000 0.000 + bouding_box_min : -0.500 -0.500 -0.500 + source_filename : sounds/bullet_1.wav + sound_type : 1 + sound_max_distance : 10.0000 + name : Turret_Weapon_Sound + bouding_box_max : 0.500 0.500 0.500 + sound_attenuation_type : 2 +} + +Entity +{ + type : 6 + scale : 1.000 1.000 1.000 + material : 0 + rotation : 0.000 0.000 0.000 1.000 + diffuse_color : 0.055 0.863 0.839 1.000 + geometry : suzanne.symbres + specular : 0.4000 + active : true + diffuse_texture : default.tga + diffuse : 1.0000 + position : 0.000 0.000 0.000 + specular_strength : 62.0000 + name : Turret_Mesh + uv_scale : 0.300 0.200 +} + diff --git a/assets/scenes/Level_1.symtres b/assets/scenes/Level_1.symtres index b0dd756..ed3e831 100755 --- a/assets/scenes/Level_1.symtres +++ b/assets/scenes/Level_1.symtres @@ -16,9 +16,9 @@ Player { type : 2 scale : 1.000 1.000 1.000 - rotation : 0.000 0.028 0.000 -1.001 + rotation : 0.000 0.102 0.000 -0.997 active : true - position : 0.144 2.974 27.020 + position : -8.511 2.857 27.549 bouding_box_min : -0.500 -0.500 -0.500 name : Player bouding_box_max : 0.500 0.500 0.500 @@ -34,6 +34,15 @@ Scene_Entity_Entry name : Test_Light } +Scene_Entity_Entry +{ + scale : 1.000 1.000 1.000 + rotation : 0.000 0.000 0.000 1.000 + position : -0.442 2.759 1.544 + filename : Spot + name : Test_Light +} + Scene_Entity_Entry { scale : 68.000 1.000 68.000 @@ -115,3 +124,48 @@ Scene_Entity_Entry name : Cube } +Scene_Entity_Entry +{ + scale : 1.000 1.000 1.000 + rotation : 0.000 -0.158 0.000 0.988 + position : 0.000 3.000 0.000 + filename : turret + name : Turret +} + +Scene_Entity_Entry +{ + scale : 1.000 1.000 1.000 + rotation : 0.000 0.001 0.000 1.000 + position : -13.000 3.000 4.000 + filename : turret + name : Turret +} + +Scene_Entity_Entry +{ + scale : 1.000 1.000 1.000 + rotation : 0.000 0.005 0.000 1.000 + position : 12.000 3.000 6.000 + filename : turret + name : Turret +} + +Scene_Entity_Entry +{ + scale : 1.000 1.000 1.000 + rotation : 0.000 -0.450 0.000 0.893 + position : -7.000 3.000 2.000 + filename : turret + name : Turret +} + +Scene_Entity_Entry +{ + scale : 1.000 1.000 1.000 + rotation : 0.000 0.423 0.000 0.906 + position : 5.000 3.000 6.000 + filename : turret + name : Turret +} + diff --git a/src/common/limits.h b/src/common/limits.h index 3444afe..c2d4dae 100644 --- a/src/common/limits.h +++ b/src/common/limits.h @@ -6,7 +6,7 @@ #define MAX_FILENAME_LEN 128 #define MAX_EVENTS 128 -#define MAX_EVENT_SUBSCRIPTIONS 256 +#define MAX_EVENT_SUBSCRIPTIONS 2048 #define MAX_SCENE_ENTITIES 32 #define MAX_SCENE_LIGHTS 30 diff --git a/src/common/version.h b/src/common/version.h index 28d9455..82c748f 100755 --- a/src/common/version.h +++ b/src/common/version.h @@ -4,7 +4,7 @@ /* Auto generated version file. DO NOT MODIFY */ #define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MINOR 1 -#define SYMMETRY_VERSION_REVISION 316 +#define SYMMETRY_VERSION_REVISION 317 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/enemy.c b/src/game/enemy.c index e3d0755..e363386 100644 --- a/src/game/enemy.c +++ b/src/game/enemy.c @@ -2,6 +2,7 @@ #include "entity.h" #include "scene.h" #include "game.h" +#include "transform.h" #include "sound_source.h" #include "../common/log.h" #include "../common/hashmap.h" @@ -11,6 +12,7 @@ #include static void enemy_on_scene_loaded(struct Event* event, void* enemy_ptr); +static void enemy_update_turret(struct Enemy* enemy, struct Game_State* game_state, float dt); void enemy_init(struct Enemy* enemy, int type) { @@ -20,27 +22,16 @@ void enemy_init(struct Enemy* enemy, int type) enemy->base.type = ET_ENEMY; enemy->type = type; - char weapon_name_buffer[MAX_ENTITY_NAME_LEN]; - char mesh_name_buffer[MAX_ENTITY_NAME_LEN]; - memset(weapon_name_buffer, '\0', MAX_ENTITY_NAME_LEN); - memset(mesh_name_buffer, '\0', MAX_ENTITY_NAME_LEN); - - snprintf(weapon_name_buffer, MAX_ENTITY_NAME_LEN, "%s_Weapon_Sound", enemy->base.name); - snprintf(mesh_name_buffer, MAX_ENTITY_NAME_LEN, "%s_Mesh", enemy->base.name); - - struct Sound_Source* weapon_sound = NULL; - struct Static_Mesh* mesh = NULL; - /* Initialization specific to each enemy type */ switch(enemy->type) { case ENEMY_TURRET: { - enemy->Turret.turn_speed = 10.f; enemy->health = 100; enemy->damage = 10; - //weapon_sound = scene_sound_source_create(scene, weapon_name_buffer, enemy, "sounds/bullet_1.wav", ST_WAV, false, false); - //mesh = scene_static_mesh_create(scene, mesh_name_buffer, enemy, "suzanne.symbres", MAT_BLINN); + enemy->Turret.turn_direction_positive = true; + enemy->Turret.turn_speed = 10.f; + enemy->Turret.max_turn_angle = 60.f; break; } default: @@ -48,14 +39,6 @@ void enemy_init(struct Enemy* enemy, int type) break; } - //enemy->weapon_sound = weapon_sound ? weapon_sound : NULL; - //if(!weapon_sound) - // log_error("enemy:init", "Failed to add weapon sound for %s", enemy->base.name); - - //enemy->mesh = mesh ? mesh : NULL; - //if(!mesh) - // log_error("enemy:init", "Failed to add mesh from file for %s", enemy->base.name); - struct Event_Manager* event_manager = game_state->event_manager; event_manager_subscribe_with_object(event_manager, EVT_SCENE_LOADED, &enemy_on_scene_loaded, (void*)enemy); } @@ -82,7 +65,7 @@ void enemy_static_mesh_set(struct Enemy* enemy, const char* geometry_filename, i void enemy_update(struct Enemy* enemy, struct Scene* scene, float dt) { - static float enemy_update_interval = 1.f / 2.f; + static float enemy_update_interval = 1.f / 60.f; static float time_elapsed_since_last_update = 0.f; time_elapsed_since_last_update += dt; @@ -92,8 +75,11 @@ void enemy_update(struct Enemy* enemy, struct Scene* scene, float dt) time_elapsed_since_last_update = 0.f; struct Game_State* game_state = game_state_get(); - log_message("Enemy_update"); - sound_source_play(game_state->sound, enemy->weapon_sound); + switch(enemy->type) + { + case ENEMY_TURRET: enemy_update_turret(enemy, game_state, dt); break; + } + } void enemy_reset(struct Enemy* enemy) @@ -127,6 +113,8 @@ struct Enemy* enemy_read(struct Parser_Object* object, const char* name, struct case ENEMY_TURRET: { if(hashmap_value_exists(object->data, "turn_speed")) new_enemy->Turret.turn_speed = hashmap_float_get(object->data, "turn_speed"); + if(hashmap_value_exists(object->data, "max_turn_angle")) new_enemy->Turret.max_turn_angle = hashmap_float_get(object->data, "max_turn_angle"); + if(hashmap_value_exists(object->data, "turn_direction_positive")) new_enemy->Turret.turn_direction_positive = hashmap_bool_get(object->data, "turn_direction_positive"); } break; } @@ -145,6 +133,8 @@ void enemy_write(struct Enemy* enemy, struct Hashmap* entity_data) case ENEMY_TURRET: { hashmap_float_set(entity_data, "turn_speed", enemy->Turret.turn_speed); + hashmap_float_set(entity_data, "max_turn_angle", enemy->Turret.max_turn_angle); + hashmap_bool_set(entity_data, "turn_direction_positive", enemy->Turret.turn_direction_positive); } break; } @@ -154,7 +144,7 @@ void enemy_on_scene_loaded(struct Event* event, void* enemy_ptr) { struct Enemy* enemy = (struct Enemy*)enemy_ptr; - // Assign pointers to mesh and sound child entities + // Assign pointers to static_mesh and sound_source child entities for(int i = 0; i < array_len(enemy->base.transform.children); i++) { struct Entity* child = enemy->base.transform.children[i]; @@ -169,3 +159,28 @@ void enemy_on_scene_loaded(struct Event* event, void* enemy_ptr) // Do other post-scene-load initialization stuff per enemy type here } + +void enemy_update_turret(struct Enemy* enemy, struct Game_State* game_state, float dt) +{ + static vec3 turn_axis = { 0.f, 1.f, 0.f }; + float current_yaw = quat_get_yaw(&enemy->base.transform.rotation); + + float yaw = enemy->Turret.turn_speed * 1.f * dt; + if(!enemy->Turret.turn_direction_positive) + yaw *= -1.f; + + current_yaw += yaw; + if(current_yaw >= enemy->Turret.max_turn_angle) + { + yaw = 0.f; + enemy->Turret.turn_direction_positive = false; + } + else if(current_yaw <= -enemy->Turret.max_turn_angle) + { + yaw = 0.f; + enemy->Turret.turn_direction_positive = true; + } + + if(yaw != 0.f) + transform_rotate(enemy, &turn_axis, yaw, TS_LOCAL); +} diff --git a/src/game/entity.h b/src/game/entity.h index e534ea2..a9b63cd 100755 --- a/src/game/entity.h +++ b/src/game/entity.h @@ -204,6 +204,8 @@ struct Enemy struct { float turn_speed; + float max_turn_angle; + bool turn_direction_positive; }Turret; }; }; diff --git a/src/game/player.c b/src/game/player.c index e1745e0..ae879a9 100755 --- a/src/game/player.c +++ b/src/game/player.c @@ -83,12 +83,12 @@ void player_destroy(struct Player* player) void player_update(struct Player* player, struct Scene* scene, float dt) { /* Look around */ - static float total_pitch = 0.f; - float pitch = 0.f; - float yaw = 0.f; - float max_pitch = 80.f; - vec3 rot_axis_pitch = { 1, 0, 0 }; - vec3 rot_axis_yaw = { 0, 1, 0 }; + float total_pitch = quat_get_pitch(&player->camera->base.transform.rotation); + float pitch = 0.f; + float yaw = 0.f; + float max_pitch = 80.f; + vec3 rot_axis_pitch = { 1, 0, 0 }; + vec3 rot_axis_yaw = { 0, 1, 0 }; if(input_map_state_get("Turn_Up", KS_PRESSED)) pitch += player->turn_speed; if(input_map_state_get("Turn_Down", KS_PRESSED)) pitch -= player->turn_speed; diff --git a/src/game/scene.c b/src/game/scene.c index 77d0a54..0c89825 100755 --- a/src/game/scene.c +++ b/src/game/scene.c @@ -260,6 +260,7 @@ bool scene_save(struct Scene* scene, const char* filename, int directory_type) scene_write_entity_list(scene, ET_STATIC_MESH, parser); scene_write_entity_list(scene, ET_CAMERA, parser); scene_write_entity_list(scene, ET_SOUND_SOURCE, parser); + scene_write_entity_list(scene, ET_ENEMY, parser); if(parser_write_objects(parser, scene_file, prefixed_filename)) log_message("Scene saved to %s", prefixed_filename); diff --git a/todo.txt b/todo.txt index c016f1e..9c7161a 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,6 @@ Todo: - Enemy ray casting and shooting + - Scene reload command - Player shooting - Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded - Sky Cube maps