#include #include #include "game.h" #include "entity.h" #include "texture.h" #include "graphics.h" #include using namespace std; Entity *Entity::list[MAX_ENTITIES]; double Entity::t = 0; int Entity::count; Entity::Entity(){ if(Entity::count < MAX_ENTITIES){ Entity::list[Entity::count] = this; Entity::count++; } else for(int i = 0; i < MAX_ENTITIES; i++) if(Entity::list[i] == NULL) Entity::list[i] = this; } void Entity::physics_all(){ for(int i = 0; i < count; i++) if(list[i] == NULL) continue; else list[i]->physics(); } void Entity::spawn(double sx, double sy, bool gravity){ x = sx; y = sy; ax = 0; ay = 0; if(gravity) ay = GRAVITY; physics_reset_x(); physics_reset_y(); Game::log((string)"Spawning entity '" + name + "' at (" + to_string(x) + ", " + to_string(y) + ")", INFO); } bool Entity::physics_check_x(){ if(x < 0) return false; if(x + width > MAPWIDTH) return false; return physics_check_both(); } bool Entity::physics_check_y(){ if(y < 0) return false; if(y + height > MAPHEIGHT) return false; return physics_check_both(); } bool Entity::physics_check_both(){ for(int ix = floor(x); ix <= ceil(x + width - 0.01) - 1; ix++) for(int iy = floor(y); iy <= ceil(y + height - 0.01) - 1; iy++) if(Game::map->getNode(ix, iy)->stable) return false; return true; } void Entity::physics_reset_x(){ vx = 0; tx0 = Entity::t; x0 = x; x = (double)(round(x * 10)) / 10; } void Entity::physics_reset_y(){ vy = 0; ty0 = Entity::t; y0 = y; y = (double)(round(y * 10)) / 10; } void Entity::physics(){ double old_x = x; double dtx = Entity::t - tx0; if(ax) x = ax * dtx * dtx / 2 + vx * dtx + x0; else if(vx) x = vx * dtx + x0; if(!physics_check_x()) { x = old_x; physics_reset_x(); } double old_y = y; double dty = Entity::t - ty0; if(ay) y = ay * dty * dty / 2 + vy * dty + y0; else if(vy) y = vy * dty + y0; if(!physics_check_y()) { y = old_y; physics_reset_y(); } }