A rouge-like rpg, heavily inspired on the binding of isaac. Running on a FRDM-K64F Mbed board. C++.
Dependencies: mbed MotionSensor
Headless.cpp
00001 #include "Headless.h" 00002 #include "math.h" 00003 #include <complex> 00004 00005 Headless::Headless(float pos_x, float pos_y) 00006 { 00007 _hp = 4; 00008 _attack = 1; 00009 _face = 0; 00010 _hp_drop_chance = 10; // out of 100 00011 00012 _hitbox.width = 6; 00013 _hitbox.height = 5; 00014 00015 _position.x = pos_x; 00016 _position.y = pos_y; 00017 00018 _sprite_size.width = 6; 00019 _sprite_size.height = 9; 00020 _sprite_size.offset_x = 0; 00021 _sprite_size.offset_y = -4; 00022 00023 _frame.count = 0; 00024 _frame.number = 0; 00025 _frame.max = 4; 00026 00027 _velocity = 0.25; 00028 } 00029 00030 void Headless::move(float player_x, float player_y, char * map, bool * doorways) 00031 { 00032 std::complex<double> pos_diff(player_x - _position.x, player_y - _position.y); // Defining difference in position as a vector for simplicity (magnitude is hard to calculate) 00033 _position.x += _velocity * pos_diff.real() / std::abs(pos_diff); 00034 _position.y += _velocity * pos_diff.imag() / std::abs(pos_diff); 00035 // Setting face 00036 if (abs(pos_diff.real()) > abs(pos_diff.imag())) { 00037 if (pos_diff.real() > 0) { _face = 1; 00038 } else { _face = 3; 00039 } 00040 } else { 00041 if (pos_diff.imag() > 0) { _face = 2; 00042 } else { _face = 0; 00043 } 00044 } 00045 // Wall Collision 00046 undo_move_x(entity_to_map_collision_test(_position.x, _prev_pos.y, map, doorways)); 00047 undo_move_y(entity_to_map_collision_test(_prev_pos.x, _position.y, map, doorways)); 00048 // Animation 00049 increment_frame(); 00050 } 00051 00052 void Headless::increment_frame() 00053 { 00054 if (_frame.number < _frame.max) { 00055 _frame.count++; 00056 } else { 00057 _frame.count = 0; 00058 } 00059 _frame.number = (_frame.count/16) % _frame.max; // Frame number is used in chosing sprite-frame for animation; the constant 16 is the number of frames per sprite-frame 00060 } 00061 00062 void Headless::draw(N5110 &lcd) 00063 { 00064 lcd.drawSpriteTransparent(_position.x+_sprite_size.offset_x, 00065 _position.y+_sprite_size.offset_y, 00066 _sprite_size.height, 00067 _sprite_size.width, 00068 get_frame()); 00069 } 00070 00071 void Headless::take_damage(int damage) 00072 { 00073 _hp -= damage; 00074 } 00075 00076 char * Headless::get_frame() // Returns the corresponding frame 00077 { 00078 return (char *) sprite_headless[_face][_frame.number]; 00079 }
Generated on Tue Jul 19 2022 23:32:07 by 1.7.2