Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Thu May 09 08:12:41 2019 +0000
Revision:
54:03ddad11d202
Parent:
51:4d0cd75e7ed3
Child:
57:1c12361b6e3d
Snake Commented

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17sm 32:fe6359ef9916 1 #include "Snake.h"
el17sm 32:fe6359ef9916 2 #include "math.h"
el17sm 32:fe6359ef9916 3 #include <complex>
el17sm 32:fe6359ef9916 4
el17sm 32:fe6359ef9916 5 // Constructor
el17sm 32:fe6359ef9916 6 Snake::Snake(float pos_x, float pos_y)
el17sm 32:fe6359ef9916 7 {
el17sm 32:fe6359ef9916 8 hp = 4;
el17sm 32:fe6359ef9916 9 attack = 1;
el17sm 54:03ddad11d202 10 face = 0;
el17sm 54:03ddad11d202 11 _prev_face = 0;
el17sm 54:03ddad11d202 12 _hp_drop_chance = 10; // out of 100
el17sm 54:03ddad11d202 13
el17sm 32:fe6359ef9916 14 hitbox.width = 4;
el17sm 32:fe6359ef9916 15 hitbox.height = 7;
el17sm 54:03ddad11d202 16
el17sm 32:fe6359ef9916 17 position.x = pos_x;
el17sm 32:fe6359ef9916 18 position.y = pos_y;
el17sm 54:03ddad11d202 19
el17sm 32:fe6359ef9916 20 sprite_size.width = 6;
el17sm 32:fe6359ef9916 21 sprite_size.height = 12;
el17sm 33:4f3948dcd2f7 22 sprite_size.offset_x = -1;
el17sm 33:4f3948dcd2f7 23 sprite_size.offset_y = -6;
el17sm 54:03ddad11d202 24
el17sm 32:fe6359ef9916 25 frame.count = 0;
el17sm 32:fe6359ef9916 26 frame.number = 0;
el17sm 32:fe6359ef9916 27 frame.max = 6;
el17sm 54:03ddad11d202 28
el17sm 32:fe6359ef9916 29 velocity = 0;
el17sm 32:fe6359ef9916 30 _velocity_index = 0;
el17sm 32:fe6359ef9916 31 }
el17sm 32:fe6359ef9916 32 // Member Function
el17sm 32:fe6359ef9916 33 void Snake::update_prev_face()
el17sm 32:fe6359ef9916 34 {
el17sm 32:fe6359ef9916 35 _prev_face = face;
el17sm 32:fe6359ef9916 36 }
el17sm 32:fe6359ef9916 37
el17sm 32:fe6359ef9916 38 // Member Mutator
el17sm 32:fe6359ef9916 39 void Snake::update_hitbox(int hitbox_width, int hitbox_height, int sprite_size_width, int sprite_size_height, int sprite_size_offset_x, int sprite_size_offset_y, int max_frame) // Offset, Hitbox and Frame Count update
el17sm 32:fe6359ef9916 40 {
el17sm 32:fe6359ef9916 41 if (_prev_face != face) {
el17sm 54:03ddad11d202 42 frame.number = 0; // Resets animation everytime face changes
el17sm 36:92d131695e7c 43 hitbox.width = hitbox_width;
el17sm 32:fe6359ef9916 44 hitbox.height = hitbox_height;
el17sm 54:03ddad11d202 45
el17sm 32:fe6359ef9916 46 sprite_size.width = sprite_size_width;
el17sm 32:fe6359ef9916 47 sprite_size.height = sprite_size_height;
el17sm 32:fe6359ef9916 48 sprite_size.offset_x = sprite_size_offset_x;
el17sm 32:fe6359ef9916 49 sprite_size.offset_y = sprite_size_offset_y;
el17sm 54:03ddad11d202 50
el17sm 32:fe6359ef9916 51 frame.max = max_frame;
el17sm 32:fe6359ef9916 52 }
el17sm 32:fe6359ef9916 53 }
el17sm 32:fe6359ef9916 54
el17sm 32:fe6359ef9916 55 // Functions
el17sm 34:1d5b4da3935e 56 void Snake::move(float player_x, float player_y, char * map, bool * doorways)
el17sm 32:fe6359ef9916 57 {
el17sm 54:03ddad11d202 58 float diff_x = player_x - position.x;
el17sm 36:92d131695e7c 59 float diff_y = player_y - position.y;
el17sm 36:92d131695e7c 60 velocity = snake_velocity_pattern[_velocity_index]; // Creating slithering effect, changing velocity of movement
el17sm 32:fe6359ef9916 61 update_prev_face();
el17sm 32:fe6359ef9916 62
el17sm 32:fe6359ef9916 63 // Setting Face
el17sm 54:03ddad11d202 64 update_face(diff_x, diff_y);
el17sm 54:03ddad11d202 65
el17sm 54:03ddad11d202 66 // Movement
el17sm 54:03ddad11d202 67 move_snake(); // Movement and updating hitboxes
el17sm 54:03ddad11d202 68
el17sm 54:03ddad11d202 69 undo_move_x(entity_to_map_collision_test(position.x, prev_pos.y, map, doorways));
el17sm 54:03ddad11d202 70 undo_move_y(entity_to_map_collision_test(prev_pos.x, position.y, map, doorways));
el17sm 54:03ddad11d202 71
el17sm 54:03ddad11d202 72 increment_frame();
el17sm 54:03ddad11d202 73 }
el17sm 54:03ddad11d202 74
el17sm 54:03ddad11d202 75 void Snake::update_face(float diff_x, float diff_y) // Depending on the displacement of player from snake, after a full slither effect, change the face
el17sm 54:03ddad11d202 76 {
el17sm 32:fe6359ef9916 77 if (_velocity_index == 0) {
el17sm 36:92d131695e7c 78 if (abs(diff_x) > abs(diff_y)) {
el17sm 36:92d131695e7c 79 if (diff_x > 0) {
el17sm 32:fe6359ef9916 80 face = 1;
el17sm 32:fe6359ef9916 81 } else {
el17sm 32:fe6359ef9916 82 face = 3;
el17sm 32:fe6359ef9916 83 }
el17sm 32:fe6359ef9916 84 } else {
el17sm 36:92d131695e7c 85 if (diff_y > 0) {
el17sm 36:92d131695e7c 86 face = 2;
el17sm 36:92d131695e7c 87 } else {
el17sm 32:fe6359ef9916 88 face = 0;
el17sm 32:fe6359ef9916 89 }
el17sm 32:fe6359ef9916 90 }
el17sm 32:fe6359ef9916 91 }
el17sm 54:03ddad11d202 92 }
el17sm 32:fe6359ef9916 93
el17sm 54:03ddad11d202 94 void Snake::move_snake() // Moves the Snake according to velocity, updates the hitboxes everytime it changes face
el17sm 54:03ddad11d202 95 {
el17sm 32:fe6359ef9916 96 if (face == 0) {
el17sm 44:cc4cecfc639f 97 position.y -= velocity;
el17sm 33:4f3948dcd2f7 98 update_hitbox(4, 7, 6, 12, -1, -6, 6);
el17sm 32:fe6359ef9916 99 } else if (face == 1) {
el17sm 32:fe6359ef9916 100 position.x += velocity;
el17sm 33:4f3948dcd2f7 101 update_hitbox(7, 4, 12, 7, -6, -4, 4);
el17sm 32:fe6359ef9916 102 } else if (face == 2) {
el17sm 44:cc4cecfc639f 103 position.y += velocity;
el17sm 33:4f3948dcd2f7 104 update_hitbox(4, 7, 6, 12, -1, -5, 6);
el17sm 32:fe6359ef9916 105 } else if (face == 3) {
el17sm 32:fe6359ef9916 106 position.x -= velocity;
el17sm 36:92d131695e7c 107 update_hitbox(7, 4, 12, 7, 0, -4, 4);
el17sm 32:fe6359ef9916 108 }
el17sm 54:03ddad11d202 109 }
el17sm 32:fe6359ef9916 110
el17sm 54:03ddad11d202 111 void Snake::increment_frame() // Frame increment and velocity index increment
el17sm 54:03ddad11d202 112 {
el17sm 32:fe6359ef9916 113 frame.count++;
el17sm 54:03ddad11d202 114 if (frame.count >= 10) { // Every 10 frames, sprite_frames increments and velocity_index increments
el17sm 32:fe6359ef9916 115 frame.count = 0;
el17sm 32:fe6359ef9916 116 _velocity_index++;
el17sm 32:fe6359ef9916 117 frame.number++;
el17sm 54:03ddad11d202 118 if (_velocity_index >= 6) { // Velocity_index max; reset
el17sm 32:fe6359ef9916 119 _velocity_index = 0;
el17sm 32:fe6359ef9916 120 }
el17sm 54:03ddad11d202 121 if (frame.number >= frame.max) { // Frame.number max; reset
el17sm 32:fe6359ef9916 122 frame.number = 0;
el17sm 32:fe6359ef9916 123 }
el17sm 32:fe6359ef9916 124 }
el17sm 32:fe6359ef9916 125 }
el17sm 32:fe6359ef9916 126
el17sm 32:fe6359ef9916 127 void Snake::take_damage(int damage)
el17sm 32:fe6359ef9916 128 {
el17sm 32:fe6359ef9916 129 hp -= damage;
el17sm 32:fe6359ef9916 130 }
el17sm 32:fe6359ef9916 131
el17sm 54:03ddad11d202 132 char * Snake::get_frame() // Returns the frame needed
el17sm 32:fe6359ef9916 133 {
el17sm 32:fe6359ef9916 134 if(face == 0) {
el17sm 36:92d131695e7c 135 return (char *) sprite_snake_y[0][frame.number];
el17sm 32:fe6359ef9916 136 } else if(face == 1) {
el17sm 33:4f3948dcd2f7 137 return (char *) sprite_snake_x[0][frame.number];
el17sm 32:fe6359ef9916 138 } else if(face == 2) {
el17sm 36:92d131695e7c 139 return (char *) sprite_snake_y[1][frame.number];
el17sm 32:fe6359ef9916 140 } else if(face == 3) {
el17sm 33:4f3948dcd2f7 141 return (char *) sprite_snake_x[1][frame.number];
el17sm 32:fe6359ef9916 142 }
el17sm 32:fe6359ef9916 143 return 0;
el17sm 32:fe6359ef9916 144 }
el17sm 32:fe6359ef9916 145
el17sm 32:fe6359ef9916 146 void Snake::draw(N5110 &lcd)
el17sm 32:fe6359ef9916 147 {
el17sm 36:92d131695e7c 148 lcd.drawSpriteTransparent(get_pos_x()+sprite_size.offset_x,
el17sm 36:92d131695e7c 149 get_pos_y()+sprite_size.offset_y,
el17sm 36:92d131695e7c 150 sprite_size.height,
el17sm 36:92d131695e7c 151 sprite_size.width,
el17sm 36:92d131695e7c 152 get_frame());
el17sm 32:fe6359ef9916 153 }