Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Revision:
32:fe6359ef9916
Child:
33:4f3948dcd2f7
diff -r ab24d028ddfd -r fe6359ef9916 Entity/Mobs/Headless/Headless.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Entity/Mobs/Headless/Headless.cpp	Mon May 06 08:56:48 2019 +0000
@@ -0,0 +1,71 @@
+#include "Headless.h"
+#include "math.h"
+#include <complex>
+
+Headless::Headless(float pos_x, float pos_y)
+{
+    _damage_self_upon_collision = false;
+    _hp_drop_chance = 10; // out of 100
+    moving = true;
+    face = 0;
+    hp = 4;
+    attack = 1;
+    hitbox.width = 6;
+    hitbox.height = 5;
+    position.x = pos_x;
+    position.y = pos_y;
+    sprite_size.width = 6;
+    sprite_size.height = 9;
+    sprite_size.offset_x = 0;
+    sprite_size.offset_y = 4;
+    frame.count = 0;
+    frame.number = 0;
+    frame.max = 4;
+    velocity = 0.25;
+}
+
+void Headless::move(float player_x, float player_y, int * map, bool * doorways)
+{
+    std::complex<double> pos_diff(player_x - position.x, player_y - position.y); // defining difference in position as a vector
+    position.x += velocity * pos_diff.real() / std::abs(pos_diff);
+    position.y += velocity * pos_diff.imag() / std::abs(pos_diff);
+
+    if (pos_diff.imag() / std::abs(pos_diff) < 0 && abs(pos_diff.imag() / std::abs(pos_diff)) > abs(pos_diff.real() / std::abs(pos_diff))) {
+        face = 2;
+    } else if (pos_diff.imag() / std::abs(pos_diff) > 0 && abs(pos_diff.imag() / std::abs(pos_diff)) > abs(pos_diff.real() / std::abs(pos_diff))) {
+        face = 0;
+    } else if (pos_diff.real() / std::abs(pos_diff) > 0 && abs(pos_diff.real() / std::abs(pos_diff)) > abs(pos_diff.imag() / std::abs(pos_diff))) {
+        face = 1;
+    } else if (pos_diff.real() / std::abs(pos_diff) < 0 && abs(pos_diff.real() / std::abs(pos_diff)) > abs(pos_diff.imag() / std::abs(pos_diff))) {
+        face = 3;
+    }
+
+    undo_move_x(entity_to_map_collision_test(position.x, prev_pos.y, map, doorways));
+    undo_move_y(entity_to_map_collision_test(prev_pos.x, position.y, map, doorways));
+
+    if (frame.number < frame.max) {
+        frame.count++;
+    } else {
+        frame.count = 0;
+    }
+    frame.number = (frame.count/16) % frame.max;
+}
+
+void Headless::draw(N5110 &lcd)
+{
+    lcd.drawSpriteTransparent(position.x-sprite_size.offset_x,
+                              position.y-sprite_size.offset_y,
+                              sprite_size.height,
+                              sprite_size.width,
+                              get_frame());
+}
+
+void Headless::take_damage(int damage)
+{
+    hp -= damage;
+}
+
+int * Headless::get_frame()
+{
+    return (int *) sprite_headless[face][frame.number];
+}
\ No newline at end of file