Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MotionSensor
Snake/Snake.cpp@60:44ddfb791e2b, 2019-05-09 (annotated)
- Committer:
- el17sm
- Date:
- Thu May 09 14:55:43 2019 +0000
- Revision:
- 60:44ddfb791e2b
- Parent:
- Entity/Mobs/Snake/Snake.cpp@57:1c12361b6e3d
Separated
Who changed what in which revision?
| User | Revision | Line number | New 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 | 57:1c12361b6e3d | 8 | _hp = 4; |
| el17sm | 57:1c12361b6e3d | 9 | _attack = 1; |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 14 | _hitbox.width = 4; |
| el17sm | 57:1c12361b6e3d | 15 | _hitbox.height = 7; |
| el17sm | 54:03ddad11d202 | 16 | |
| el17sm | 57:1c12361b6e3d | 17 | _position.x = pos_x; |
| el17sm | 57:1c12361b6e3d | 18 | _position.y = pos_y; |
| el17sm | 54:03ddad11d202 | 19 | |
| el17sm | 57:1c12361b6e3d | 20 | _sprite_size.width = 6; |
| el17sm | 57:1c12361b6e3d | 21 | _sprite_size.height = 12; |
| el17sm | 57:1c12361b6e3d | 22 | _sprite_size.offset_x = -1; |
| el17sm | 57:1c12361b6e3d | 23 | _sprite_size.offset_y = -6; |
| el17sm | 54:03ddad11d202 | 24 | |
| el17sm | 57:1c12361b6e3d | 25 | _frame.count = 0; |
| el17sm | 57:1c12361b6e3d | 26 | _frame.number = 0; |
| el17sm | 57:1c12361b6e3d | 27 | _frame.max = 6; |
| el17sm | 54:03ddad11d202 | 28 | |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 35 | _prev_face = _face; |
| el17sm | 32:fe6359ef9916 | 36 | } |
| el17sm | 32:fe6359ef9916 | 37 | |
| el17sm | 32:fe6359ef9916 | 38 | // Member Mutator |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 41 | if (_prev_face != _face) { |
| el17sm | 57:1c12361b6e3d | 42 | _frame.number = 0; // Resets animation everytime face changes |
| el17sm | 57:1c12361b6e3d | 43 | _hitbox.width = _hitbox_width; |
| el17sm | 57:1c12361b6e3d | 44 | _hitbox.height = _hitbox_height; |
| el17sm | 54:03ddad11d202 | 45 | |
| el17sm | 57:1c12361b6e3d | 46 | _sprite_size.width = _sprite_size_width; |
| el17sm | 57:1c12361b6e3d | 47 | _sprite_size.height = _sprite_size_height; |
| el17sm | 57:1c12361b6e3d | 48 | _sprite_size.offset_x = _sprite_size_offset_x; |
| el17sm | 57:1c12361b6e3d | 49 | _sprite_size.offset_y = _sprite_size_offset_y; |
| el17sm | 54:03ddad11d202 | 50 | |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 58 | float diff_x = player_x - _position.x; |
| el17sm | 57:1c12361b6e3d | 59 | float diff_y = player_y - _position.y; |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 67 | move_snake(); // Movement and updating _hitboxes |
| el17sm | 54:03ddad11d202 | 68 | |
| el17sm | 57:1c12361b6e3d | 69 | undo_move_x(entity_to_map_collision_test(_position.x, _prev_pos.y, map, doorways)); |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 80 | _face = 1; |
| el17sm | 32:fe6359ef9916 | 81 | } else { |
| el17sm | 57:1c12361b6e3d | 82 | _face = 3; |
| el17sm | 32:fe6359ef9916 | 83 | } |
| el17sm | 32:fe6359ef9916 | 84 | } else { |
| el17sm | 36:92d131695e7c | 85 | if (diff_y > 0) { |
| el17sm | 57:1c12361b6e3d | 86 | _face = 2; |
| el17sm | 36:92d131695e7c | 87 | } else { |
| el17sm | 57:1c12361b6e3d | 88 | _face = 0; |
| el17sm | 32:fe6359ef9916 | 89 | } |
| el17sm | 32:fe6359ef9916 | 90 | } |
| el17sm | 32:fe6359ef9916 | 91 | } |
| el17sm | 54:03ddad11d202 | 92 | } |
| el17sm | 32:fe6359ef9916 | 93 | |
| el17sm | 57:1c12361b6e3d | 94 | void Snake::move_snake() // Moves the Snake according to velocity, updates the _hitboxes everytime it changes face |
| el17sm | 54:03ddad11d202 | 95 | { |
| el17sm | 57:1c12361b6e3d | 96 | if (_face == 0) { |
| el17sm | 57:1c12361b6e3d | 97 | _position.y -= _velocity; |
| el17sm | 33:4f3948dcd2f7 | 98 | update_hitbox(4, 7, 6, 12, -1, -6, 6); |
| el17sm | 57:1c12361b6e3d | 99 | } else if (_face == 1) { |
| el17sm | 57:1c12361b6e3d | 100 | _position.x += _velocity; |
| el17sm | 33:4f3948dcd2f7 | 101 | update_hitbox(7, 4, 12, 7, -6, -4, 4); |
| el17sm | 57:1c12361b6e3d | 102 | } else if (_face == 2) { |
| el17sm | 57:1c12361b6e3d | 103 | _position.y += _velocity; |
| el17sm | 33:4f3948dcd2f7 | 104 | update_hitbox(4, 7, 6, 12, -1, -5, 6); |
| el17sm | 57:1c12361b6e3d | 105 | } else if (_face == 3) { |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 113 | _frame.count++; |
| el17sm | 57:1c12361b6e3d | 114 | if (_frame.count >= 10) { // Every 10 frames, sprite_frames increments and velocity_index increments |
| el17sm | 57:1c12361b6e3d | 115 | _frame.count = 0; |
| el17sm | 32:fe6359ef9916 | 116 | _velocity_index++; |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 121 | if (_frame.number >= _frame.max) { // Frame.number max; reset |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 134 | if(_face == 0) { |
| el17sm | 57:1c12361b6e3d | 135 | return (char *) sprite_snake_y[0][_frame.number]; |
| el17sm | 57:1c12361b6e3d | 136 | } else if(_face == 1) { |
| el17sm | 57:1c12361b6e3d | 137 | return (char *) sprite_snake_x[0][_frame.number]; |
| el17sm | 57:1c12361b6e3d | 138 | } else if(_face == 2) { |
| el17sm | 57:1c12361b6e3d | 139 | return (char *) sprite_snake_y[1][_frame.number]; |
| el17sm | 57:1c12361b6e3d | 140 | } else if(_face == 3) { |
| el17sm | 57:1c12361b6e3d | 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 | 57:1c12361b6e3d | 148 | lcd.drawSpriteTransparent(get_pos_x()+_sprite_size.offset_x, |
| el17sm | 57:1c12361b6e3d | 149 | get_pos_y()+_sprite_size.offset_y, |
| el17sm | 57:1c12361b6e3d | 150 | _sprite_size.height, |
| el17sm | 57:1c12361b6e3d | 151 | _sprite_size.width, |
| el17sm | 36:92d131695e7c | 152 | get_frame()); |
| el17sm | 32:fe6359ef9916 | 153 | } |