From c44b522dede296cbfb939fcf8826fc7829c0e467 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 17 Jan 2023 15:24:23 +0900 Subject: [PATCH] Add anim_model_attack --- CMakeLists.txt | 2 ++ src/3d/anim_model_attack.cc | 66 +++++++++++++++++++++++++++++++++++++ src/3d/anim_model_attack.h | 30 +++++++++++++++++ src/constants.h | 10 ++++++ wasm_build/Makefile | 6 ++-- 5 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 src/3d/anim_model_attack.cc create mode 100644 src/3d/anim_model_attack.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f117512..4cae423 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ set(RPSDuelNative_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_sequence.cc" "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_shrink.cc" "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_grow.cc" + "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_attack.cc" ) set(RPSDuelNative_HEADERS @@ -46,6 +47,7 @@ set(RPSDuelNative_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_sequence.h" "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_shrink.h" "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_grow.h" + "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_attack.h" ) add_executable(RPSDuelNative ${RPSDuelNative_SOURCES}) diff --git a/src/3d/anim_model_attack.cc b/src/3d/anim_model_attack.cc new file mode 100644 index 0000000..64e98f8 --- /dev/null +++ b/src/3d/anim_model_attack.cc @@ -0,0 +1,66 @@ +#include "anim_model_attack.h" + +// third party includes +#include + +// local includes +#include "../constants.h" +#include "../helpers.h" +#include "a3f_conv.h" + +AnimModelAttack::AnimModelAttack(Model *model, A3F pos) + : Anims(model), + pos(pos), + offset{0.0F, 0.0F, 0.0F}, + timer(MODEL_ATTACK_TIME_0), + state(0) {} + +AnimModelAttack::~AnimModelAttack() {} + +bool AnimModelAttack::is_done() { return state == 3; } + +void AnimModelAttack::do_update(float dt) { + timer -= dt; + if (timer <= 0.0F) { + switch (state) { + case 0: + timer += MODEL_ATTACK_TIME_1; + state = 1; + break; + case 1: + timer += MODEL_ATTACK_TIME_2; + state = 2; + break; + default: + state = 3; + break; + } + } + + switch (state) { + case 0: + offset.at(1) = Helpers::lerp(0.0F, MODEL_ATTACK_0_Y, + 1.0F - timer / MODEL_ATTACK_TIME_0); + break; + case 1: + offset.at(0) = Helpers::lerp(MODEL_ATTACK_0_X, MODEL_ATTACK_1_X, + 1.0F - timer / MODEL_ATTACK_TIME_1); + offset.at(1) = Helpers::lerp(MODEL_ATTACK_0_Y, MODEL_ATTACK_1_Y, + 1.0F - timer / MODEL_ATTACK_TIME_1); + break; + case 2: + offset.at(0) = Helpers::lerp(MODEL_ATTACK_1_X, MODEL_ATTACK_2_X, + 1.0F - timer / MODEL_ATTACK_TIME_2); + offset.at(1) = Helpers::lerp(MODEL_ATTACK_1_Y, MODEL_ATTACK_2_Y, + 1.0F - timer / MODEL_ATTACK_TIME_2); + break; + default: + offset.at(0) = 0.0F; + offset.at(1) = 0.0F; + break; + } +} + +void AnimModelAttack::do_draw() { + DrawModel(*model, A3FToRV3(pos + offset), 1.0F, WHITE); +} diff --git a/src/3d/anim_model_attack.h b/src/3d/anim_model_attack.h new file mode 100644 index 0000000..2b77fa3 --- /dev/null +++ b/src/3d/anim_model_attack.h @@ -0,0 +1,30 @@ +#ifndef ROCK_PAPER_SCISSORS_DUEL_3D_MODEL_ATTACK_H_ +#define ROCK_PAPER_SCISSORS_DUEL_3D_MODEL_ATTACK_H_ + +#include "a3f.h" +#include "anims.h" + +class AnimModelAttack : public Anims { + public: + AnimModelAttack(Model *model, A3F pos); + ~AnimModelAttack() override; + + bool is_done() override; + + void do_update(float dt) override; + void do_draw() override; + + private: + A3F pos; + A3F offset; + float timer; + /* + * 0 - rising + * 1 - attacking + * 2 - fallback + * 3 - done + */ + int state; +}; + +#endif diff --git a/src/constants.h b/src/constants.h index 9412436..9093d9a 100644 --- a/src/constants.h +++ b/src/constants.h @@ -80,4 +80,14 @@ constexpr float QM_Y_TIMER_MAX = 3.5F; constexpr float MODEL_SHRINK_TIME = 1.0F; constexpr float MODEL_GROW_TIME = 1.0F; +constexpr float MODEL_ATTACK_TIME_0 = 0.4F; +constexpr float MODEL_ATTACK_TIME_1 = 0.3F; +constexpr float MODEL_ATTACK_TIME_2 = 0.4F; +constexpr float MODEL_ATTACK_0_X = 0.0F; +constexpr float MODEL_ATTACK_0_Y = 2.0F; +constexpr float MODEL_ATTACK_1_X = -1.0F; +constexpr float MODEL_ATTACK_1_Y = 0.2F; +constexpr float MODEL_ATTACK_2_X = 0.0F; +constexpr float MODEL_ATTACK_2_Y = 0.0F; + #endif diff --git a/wasm_build/Makefile b/wasm_build/Makefile index bf14251..2196f31 100644 --- a/wasm_build/Makefile +++ b/wasm_build/Makefile @@ -18,7 +18,8 @@ SOURCES = \ ../src/3d/anim_concurrent.cc \ ../src/3d/anim_sequence.cc \ ../src/3d/anim_model_shrink.cc \ - ../src/3d/anim_model_grow.cc + ../src/3d/anim_model_grow.cc \ + ../src/3d/anim_model_attack.cc HEADERS = \ ../src/constants.h \ @@ -35,7 +36,8 @@ HEADERS = \ ../src/3d/anim_concurrent.h \ ../src/3d/anim_sequence.h \ ../src/3d/anim_model_shrink.h \ - ../src/3d/anim_model_grow.h + ../src/3d/anim_model_grow.h \ + ../src/3d/anim_model_attack.h CXX = source ${HOME}/git/emsdk/emsdk_env.sh && em++ -- 2.49.0