A rouge-like rpg, heavily inspired on the binding of isaac. Running on a FRDM-K64F Mbed board. C++.

Dependencies:   mbed MotionSensor

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Headless.cpp Source File

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 }