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/Snake/Snake.cpp@22:7abf4581bc9b, 2019-04-25 (annotated)
- Committer:
- el17sm
- Date:
- Thu Apr 25 05:53:30 2019 +0000
- Revision:
- 22:7abf4581bc9b
- Parent:
- 18:3c030560e31d
- Child:
- 23:5a8f75e93508
Snakes 90% done, need to change entity to group of entity collision into repulsion
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| el17sm | 16:ddb203a74dfc | 1 | #include "Snake.h" |
| el17sm | 16:ddb203a74dfc | 2 | #include "math.h" |
| el17sm | 16:ddb203a74dfc | 3 | #include <complex> |
| el17sm | 16:ddb203a74dfc | 4 | |
| el17sm | 17:99e533f7f2fb | 5 | // Constructor |
| el17sm | 22:7abf4581bc9b | 6 | Snake::Snake(float pos_x, float pos_y) |
| el17sm | 22:7abf4581bc9b | 7 | { |
| el17sm | 16:ddb203a74dfc | 8 | moving = true; |
| el17sm | 17:99e533f7f2fb | 9 | _prev_face = 0; |
| el17sm | 16:ddb203a74dfc | 10 | face = 0; |
| el17sm | 16:ddb203a74dfc | 11 | hp = 4; |
| el17sm | 16:ddb203a74dfc | 12 | hitbox.width = 6; |
| el17sm | 16:ddb203a74dfc | 13 | hitbox.height = 5; |
| el17sm | 16:ddb203a74dfc | 14 | position.x = pos_x; |
| el17sm | 16:ddb203a74dfc | 15 | position.y = pos_y; |
| el17sm | 16:ddb203a74dfc | 16 | sprite_size.width = 6; |
| el17sm | 16:ddb203a74dfc | 17 | sprite_size.height = 9; |
| el17sm | 16:ddb203a74dfc | 18 | sprite_size.offset_x = 0; |
| el17sm | 16:ddb203a74dfc | 19 | sprite_size.offset_y = 4; |
| el17sm | 16:ddb203a74dfc | 20 | frame.count = 0; |
| el17sm | 16:ddb203a74dfc | 21 | frame.number = 0; |
| el17sm | 16:ddb203a74dfc | 22 | frame.max = 6; |
| el17sm | 17:99e533f7f2fb | 23 | velocity = 0; |
| el17sm | 17:99e533f7f2fb | 24 | _velocity_index = 0; |
| el17sm | 17:99e533f7f2fb | 25 | } |
| el17sm | 17:99e533f7f2fb | 26 | // Member Function |
| el17sm | 22:7abf4581bc9b | 27 | void Snake::update_prev_face() |
| el17sm | 22:7abf4581bc9b | 28 | { |
| el17sm | 22:7abf4581bc9b | 29 | _prev_face = face; |
| el17sm | 22:7abf4581bc9b | 30 | } |
| el17sm | 17:99e533f7f2fb | 31 | |
| el17sm | 17:99e533f7f2fb | 32 | // Member Mutator |
| el17sm | 22:7abf4581bc9b | 33 | void Snake::update_hitbox(int hitbox_width, int hitbox_height, int hitbox_offset_x, int hitbox_offset_y, 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 | 22:7abf4581bc9b | 34 | { |
| el17sm | 22:7abf4581bc9b | 35 | if (_prev_face != face) { |
| el17sm | 18:3c030560e31d | 36 | frame.number = 0; |
| el17sm | 17:99e533f7f2fb | 37 | hitbox.width = sprite_size.offset_y; |
| el17sm | 17:99e533f7f2fb | 38 | hitbox.height = hitbox_height; |
| el17sm | 17:99e533f7f2fb | 39 | sprite_size.width = sprite_size_width; |
| el17sm | 17:99e533f7f2fb | 40 | sprite_size.height = sprite_size_height; |
| el17sm | 17:99e533f7f2fb | 41 | sprite_size.offset_x = sprite_size_offset_x; |
| el17sm | 17:99e533f7f2fb | 42 | sprite_size.offset_y = sprite_size_offset_y; |
| el17sm | 18:3c030560e31d | 43 | frame.max = max_frame; |
| el17sm | 17:99e533f7f2fb | 44 | } |
| el17sm | 16:ddb203a74dfc | 45 | } |
| el17sm | 16:ddb203a74dfc | 46 | |
| el17sm | 17:99e533f7f2fb | 47 | // Functions |
| el17sm | 22:7abf4581bc9b | 48 | void Snake::move(float player_x, float player_y) |
| el17sm | 22:7abf4581bc9b | 49 | { |
| el17sm | 16:ddb203a74dfc | 50 | std::complex<double> pos_diff(player_x - position.x, player_y - position.y); // defining difference in position as a vector |
| el17sm | 17:99e533f7f2fb | 51 | velocity = velocity_pattern[_velocity_index]; // Creating slithering effect, changing velocity of movement |
| el17sm | 17:99e533f7f2fb | 52 | update_prev_face(); |
| el17sm | 22:7abf4581bc9b | 53 | |
| el17sm | 16:ddb203a74dfc | 54 | // Setting Face |
| el17sm | 17:99e533f7f2fb | 55 | if (_velocity_index == 0) { |
| el17sm | 16:ddb203a74dfc | 56 | if (abs(pos_diff.real()) > abs(pos_diff.imag())) { |
| el17sm | 16:ddb203a74dfc | 57 | if (pos_diff.real() > 0) { |
| el17sm | 16:ddb203a74dfc | 58 | face = 1; |
| el17sm | 22:7abf4581bc9b | 59 | } else { |
| el17sm | 16:ddb203a74dfc | 60 | face = 3; |
| el17sm | 16:ddb203a74dfc | 61 | } |
| el17sm | 22:7abf4581bc9b | 62 | } else { |
| el17sm | 16:ddb203a74dfc | 63 | if (pos_diff.imag() > 0) { |
| el17sm | 16:ddb203a74dfc | 64 | face = 0; |
| el17sm | 22:7abf4581bc9b | 65 | } else { |
| el17sm | 16:ddb203a74dfc | 66 | face = 2; |
| el17sm | 16:ddb203a74dfc | 67 | } |
| el17sm | 16:ddb203a74dfc | 68 | } |
| el17sm | 16:ddb203a74dfc | 69 | } |
| el17sm | 22:7abf4581bc9b | 70 | |
| el17sm | 17:99e533f7f2fb | 71 | // Movement |
| el17sm | 22:7abf4581bc9b | 72 | if (face == 0) { |
| el17sm | 16:ddb203a74dfc | 73 | position.y += velocity; |
| el17sm | 18:3c030560e31d | 74 | update_hitbox(4, 7, 0, 0, 6, 12, 1, 6, 6); |
| el17sm | 22:7abf4581bc9b | 75 | } else if (face == 1) { |
| el17sm | 16:ddb203a74dfc | 76 | position.x += velocity; |
| el17sm | 18:3c030560e31d | 77 | update_hitbox(7, 4, 0, 0, 12, 7, 3, 4, 4); |
| el17sm | 22:7abf4581bc9b | 78 | } else if (face == 2) { |
| el17sm | 16:ddb203a74dfc | 79 | position.y -= velocity; |
| el17sm | 18:3c030560e31d | 80 | update_hitbox(4, 7, 0, 0, 6, 12, 1, 5, 6); |
| el17sm | 22:7abf4581bc9b | 81 | } else if (face == 3) { |
| el17sm | 16:ddb203a74dfc | 82 | position.x -= velocity; |
| el17sm | 18:3c030560e31d | 83 | update_hitbox(7, 4, 0, 0, 12, 7, 2, 4, 4); |
| el17sm | 16:ddb203a74dfc | 84 | } |
| el17sm | 22:7abf4581bc9b | 85 | |
| el17sm | 16:ddb203a74dfc | 86 | undo_move_x(matrix_collision_test(position.x, prev_pos.y, 0)); |
| el17sm | 16:ddb203a74dfc | 87 | undo_move_y(matrix_collision_test(prev_pos.x, position.y, 0)); |
| el17sm | 22:7abf4581bc9b | 88 | |
| el17sm | 22:7abf4581bc9b | 89 | frame.count++; |
| el17sm | 22:7abf4581bc9b | 90 | if (frame.count >= 5) { |
| el17sm | 16:ddb203a74dfc | 91 | frame.count = 0; |
| el17sm | 22:7abf4581bc9b | 92 | _velocity_index++; |
| el17sm | 22:7abf4581bc9b | 93 | frame.number++; |
| el17sm | 22:7abf4581bc9b | 94 | if (_velocity_index >= 6) { |
| el17sm | 17:99e533f7f2fb | 95 | _velocity_index = 0; |
| el17sm | 17:99e533f7f2fb | 96 | } |
| el17sm | 22:7abf4581bc9b | 97 | if (frame.number >= frame.max) { |
| el17sm | 17:99e533f7f2fb | 98 | frame.number = 0; |
| el17sm | 17:99e533f7f2fb | 99 | } |
| el17sm | 16:ddb203a74dfc | 100 | } |
| el17sm | 16:ddb203a74dfc | 101 | } |
| el17sm | 16:ddb203a74dfc | 102 | |
| el17sm | 22:7abf4581bc9b | 103 | int * Snake::get_frame() |
| el17sm | 22:7abf4581bc9b | 104 | { |
| el17sm | 17:99e533f7f2fb | 105 | if(face == 0) { |
| el17sm | 17:99e533f7f2fb | 106 | return (int *) sprite_snake_y[1][frame.number]; |
| el17sm | 22:7abf4581bc9b | 107 | } else if(face == 1) { |
| el17sm | 17:99e533f7f2fb | 108 | return (int *) sprite_snake_x[0][frame.number]; |
| el17sm | 22:7abf4581bc9b | 109 | } else if(face == 2) { |
| el17sm | 17:99e533f7f2fb | 110 | return (int *) sprite_snake_y[0][frame.number]; |
| el17sm | 22:7abf4581bc9b | 111 | } else if(face == 3) { |
| el17sm | 17:99e533f7f2fb | 112 | return (int *) sprite_snake_x[1][frame.number]; |
| el17sm | 17:99e533f7f2fb | 113 | } |
| el17sm | 17:99e533f7f2fb | 114 | return 0; |
| el17sm | 16:ddb203a74dfc | 115 | } |