Added player start and fixed bug with editor camera pitch locking

dev
Shariq Shah 5 years ago
parent e7022af69f
commit 06adc22110
  1. 13
      assets/entities/player_start.symtres
  2. 89
      assets/scenes/scene_1.symtres
  3. 2
      src/common/version.h
  4. 52
      src/game/editor.c
  5. 23
      src/game/player.c
  6. 2
      todo.txt

@ -0,0 +1,13 @@
Entity
{
type : 1
scale : 1.000 1.000 1.000
rotation : 0.000 0.000 0.000 1.000
position : 57.000 6.000 8.000
flags : 193
name : PLAYER_START
archetype : player_start
bounding_box_min : -0.500 -0.500 -0.500
bounding_box_max : 0.500 0.500 0.500
}

@ -21,9 +21,9 @@ Player
{ {
type : 2 type : 2
scale : 1.000 1.000 1.000 scale : 1.000 1.000 1.000
rotation : 0.000 0.721 0.000 0.692 rotation : 0.000 -0.012 0.000 1.000
player_key_mask : 0 player_key_mask : 0
position : 48.866 2.167 7.616 position : 21.339 2.208 13.573
flags : 1 flags : 1
player_health : 100 player_health : 100
name : Player name : Player
@ -32,6 +32,19 @@ Player
bounding_box_max : 1.500 1.500 1.000 bounding_box_max : 1.500 1.500 1.000
} }
Entity
{
type : 1
scale : 1.000 1.000 1.000
rotation : 0.000 -1.000 0.000 0.000
position : 57.000 6.000 8.000
flags : 193
name : PLAYER_START
archetype : player_start
bounding_box_min : -0.500 -0.500 -0.500
bounding_box_max : 0.500 0.500 0.500
}
Entity Entity
{ {
type : 5 type : 5
@ -66,12 +79,12 @@ Entity
depth_bias : 0.0005 depth_bias : 0.0005
rotation : 0.000 0.000 0.000 1.000 rotation : 0.000 0.000 0.000 1.000
cast_shadow : false cast_shadow : false
intensity : 1.0000 intensity : 1.8500
color : 1.000 1.000 1.000 color : 0.929 0.067 0.067
radius : 20.0000 radius : 19.0000
position : -0.442 2.759 1.544 position : 20.000 6.000 -18.000
flags : 1 flags : 1
outer_angle : 30.0000 outer_angle : 41.0000
name : Test_Light name : Test_Light
archetype : Spot archetype : Spot
bounding_box_min : -0.500 -0.500 -0.500 bounding_box_min : -0.500 -0.500 -0.500
@ -145,20 +158,20 @@ Entity
Entity Entity
{ {
type : 6 type : 6
scale : 65.000 11.000 1.000 scale : 7.000 3.000 1.000
material : 0 material : 0
rotation : 0.000 0.000 0.000 1.000 rotation : 0.000 0.000 0.000 1.000
diffuse_color : 1.000 1.000 1.000 1.000 diffuse_color : 1.000 1.000 1.000 1.000
geometry : cube.symbres geometry : wall_tile.symbres
specular : 1.0000 specular : 0.4000
diffuse_texture : default.tga diffuse_texture : white.tga
diffuse : 1.0000 diffuse : 1.0000
position : 17.000 6.000 -30.000 position : 20.000 6.000 -27.000
flags : 1 flags : 1
specular_strength : 1.0000 specular_strength : 62.0000
name : Cube name : Wall_Tile
archetype : cube_uv archetype : wall_tile
uv_scale : 4.600 16.400 uv_scale : 0.300 0.200
} }
Entity Entity
@ -259,7 +272,7 @@ Entity
Entity Entity
{ {
type : 6 type : 6
scale : 7.000 3.000 1.000 scale : 3.000 3.000 1.000
material : 0 material : 0
rotation : 0.000 0.000 0.000 1.000 rotation : 0.000 0.000 0.000 1.000
diffuse_color : 1.000 1.000 1.000 1.000 diffuse_color : 1.000 1.000 1.000 1.000
@ -267,7 +280,7 @@ Entity
specular : 0.4000 specular : 0.4000
diffuse_texture : white.tga diffuse_texture : white.tga
diffuse : 1.0000 diffuse : 1.0000
position : 20.000 6.000 -6.000 position : 29.000 6.000 -6.000
flags : 1 flags : 1
specular_strength : 62.0000 specular_strength : 62.0000
name : Wall_Tile name : Wall_Tile
@ -332,6 +345,44 @@ Entity
uv_scale : 0.300 0.200 uv_scale : 0.300 0.200
} }
Entity
{
type : 6
scale : 3.000 3.000 1.000
material : 0
rotation : 0.000 0.000 0.000 1.000
diffuse_color : 1.000 1.000 1.000 1.000
geometry : wall_tile.symbres
specular : 0.4000
diffuse_texture : white.tga
diffuse : 1.0000
position : 12.000 6.000 -6.000
flags : 1
specular_strength : 62.0000
name : Wall_Tile
archetype : wall_tile
uv_scale : 0.300 0.200
}
Entity
{
type : 6
scale : 6.000 3.000 1.000
material : 0
rotation : 0.000 -0.707 0.000 0.707
diffuse_color : 1.000 1.000 1.000 1.000
geometry : wall_tile.symbres
specular : 0.4000
diffuse_texture : white.tga
diffuse : 1.0000
position : 6.000 6.000 -17.000
flags : 1
specular_strength : 62.0000
name : Wall_Tile
archetype : wall_tile
uv_scale : 0.300 0.200
}
Scene_Entity_Entry Scene_Entity_Entry
{ {
scale : 1.000 1.000 1.000 scale : 1.000 1.000 1.000
@ -432,7 +483,7 @@ Scene_Entity_Entry
{ {
scale : 1.000 1.000 1.000 scale : 1.000 1.000 1.000
rotation : 0.000 0.000 0.000 1.000 rotation : 0.000 0.000 0.000 1.000
position : -37.000 2.000 -74.000 position : 20.000 4.000 -17.000
filename : pickup_key_red filename : pickup_key_red
name : Pickup_Key_Red name : Pickup_Key_Red
} }

@ -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 2 #define SYMMETRY_VERSION_MINOR 2
#define SYMMETRY_VERSION_REVISION 367 #define SYMMETRY_VERSION_REVISION 368
#define SYMMETRY_VERSION_BRANCH "dev" #define SYMMETRY_VERSION_BRANCH "dev"
#endif #endif

@ -1489,21 +1489,19 @@ void editor_camera_update(struct Editor* editor, float dt)
if(game_state->console->visible || nk_item_is_any_active(&gui->context)) if(game_state->console->visible || nk_item_is_any_active(&gui->context))
return; return;
static float current_pitch = 0.f;
struct Camera* editor_camera = &game_state->scene->cameras[CAM_EDITOR]; struct Camera* editor_camera = &game_state->scene->cameras[CAM_EDITOR];
static float total_up_down_rot = 0.f;
float move_speed = editor->camera_move_speed, turn_speed = editor->camera_turn_speed; float move_speed = editor->camera_move_speed, turn_speed = editor->camera_turn_speed;
float turn_up_down = 0.f; float pitch = 0.f;
float turn_left_right = 0.f; float yaw = 0.f;
float max_up_down = 60.f; float max_pitch = 60.f;
vec3 offset = { 0, 0, 0 }; vec3 offset = { 0, 0, 0 };
vec3 rot_axis_up_down = { 1, 0, 0 };
vec3 rot_axis_left_right = { 0, 1, 0 };
/* Look around */ /* Look around */
if(input_map_state_get("Turn_Up", KS_PRESSED)) turn_up_down += turn_speed; if(input_map_state_get("Turn_Up", KS_PRESSED)) pitch += turn_speed;
if(input_map_state_get("Turn_Down", KS_PRESSED)) turn_up_down -= turn_speed; if(input_map_state_get("Turn_Down", KS_PRESSED)) pitch -= turn_speed;
if(input_map_state_get("Turn_Right", KS_PRESSED)) turn_left_right += turn_speed; if(input_map_state_get("Turn_Right", KS_PRESSED)) yaw += turn_speed;
if(input_map_state_get("Turn_Left", KS_PRESSED)) turn_left_right -= turn_speed; if(input_map_state_get("Turn_Left", KS_PRESSED)) yaw -= turn_speed;
if(input_mousebutton_state_get(MSB_RIGHT, KS_PRESSED) && !nk_item_is_any_active(&gui->context)) if(input_mousebutton_state_get(MSB_RIGHT, KS_PRESSED) && !nk_item_is_any_active(&gui->context))
{ {
@ -1517,36 +1515,32 @@ void editor_camera_update(struct Editor* editor, float dt)
cursor_lr = cursor_ud = 0; cursor_lr = cursor_ud = 0;
} }
turn_up_down = -cursor_ud * turn_speed * dt * scale; pitch = -cursor_ud * turn_speed * dt * scale;
turn_left_right = cursor_lr * turn_speed * dt * scale; yaw = cursor_lr * turn_speed * dt * scale;
} }
else else
{ {
turn_up_down *= dt; pitch *= dt;
turn_left_right *= dt; yaw *= dt;
} }
total_up_down_rot += turn_up_down; current_pitch = quat_get_pitch(&editor_camera->base.transform.rotation);
if(total_up_down_rot >= max_up_down) float new_pitch = current_pitch + pitch;
{ if(new_pitch > max_pitch)
total_up_down_rot = max_up_down; pitch = 0.f;
turn_up_down = 0.f;
} if(new_pitch < -max_pitch)
else if(total_up_down_rot <= -max_up_down) pitch = 0.f;
{
total_up_down_rot = -max_up_down;
turn_up_down = 0.f;
}
if(turn_left_right != 0.f) if(yaw != 0.f)
{ {
transform_rotate(editor_camera, &rot_axis_left_right, -turn_left_right, TS_WORLD); transform_rotate(editor_camera, &UNIT_Y, -yaw, TS_WORLD);
} }
if(turn_up_down != 0.f) if(pitch != 0.f)
{ {
//transform_rotate(editor_camera, &rot_axis_up_down, turn_up_down, TS_LOCAL); //transform_rotate(editor_camera, &rot_axis_up_down, turn_up_down, TS_LOCAL);
transform_rotate(editor_camera, &rot_axis_up_down, turn_up_down, TS_LOCAL); transform_rotate(editor_camera, &UNIT_X, pitch, TS_LOCAL);
} }
/* Movement */ /* Movement */

@ -28,6 +28,7 @@
static void player_on_mousebutton_released(const struct Event* event); static void player_on_mousebutton_released(const struct Event* event);
static void player_on_input_map_released(const struct Event* event); static void player_on_input_map_released(const struct Event* event);
static void player_on_scene_loaded(const struct Event* event);
void player_init(struct Player* player, struct Scene* scene) void player_init(struct Player* player, struct Scene* scene)
{ {
@ -128,12 +129,16 @@ void player_init(struct Player* player, struct Scene* scene)
event_manager_subscribe(game_state->event_manager, EVT_MOUSEBUTTON_RELEASED, &player_on_mousebutton_released); event_manager_subscribe(game_state->event_manager, EVT_MOUSEBUTTON_RELEASED, &player_on_mousebutton_released);
event_manager_subscribe(game_state->event_manager, EVT_INPUT_MAP_RELEASED, &player_on_input_map_released); event_manager_subscribe(game_state->event_manager, EVT_INPUT_MAP_RELEASED, &player_on_input_map_released);
event_manager_subscribe(game_state->event_manager, EVT_SCENE_LOADED, &player_on_scene_loaded);
} }
void player_destroy(struct Player* player) void player_destroy(struct Player* player)
{ {
event_manager_unsubscribe(game_state_get()->event_manager, EVT_MOUSEBUTTON_RELEASED, &player_on_mousebutton_released); struct Game_State* game_state = game_state_get();
event_manager_unsubscribe(game_state_get()->event_manager, EVT_INPUT_MAP_RELEASED, &player_on_input_map_released); struct Event_Manager* event_manager = game_state->event_manager;
event_manager_unsubscribe(event_manager, EVT_MOUSEBUTTON_RELEASED, &player_on_mousebutton_released);
event_manager_unsubscribe(event_manager, EVT_INPUT_MAP_RELEASED, &player_on_input_map_released);
event_manager_unsubscribe(event_manager, EVT_SCENE_LOADED, &player_on_scene_loaded);
entity_reset(player, player->base.id); entity_reset(player, player->base.id);
scene_entity_base_remove(game_state_get()->scene, &player->base); scene_entity_base_remove(game_state_get()->scene, &player->base);
player->base.flags = EF_NONE; player->base.flags = EF_NONE;
@ -449,3 +454,17 @@ void player_update(struct Player* player, float dt)
transform_update_transmat(player->muzzle_flash_mesh); transform_update_transmat(player->muzzle_flash_mesh);
} }
} }
void player_on_scene_loaded(const struct Event* event)
{
struct Scene* scene = game_state_get()->scene;
struct Player* player = &scene->player;
struct Entity* player_start = scene_entity_find(scene, "PLAYER_START");
if(player_start)
{
vec3 abs_pos = { 0.f };
transform_get_absolute_position(player_start, &abs_pos);
transform_set_position(player, &abs_pos);
}
}

@ -1,5 +1,4 @@
Todo: Todo:
- Add player start entity that specifies where the player must start at the beginning of every level
- Don't save parent entity's transform when saving entity archetype. Only save the transformation values for children - Don't save parent entity's transform when saving entity archetype. Only save the transformation values for children
- Save case sensitive file names when scene entity entries - Save case sensitive file names when scene entity entries
- Disbale all player actions when scene cleared dialog or scene restart dialog are active - Disbale all player actions when scene cleared dialog or scene restart dialog are active
@ -431,3 +430,4 @@ Done:
* Memory utils that provide allocation tracking * Memory utils that provide allocation tracking
* Game End * Game End
* Save NONE when next_scene is not set and the scene is being saved * Save NONE when next_scene is not set and the scene is being saved
* Add player start entity that specifies where the player must start at the beginning of every level
Loading…
Cancel
Save