bool entity_collides_with_level(const level& lvl, const entity& e, MOVE_DIRECTION dir, collision_info* info) { const solid_info* s = e.solid(); if(!s) { return false; } if(e.face_right() == false) { if(dir == MOVE_RIGHT) { dir = MOVE_LEFT; } else if(dir == MOVE_LEFT) { dir = MOVE_RIGHT; } } const frame& f = e.current_frame(); const rect& area = s->area(); if(e.face_right()) { rect solid_area(e.x() + area.x(), e.y() + area.y(), area.w(), area.h()); if(!lvl.may_be_solid_in_rect(solid_area)) { return false; } } else { rect solid_area(e.x() + f.width() - area.x() - area.w(), e.y() + area.y(), area.w(), area.h()); if(!lvl.may_be_solid_in_rect(solid_area)) { return false; } } foreach(const const_solid_map_ptr& m, s->solid()) { if(lvl.solid(e, m->dir(dir), info ? &info->surf_info : NULL)) { if(info) { info->read_surf_info(); } return true; } } return false; }
bool non_solid_entity_collides_with_level(const level& lvl, const entity& e) { const frame& f = e.current_frame(); if(!lvl.may_be_solid_in_rect(rect(e.x(), e.y(), f.width(), f.height()))) { return false; } for(int y = 0; y < f.height(); ++y) { for(int x = 0; x < f.width(); ++x) { if(!f.is_alpha(e.face_right() ? x : f.width() - x - 1, y, e.time_in_frame(), true)) { if(lvl.solid(e.x() + x, e.y() + y)) { return true; } } } } return false; }
bool non_solid_entity_collides_with_level(const level& lvl, const entity& e) { const frame& f = e.current_frame(); if(!lvl.may_be_solid_in_rect(rect(e.x(), e.y(), f.width(), f.height()))) { return false; } const int increment = e.face_right() ? 2 : -2; for(int y = 0; y < f.height(); y += 2) { std::vector<bool>::const_iterator i = f.get_alpha_itor(0, y, e.time_in_frame(), e.face_right()); for(int x = 0; x < f.width(); x += 2) { if(i == f.get_alpha_buf().end() || i == f.get_alpha_buf().begin()) { continue; } if(!*i && lvl.solid(e.x() + x, e.y() + y)) { return true; } i += increment; } } return false; }