Added turret rotation

dev
Shariq Shah 6 years ago
parent 8bebda53e5
commit 8f9a43d1ec
  1. 57
      assets/entities/turret.symtres
  2. 58
      assets/scenes/Level_1.symtres
  3. 2
      src/common/limits.h
  4. 2
      src/common/version.h
  5. 67
      src/game/enemy.c
  6. 2
      src/game/entity.h
  7. 2
      src/game/player.c
  8. 1
      src/game/scene.c
  9. 1
      todo.txt

@ -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
}

@ -16,9 +16,9 @@ Player
{ {
type : 2 type : 2
scale : 1.000 1.000 1.000 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 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 bouding_box_min : -0.500 -0.500 -0.500
name : Player name : Player
bouding_box_max : 0.500 0.500 0.500 bouding_box_max : 0.500 0.500 0.500
@ -34,6 +34,15 @@ Scene_Entity_Entry
name : Test_Light 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 Scene_Entity_Entry
{ {
scale : 68.000 1.000 68.000 scale : 68.000 1.000 68.000
@ -115,3 +124,48 @@ Scene_Entity_Entry
name : Cube 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
}

@ -6,7 +6,7 @@
#define MAX_FILENAME_LEN 128 #define MAX_FILENAME_LEN 128
#define MAX_EVENTS 128 #define MAX_EVENTS 128
#define MAX_EVENT_SUBSCRIPTIONS 256 #define MAX_EVENT_SUBSCRIPTIONS 2048
#define MAX_SCENE_ENTITIES 32 #define MAX_SCENE_ENTITIES 32
#define MAX_SCENE_LIGHTS 30 #define MAX_SCENE_LIGHTS 30

@ -4,7 +4,7 @@
/* Auto generated version file. DO NOT MODIFY */ /* Auto generated version file. DO NOT MODIFY */
#define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MAJOR 0
#define SYMMETRY_VERSION_MINOR 1 #define SYMMETRY_VERSION_MINOR 1
#define SYMMETRY_VERSION_REVISION 316 #define SYMMETRY_VERSION_REVISION 317
#define SYMMETRY_VERSION_BRANCH "dev" #define SYMMETRY_VERSION_BRANCH "dev"
#endif #endif

@ -2,6 +2,7 @@
#include "entity.h" #include "entity.h"
#include "scene.h" #include "scene.h"
#include "game.h" #include "game.h"
#include "transform.h"
#include "sound_source.h" #include "sound_source.h"
#include "../common/log.h" #include "../common/log.h"
#include "../common/hashmap.h" #include "../common/hashmap.h"
@ -11,6 +12,7 @@
#include <string.h> #include <string.h>
static void enemy_on_scene_loaded(struct Event* event, void* enemy_ptr); 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) 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->base.type = ET_ENEMY;
enemy->type = type; 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 */ /* Initialization specific to each enemy type */
switch(enemy->type) switch(enemy->type)
{ {
case ENEMY_TURRET: case ENEMY_TURRET:
{ {
enemy->Turret.turn_speed = 10.f;
enemy->health = 100; enemy->health = 100;
enemy->damage = 10; enemy->damage = 10;
//weapon_sound = scene_sound_source_create(scene, weapon_name_buffer, enemy, "sounds/bullet_1.wav", ST_WAV, false, false); enemy->Turret.turn_direction_positive = true;
//mesh = scene_static_mesh_create(scene, mesh_name_buffer, enemy, "suzanne.symbres", MAT_BLINN); enemy->Turret.turn_speed = 10.f;
enemy->Turret.max_turn_angle = 60.f;
break; break;
} }
default: default:
@ -48,14 +39,6 @@ void enemy_init(struct Enemy* enemy, int type)
break; 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; 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); 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) 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; static float time_elapsed_since_last_update = 0.f;
time_elapsed_since_last_update += dt; 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; time_elapsed_since_last_update = 0.f;
struct Game_State* game_state = game_state_get(); struct Game_State* game_state = game_state_get();
log_message("Enemy_update"); switch(enemy->type)
sound_source_play(game_state->sound, enemy->weapon_sound); {
case ENEMY_TURRET: enemy_update_turret(enemy, game_state, dt); break;
}
} }
void enemy_reset(struct Enemy* enemy) 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: 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, "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; break;
} }
@ -145,6 +133,8 @@ void enemy_write(struct Enemy* enemy, struct Hashmap* entity_data)
case ENEMY_TURRET: case ENEMY_TURRET:
{ {
hashmap_float_set(entity_data, "turn_speed", enemy->Turret.turn_speed); 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; break;
} }
@ -154,7 +144,7 @@ void enemy_on_scene_loaded(struct Event* event, void* enemy_ptr)
{ {
struct Enemy* enemy = (struct Enemy*)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++) for(int i = 0; i < array_len(enemy->base.transform.children); i++)
{ {
struct Entity* child = 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 // 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);
}

@ -204,6 +204,8 @@ struct Enemy
struct struct
{ {
float turn_speed; float turn_speed;
float max_turn_angle;
bool turn_direction_positive;
}Turret; }Turret;
}; };
}; };

@ -83,7 +83,7 @@ void player_destroy(struct Player* player)
void player_update(struct Player* player, struct Scene* scene, float dt) void player_update(struct Player* player, struct Scene* scene, float dt)
{ {
/* Look around */ /* Look around */
static float total_pitch = 0.f; float total_pitch = quat_get_pitch(&player->camera->base.transform.rotation);
float pitch = 0.f; float pitch = 0.f;
float yaw = 0.f; float yaw = 0.f;
float max_pitch = 80.f; float max_pitch = 80.f;

@ -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_STATIC_MESH, parser);
scene_write_entity_list(scene, ET_CAMERA, parser); scene_write_entity_list(scene, ET_CAMERA, parser);
scene_write_entity_list(scene, ET_SOUND_SOURCE, 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)) if(parser_write_objects(parser, scene_file, prefixed_filename))
log_message("Scene saved to %s", prefixed_filename); log_message("Scene saved to %s", prefixed_filename);

@ -1,5 +1,6 @@
Todo: Todo:
- Enemy ray casting and shooting - Enemy ray casting and shooting
- Scene reload command
- Player shooting - Player shooting
- Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded - Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded
- Sky Cube maps - Sky Cube maps

Loading…
Cancel
Save