Being *BeingManager::findNearestLivingBeing(int x, int y, int maxTileDist, Being::Type type) const { Being *closestBeing = 0; int dist = 0; const int maxDist = maxTileDist * 32; Beings::const_iterator itr = mBeings.begin(); Beings::const_iterator itr_end = mBeings.end(); for (; itr != itr_end; ++itr) { Being *being = (*itr); const Vector &pos = being->getPosition(); int d = abs(((int) pos.x) - x) + abs(((int) pos.y) - y); if ((being->getType() == type || type == Being::UNKNOWN) && (d < dist || !closestBeing) // it is closer && being->isAlive()) // no dead beings { dist = d; closestBeing = being; } } return (maxDist >= dist) ? closestBeing : 0; }
Being *BeingManager::findBeingByPixel(int x, int y) const { Beings::const_iterator itr = mBeings.begin(); Beings::const_iterator itr_end = mBeings.end(); for (; itr != itr_end; ++itr) { Being *being = (*itr); int xtol = being->getWidth() / 2; int uptol = being->getHeight(); if ((being->isAlive()) && (being != player_node) && (being->getPixelX() - xtol <= x) && (being->getPixelX() + xtol >= x) && (being->getPixelY() - uptol <= y) && (being->getPixelY() >= y)) { return being; } } return NULL; }
bool operator() (ActorSprite *actor) { if (actor->getType() == ActorSprite::FLOOR_ITEM) return false; Game *game = Game::instance(); if (!game) return false; Being* b = static_cast<Being*>(actor); uint16_t other_y = y + ((b->getType() == ActorSprite::NPC) ? 1 : 0); const Vector &pos = b->getPosition(); return ((int) pos.x / game->getCurrentTileWidth() == x && ((int) pos.y / game->getCurrentTileHeight() == y || (int) pos.y / game->getCurrentTileHeight() == other_y) && b->isAlive() && (type == ActorSprite::UNKNOWN || b->getType() == type)); }
void BeingManager::logic() { Beings::iterator i = mBeings.begin(); while (i != mBeings.end()) { Being *being = (*i); being->logic(); if (!being->isAlive() && Net::getGameHandler()->removeDeadBeings() && being->getCurrentFrame() >= 20) { delete being; i = mBeings.erase(i); } else { ++i; } } }