From eae46c07e9eda977e69cf5eafd888de496fd2d57 Mon Sep 17 00:00:00 2001 From: Marie <marie.audouard@polytechnique.edu> Date: Fri, 26 May 2023 11:55:50 +0200 Subject: [PATCH] Animated dragon mouth + tail, made dragon hitbox and death, improved enemy display complexity --- projet-code/scenes_inf443/base/src/dragon.cpp | 2 +- projet-code/scenes_inf443/base/src/scene.cpp | 113 +++++++++--------- 2 files changed, 60 insertions(+), 55 deletions(-) diff --git a/projet-code/scenes_inf443/base/src/dragon.cpp b/projet-code/scenes_inf443/base/src/dragon.cpp index 1b0cb51..cb13e73 100644 --- a/projet-code/scenes_inf443/base/src/dragon.cpp +++ b/projet-code/scenes_inf443/base/src/dragon.cpp @@ -22,7 +22,7 @@ void dragon::initialize_mvt(vec3 p, numarray<vec3> key_positions, numarray<float timer_mvt.t = timer_mvt.t_min; //Dragon hitbox - dragon_hitbox.initialize_hitbox(2, {{0,2.5*size,0},{0,-1.75*size,0.5*size}}, { size*3, size * 1.5}); + dragon_hitbox.initialize_hitbox(8, { {3.5 * size,0,0.5 * size},{2.25 * size,0,0.6 * size},{1.25 * size,0,0.5 * size} , {0.25,0,0.5 * size} ,{-1 * size,0,0.5 * size}, {-2 * size,0,0.5 * size}, {-2.9 * size,0,0.4 * size}, {-3.5 * size,0,0.4 * size} }, { size, 0.5 * size, 0.75 * size, 0.9 * size, 0.75 * size, 0.75 * size, 0.4 * size, 0.4 * size }); } void dragon::update_mvt() diff --git a/projet-code/scenes_inf443/base/src/scene.cpp b/projet-code/scenes_inf443/base/src/scene.cpp index 3a21a82..96f4f25 100644 --- a/projet-code/scenes_inf443/base/src/scene.cpp +++ b/projet-code/scenes_inf443/base/src/scene.cpp @@ -183,30 +183,32 @@ void scene_structure::display_bats() bats.update_mvt(); for (int i = 0; i < bats.N; i++) { - //Wing animation - bats.bat_mesh["Bat wing left1"].transform_local.rotation = rotation_transform::from_axis_angle({ 0,1,0 }, 0.5 * cos(5 * bats.bats_prop[i].timer_mvt.t)); - bats.bat_mesh["Bat wing right1"].transform_local.rotation = rotation_transform::from_axis_angle({ 0,1,0 }, -0.5 * cos(5 * bats.bats_prop[i].timer_mvt.t)); - //Rescale - bats.bat_mesh["Bat base"].drawable.model.scaling = bats.bats_prop[i].size; - bats.bat_mesh["Bat wing left1"].drawable.model.scaling = bats.bats_prop[i].size; - bats.bat_mesh["Bat wing right1"].drawable.model.scaling = bats.bats_prop[i].size; - //Make sure wings are at the right distance - bats.bat_mesh["Bat wing left1"].transform_local.translation = { -0.25f * bats.bats_prop[i].size, 0, 0 }; - bats.bat_mesh["Bat wing right1"].transform_local.translation = { 0.25f * bats.bats_prop[i].size, 0, 0 }; - - //Orientation and position of the bat along the path - rotation_transform rot = rotation_transform::from_vector_transform({ 0,-1,0 }, normalize(bats.bats_prop[i].pos_futur - bats.bats_prop[i].pos)); - bats.bat_mesh["Bat base"].transform_local.rotation = rot; - bats.bat_mesh["Bat base"].transform_local.translation = bats.bats_prop[i].pos; - - bats.bat_mesh.update_local_to_global_coordinates(); - if (!bats.bats_prop[i].isdead) draw(bats.bat_mesh, environment); - if (gui.display_wireframe) { - draw_wireframe(bats.bat_mesh, environment); - } + if (!bats.bats_prop[i].isdead) { + //Wing animation + bats.bat_mesh["Bat wing left1"].transform_local.rotation = rotation_transform::from_axis_angle({ 0,1,0 }, 0.5 * cos(5 * bats.bats_prop[i].timer_mvt.t)); + bats.bat_mesh["Bat wing right1"].transform_local.rotation = rotation_transform::from_axis_angle({ 0,1,0 }, -0.5 * cos(5 * bats.bats_prop[i].timer_mvt.t)); + //Rescale + bats.bat_mesh["Bat base"].drawable.model.scaling = bats.bats_prop[i].size; + bats.bat_mesh["Bat wing left1"].drawable.model.scaling = bats.bats_prop[i].size; + bats.bat_mesh["Bat wing right1"].drawable.model.scaling = bats.bats_prop[i].size; + //Make sure wings are at the right distance + bats.bat_mesh["Bat wing left1"].transform_local.translation = { -0.25f * bats.bats_prop[i].size, 0, 0 }; + bats.bat_mesh["Bat wing right1"].transform_local.translation = { 0.25f * bats.bats_prop[i].size, 0, 0 }; + + //Orientation and position of the bat along the path + rotation_transform rot = rotation_transform::from_vector_transform({ 0,-1,0 }, normalize(bats.bats_prop[i].pos_futur - bats.bats_prop[i].pos)); + bats.bat_mesh["Bat base"].transform_local.rotation = rot; + bats.bat_mesh["Bat base"].transform_local.translation = bats.bats_prop[i].pos; + + bats.bat_mesh.update_local_to_global_coordinates(); + draw(bats.bat_mesh, environment); + if (gui.display_wireframe) { + draw_wireframe(bats.bat_mesh, environment); + } - if (gui.display_hitbox) { - display_hitbox(bats.bats_prop[i].bat_hitbox, bats.bats_prop[i].pos, rot); + if (gui.display_hitbox) { + display_hitbox(bats.bats_prop[i].bat_hitbox, bats.bats_prop[i].pos, rot); + } } } } @@ -216,38 +218,40 @@ void scene_structure::display_dragons() dragons.update_mvt(); for (int i = 0; i < bats.N; i++) { - //Wing animation - dragons.dragon_mesh["Dragon wing left"].transform_local.rotation = rotation_transform::from_axis_angle({ 1,0,0.5 }, 0.5 * cos(5 * dragons.dragons_prop[i].timer_mvt.t)); - dragons.dragon_mesh["Dragon wing right"].transform_local.rotation = rotation_transform::from_axis_angle({ 1,0,0.5 }, -0.5 * cos(5 * dragons.dragons_prop[i].timer_mvt.t)); - //Rescale - dragons.dragon_mesh["Dragon base"].drawable.model.scaling = dragons.dragons_prop[i].size; - dragons.dragon_mesh["Dragon wing left"].drawable.model.scaling = dragons.dragons_prop[i].size; - dragons.dragon_mesh["Dragon wing right"].drawable.model.scaling = dragons.dragons_prop[i].size; - dragons.dragon_mesh["Dragon mouth"].drawable.model.scaling = dragons.dragons_prop[i].size; - dragons.dragon_mesh["Dragon tailmiddle"].drawable.model.scaling = dragons.dragons_prop[i].size; - dragons.dragon_mesh["Dragon tailend"].drawable.model.scaling = dragons.dragons_prop[i].size; - //Make sure wings are at the right distance - dragons.dragon_mesh["Dragon wing left"].transform_local.translation = { 0, -0.3f * dragons.dragons_prop[i].size, 0 }; - dragons.dragon_mesh["Dragon wing right"].transform_local.translation = { 0, 0.3f * dragons.dragons_prop[i].size, 0 }; - - //Orientation and position of the bat along the path - rotation_transform rot = rotation_transform::from_vector_transform({ 0,-1,0 }, normalize(dragons.dragons_prop[i].pos_futur - dragons.dragons_prop[i].pos)); - //dragons.dragon_mesh["Dragon base"].transform_local.rotation = rot; - dragons.dragon_mesh["Dragon base"].transform_local.translation = dragons.dragons_prop[i].pos; - - dragons.dragon_mesh.update_local_to_global_coordinates(); - if (!dragons.dragons_prop[i].isdead) //draw(dragons.dragon_mesh, environment); - if (gui.display_wireframe) { - draw_wireframe(dragons.dragon_mesh, environment); - } - - dragons.dragon_mesh["Dragon base"].transform_local.translation = {10,10, 10 + evaluate_terrain_height(10,10)}; - - dragons.dragon_mesh.update_local_to_global_coordinates(); - draw(dragons.dragon_mesh, environment); + if (!dragons.dragons_prop[i].isdead) { + //Wing animation + dragons.dragon_mesh["Dragon wing left"].transform_local.rotation = rotation_transform::from_axis_angle({ 1,0,0.5 }, 0.5 * cos(5 * dragons.dragons_prop[i].timer_mvt.t)); + dragons.dragon_mesh["Dragon wing right"].transform_local.rotation = rotation_transform::from_axis_angle({ 1,0,0.5 }, -0.5 * cos(5 * dragons.dragons_prop[i].timer_mvt.t)); + //Mouth animation + dragons.dragon_mesh["Dragon mouth"].transform_local.rotation = rotation_transform::from_axis_angle({ 0,1,0 }, 0.05 * cos(dragons.dragons_prop[i].timer_mvt.t)); + //Tail animation + dragons.dragon_mesh["Dragon tailmiddle"].transform_local.rotation = rotation_transform::from_axis_angle({ 0,1,0.5 }, 0.05 * cos(2 * dragons.dragons_prop[i].timer_mvt.t)); + dragons.dragon_mesh["Dragon tailend"].transform_local.rotation = rotation_transform::from_axis_angle({ 0.5,1,0.5 }, -0.01 * cos(2 * dragons.dragons_prop[i].timer_mvt.t)); + //Rescale + dragons.dragon_mesh["Dragon base"].drawable.model.scaling = dragons.dragons_prop[i].size; + dragons.dragon_mesh["Dragon wing left"].drawable.model.scaling = dragons.dragons_prop[i].size; + dragons.dragon_mesh["Dragon wing right"].drawable.model.scaling = dragons.dragons_prop[i].size; + dragons.dragon_mesh["Dragon mouth"].drawable.model.scaling = dragons.dragons_prop[i].size; + dragons.dragon_mesh["Dragon tailmiddle"].drawable.model.scaling = dragons.dragons_prop[i].size; + dragons.dragon_mesh["Dragon tailend"].drawable.model.scaling = dragons.dragons_prop[i].size; + //Make sure wings are at the right distance + dragons.dragon_mesh["Dragon wing left"].transform_local.translation = { 0, -0.3f * dragons.dragons_prop[i].size, 0 }; + dragons.dragon_mesh["Dragon wing right"].transform_local.translation = { 0, 0.3f * dragons.dragons_prop[i].size, 0 }; + + //Orientation and position of the bat along the path + rotation_transform rot = rotation_transform::from_vector_transform({ 1,0,0 }, normalize(dragons.dragons_prop[i].pos_futur - dragons.dragons_prop[i].pos)); + dragons.dragon_mesh["Dragon base"].transform_local.rotation = rot; + dragons.dragon_mesh["Dragon base"].transform_local.translation = dragons.dragons_prop[i].pos; + + dragons.dragon_mesh.update_local_to_global_coordinates(); + draw(dragons.dragon_mesh, environment); + if (gui.display_wireframe) { + draw_wireframe(dragons.dragon_mesh, environment); + } - if (gui.display_hitbox) { - display_hitbox(dragons.dragons_prop[i].dragon_hitbox, dragons.dragons_prop[i].pos, rot); + if (gui.display_hitbox) { + display_hitbox(dragons.dragons_prop[i].dragon_hitbox, dragons.dragons_prop[i].pos, rot); + } } } } @@ -355,6 +359,7 @@ void scene_structure::display_projectiles() { for (int i = 0; i < projectiles.N; i++) { for (int j = 0; j < bats.N; j++) { if (bats.bats_prop[j].bat_hitbox.is_in_hitbox(projectiles.projectiles_prop[i].pos, bats.bats_prop[j].pos)) bats.bats_prop[j].isdead = true; + if (dragons.dragons_prop[j].dragon_hitbox.is_in_hitbox(projectiles.projectiles_prop[i].pos, dragons.dragons_prop[j].pos)) dragons.dragons_prop[j].isdead = true; } projectiles.mesh.model.translation = projectiles.projectiles_prop[i].pos; projectiles.mesh.material.color = projectiles.projectiles_prop[i].color; -- GitLab