"${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
"${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})
--- /dev/null
+#include "anim_model_attack.h"
+
+// third party includes
+#include <raylib.h>
+
+// 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);
+}
--- /dev/null
+#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
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
../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 \
../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++