]> git.seodisparate.com - RockPaperScissorsDuel/commitdiff
Add anim_model_attack
authorStephen Seo <seo.disparate@gmail.com>
Tue, 17 Jan 2023 06:24:23 +0000 (15:24 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Tue, 17 Jan 2023 06:24:23 +0000 (15:24 +0900)
CMakeLists.txt
src/3d/anim_model_attack.cc [new file with mode: 0644]
src/3d/anim_model_attack.h [new file with mode: 0644]
src/constants.h
wasm_build/Makefile

index f117512116038587309def89c6c675cf87c6afa9..4cae423f3c4bb5d856ad80c0410e2e192fd69dae 100644 (file)
@@ -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 (file)
index 0000000..64e98f8
--- /dev/null
@@ -0,0 +1,66 @@
+#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);
+}
diff --git a/src/3d/anim_model_attack.h b/src/3d/anim_model_attack.h
new file mode 100644 (file)
index 0000000..2b77fa3
--- /dev/null
@@ -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
index 9412436f1a5582cfe39c37cd7bd9d298462cde8a..9093d9a890c147f580ad523ca1428b40c9af7dd4 100644 (file)
@@ -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
index bf14251665c77338d0094fd82a082b637c2fcae2..2196f31c99a04e82012645a429f317f19db8ddb7 100644 (file)
@@ -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++