// Draw the asteroids, centered on the given location. void AsteroidField::Draw(DrawList &draw, const Point ¢er, double zoom) const { for(const Asteroid &asteroid : asteroids) asteroid.Draw(draw, center, zoom); for(const shared_ptr<Minable> &minable : minables) draw.Add(*minable); }
void AsteroidField::Asteroid::Draw(DrawList &draw, const Point ¢er, const Point ¢erVelocity) const { Point pos = location - center; pos = Point(remainder(pos.X(), WRAP), remainder(pos.Y(), WRAP)); draw.Add(animation, pos, angle.Unit() * .5, velocity - centerVelocity); }
// Draw any instances of this asteroid that are on screen. void AsteroidField::Asteroid::Draw(DrawList &draw, const Point ¢er, double zoom) const { // Any object within this range must be drawn. Point topLeft = center + (Screen::TopLeft() - size) / zoom; Point bottomRight = center + (Screen::BottomRight() + size) / zoom; // Figure out the position of the first instance of this asteroid that is to // the right of and below the top left corner of the screen. double startX = fmod(position.X() - topLeft.X(), WRAP); startX += topLeft.X() + WRAP * (startX < 0.); double startY = fmod(position.Y() - topLeft.Y(), WRAP); startY += topLeft.Y() + WRAP * (startY < 0.); // Draw any instances of this asteroid that are on screen. for(double y = startY; y < bottomRight.Y(); y += WRAP) for(double x = startX; x < bottomRight.X(); x += WRAP) draw.Add(*this, Point(x, y)); }