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
Entity/Mobs/Snake/Snake.cpp@36:92d131695e7c, 2019-05-07 (annotated)
- Committer:
- el17sm
- Date:
- Tue May 07 01:11:07 2019 +0000
- Revision:
- 36:92d131695e7c
- Parent:
- 35:06cd6be999ad
- Child:
- 37:a404860171a9
Boss Skull Done
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 | 32:fe6359ef9916 | 8 | _damage_self_upon_collision = false; |
| el17sm | 32:fe6359ef9916 | 9 | _hp_drop_chance = 10; // out of 100 |
| el17sm | 32:fe6359ef9916 | 10 | moving = true; |
| el17sm | 32:fe6359ef9916 | 11 | _prev_face = 0; |
| el17sm | 32:fe6359ef9916 | 12 | face = 0; |
| el17sm | 32:fe6359ef9916 | 13 | hp = 4; |
| el17sm | 32:fe6359ef9916 | 14 | attack = 1; |
| el17sm | 32:fe6359ef9916 | 15 | hitbox.width = 4; |
| el17sm | 32:fe6359ef9916 | 16 | hitbox.height = 7; |
| el17sm | 32:fe6359ef9916 | 17 | position.x = pos_x; |
| el17sm | 32:fe6359ef9916 | 18 | position.y = pos_y; |
| el17sm | 32:fe6359ef9916 | 19 | sprite_size.width = 6; |
| el17sm | 32:fe6359ef9916 | 20 | sprite_size.height = 12; |
| el17sm | 33:4f3948dcd2f7 | 21 | sprite_size.offset_x = -1; |
| el17sm | 33:4f3948dcd2f7 | 22 | sprite_size.offset_y = -6; |
| el17sm | 32:fe6359ef9916 | 23 | frame.count = 0; |
| el17sm | 32:fe6359ef9916 | 24 | frame.number = 0; |
| el17sm | 32:fe6359ef9916 | 25 | frame.max = 6; |
| el17sm | 32:fe6359ef9916 | 26 | velocity = 0; |
| el17sm | 32:fe6359ef9916 | 27 | _velocity_index = 0; |
| el17sm | 32:fe6359ef9916 | 28 | } |
| el17sm | 32:fe6359ef9916 | 29 | // Member Function |
| el17sm | 32:fe6359ef9916 | 30 | void Snake::update_prev_face() |
| el17sm | 32:fe6359ef9916 | 31 | { |
| el17sm | 32:fe6359ef9916 | 32 | _prev_face = face; |
| el17sm | 32:fe6359ef9916 | 33 | } |
| el17sm | 32:fe6359ef9916 | 34 | |
| el17sm | 32:fe6359ef9916 | 35 | // Member Mutator |
| el17sm | 32:fe6359ef9916 | 36 | 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 | 37 | { |
| el17sm | 32:fe6359ef9916 | 38 | if (_prev_face != face) { |
| el17sm | 32:fe6359ef9916 | 39 | frame.number = 0; |
| el17sm | 36:92d131695e7c | 40 | hitbox.width = hitbox_width; |
| el17sm | 32:fe6359ef9916 | 41 | hitbox.height = hitbox_height; |
| el17sm | 32:fe6359ef9916 | 42 | sprite_size.width = sprite_size_width; |
| el17sm | 32:fe6359ef9916 | 43 | sprite_size.height = sprite_size_height; |
| el17sm | 32:fe6359ef9916 | 44 | sprite_size.offset_x = sprite_size_offset_x; |
| el17sm | 32:fe6359ef9916 | 45 | sprite_size.offset_y = sprite_size_offset_y; |
| el17sm | 32:fe6359ef9916 | 46 | frame.max = max_frame; |
| el17sm | 32:fe6359ef9916 | 47 | } |
| el17sm | 32:fe6359ef9916 | 48 | } |
| el17sm | 32:fe6359ef9916 | 49 | |
| el17sm | 32:fe6359ef9916 | 50 | // Functions |
| el17sm | 34:1d5b4da3935e | 51 | void Snake::move(float player_x, float player_y, char * map, bool * doorways) |
| el17sm | 32:fe6359ef9916 | 52 | { |
| el17sm | 36:92d131695e7c | 53 | float diff_x = player_x - position.x; // defining difference in position as a vector |
| el17sm | 36:92d131695e7c | 54 | float diff_y = player_y - position.y; |
| el17sm | 36:92d131695e7c | 55 | velocity = snake_velocity_pattern[_velocity_index]; // Creating slithering effect, changing velocity of movement |
| el17sm | 32:fe6359ef9916 | 56 | update_prev_face(); |
| el17sm | 32:fe6359ef9916 | 57 | |
| el17sm | 32:fe6359ef9916 | 58 | // Setting Face |
| el17sm | 32:fe6359ef9916 | 59 | if (_velocity_index == 0) { |
| el17sm | 36:92d131695e7c | 60 | if (abs(diff_x) > abs(diff_y)) { |
| el17sm | 36:92d131695e7c | 61 | if (diff_x > 0) { |
| el17sm | 32:fe6359ef9916 | 62 | face = 1; |
| el17sm | 32:fe6359ef9916 | 63 | } else { |
| el17sm | 32:fe6359ef9916 | 64 | face = 3; |
| el17sm | 32:fe6359ef9916 | 65 | } |
| el17sm | 32:fe6359ef9916 | 66 | } else { |
| el17sm | 36:92d131695e7c | 67 | if (diff_y > 0) { |
| el17sm | 36:92d131695e7c | 68 | face = 2; |
| el17sm | 36:92d131695e7c | 69 | } else { |
| el17sm | 32:fe6359ef9916 | 70 | face = 0; |
| el17sm | 32:fe6359ef9916 | 71 | } |
| el17sm | 32:fe6359ef9916 | 72 | } |
| el17sm | 32:fe6359ef9916 | 73 | } |
| el17sm | 32:fe6359ef9916 | 74 | |
| el17sm | 32:fe6359ef9916 | 75 | // Movement |
| el17sm | 32:fe6359ef9916 | 76 | if (face == 0) { |
| el17sm | 32:fe6359ef9916 | 77 | position.y += velocity; |
| el17sm | 33:4f3948dcd2f7 | 78 | update_hitbox(4, 7, 6, 12, -1, -6, 6); |
| el17sm | 32:fe6359ef9916 | 79 | } else if (face == 1) { |
| el17sm | 32:fe6359ef9916 | 80 | position.x += velocity; |
| el17sm | 33:4f3948dcd2f7 | 81 | update_hitbox(7, 4, 12, 7, -6, -4, 4); |
| el17sm | 32:fe6359ef9916 | 82 | } else if (face == 2) { |
| el17sm | 32:fe6359ef9916 | 83 | position.y -= velocity; |
| el17sm | 33:4f3948dcd2f7 | 84 | update_hitbox(4, 7, 6, 12, -1, -5, 6); |
| el17sm | 32:fe6359ef9916 | 85 | } else if (face == 3) { |
| el17sm | 32:fe6359ef9916 | 86 | position.x -= velocity; |
| el17sm | 36:92d131695e7c | 87 | update_hitbox(7, 4, 12, 7, 0, -4, 4); |
| el17sm | 32:fe6359ef9916 | 88 | } |
| el17sm | 32:fe6359ef9916 | 89 | |
| el17sm | 32:fe6359ef9916 | 90 | undo_move_x(entity_to_map_collision_test(position.x, prev_pos.y, map, doorways)); |
| el17sm | 32:fe6359ef9916 | 91 | undo_move_y(entity_to_map_collision_test(prev_pos.x, position.y, map, doorways)); |
| el17sm | 32:fe6359ef9916 | 92 | |
| el17sm | 32:fe6359ef9916 | 93 | frame.count++; |
| el17sm | 32:fe6359ef9916 | 94 | if (frame.count >= 10) { |
| el17sm | 32:fe6359ef9916 | 95 | frame.count = 0; |
| el17sm | 32:fe6359ef9916 | 96 | _velocity_index++; |
| el17sm | 32:fe6359ef9916 | 97 | frame.number++; |
| el17sm | 32:fe6359ef9916 | 98 | if (_velocity_index >= 6) { |
| el17sm | 32:fe6359ef9916 | 99 | _velocity_index = 0; |
| el17sm | 32:fe6359ef9916 | 100 | } |
| el17sm | 32:fe6359ef9916 | 101 | if (frame.number >= frame.max) { |
| el17sm | 32:fe6359ef9916 | 102 | frame.number = 0; |
| el17sm | 32:fe6359ef9916 | 103 | } |
| el17sm | 32:fe6359ef9916 | 104 | } |
| el17sm | 32:fe6359ef9916 | 105 | } |
| el17sm | 32:fe6359ef9916 | 106 | |
| el17sm | 32:fe6359ef9916 | 107 | void Snake::take_damage(int damage) |
| el17sm | 32:fe6359ef9916 | 108 | { |
| el17sm | 32:fe6359ef9916 | 109 | hp -= damage; |
| el17sm | 32:fe6359ef9916 | 110 | } |
| el17sm | 32:fe6359ef9916 | 111 | |
| el17sm | 33:4f3948dcd2f7 | 112 | char * Snake::get_frame() |
| el17sm | 32:fe6359ef9916 | 113 | { |
| el17sm | 32:fe6359ef9916 | 114 | if(face == 0) { |
| el17sm | 36:92d131695e7c | 115 | return (char *) sprite_snake_y[0][frame.number]; |
| el17sm | 32:fe6359ef9916 | 116 | } else if(face == 1) { |
| el17sm | 33:4f3948dcd2f7 | 117 | return (char *) sprite_snake_x[0][frame.number]; |
| el17sm | 32:fe6359ef9916 | 118 | } else if(face == 2) { |
| el17sm | 36:92d131695e7c | 119 | return (char *) sprite_snake_y[1][frame.number]; |
| el17sm | 32:fe6359ef9916 | 120 | } else if(face == 3) { |
| el17sm | 33:4f3948dcd2f7 | 121 | return (char *) sprite_snake_x[1][frame.number]; |
| el17sm | 32:fe6359ef9916 | 122 | } |
| el17sm | 32:fe6359ef9916 | 123 | return 0; |
| el17sm | 32:fe6359ef9916 | 124 | } |
| el17sm | 32:fe6359ef9916 | 125 | |
| el17sm | 32:fe6359ef9916 | 126 | void Snake::draw(N5110 &lcd) |
| el17sm | 32:fe6359ef9916 | 127 | { |
| el17sm | 36:92d131695e7c | 128 | lcd.drawSpriteTransparent(get_pos_x()+sprite_size.offset_x, |
| el17sm | 36:92d131695e7c | 129 | get_pos_y()+sprite_size.offset_y, |
| el17sm | 36:92d131695e7c | 130 | sprite_size.height, |
| el17sm | 36:92d131695e7c | 131 | sprite_size.width, |
| el17sm | 36:92d131695e7c | 132 | get_frame()); |
| el17sm | 32:fe6359ef9916 | 133 | } |