#include #include // Makes life easier for Windows users compiling this. #include // Pointers used throughout Gosu and this tutorial. #include // Read about them, they're moving into standard C++! :) #include // Could also use , just for int <-> string conversion #include #include #include #include enum ZOrder { zBackground, zStars, zPlayer, zUI }; typedef std::vector > Animation; class Star { Animation* animation; Gosu::Color color; double posX, posY; public: explicit Star(Animation& anim) { animation = &anim; color.setAlpha(255); double red = Gosu::random(40, 255); color.setRed(static_cast(red)); double green = Gosu::random(40, 255); color.setGreen(static_cast(green)); double blue = Gosu::random(40, 255); color.setBlue(static_cast(blue)); posX = Gosu::random(0, 640); posY = Gosu::random(0, 480); } double x() const { return posX; } double y() const { return posY; } void draw() const { Gosu::Image& image = *animation->at(Gosu::milliseconds() / 100 % animation->size()); image.draw(posX - image.width() / 2.0, posY - image.height() / 2.0, zStars, 1, 1, color, Gosu::amAdditive); } }; class Player { boost::scoped_ptr image; boost::scoped_ptr beep; double posX, posY, velX, velY, angle; unsigned score; public: Player(Gosu::Graphics& graphics, Gosu::Audio& audio) { std::wstring filename = Gosu::sharedResourcePrefix() + L"media/Starfighter.bmp"; image.reset(new Gosu::Image(graphics, filename)); filename = Gosu::sharedResourcePrefix() + L"media/Beep.wav"; beep.reset(new Gosu::Sample(audio, filename)); posX = posY = velX = velY = angle = 0; score = 0; } unsigned getScore() const { return score; } void warp(double x, double y) { posX = x; posY = y; } void turnLeft() { angle -= 4.5; } void turnRight() { angle += 4.5; } void accelerate() { velX += Gosu::offsetX(angle, 0.5); velY += Gosu::offsetY(angle, 0.5); } void move() { posX += velX; while (posX < 0) posX += 640; while (posX > 640) posX -= 640; posY += velY; while (posY < 0) posY += 480; while (posY > 480) posY -= 480; velX *= 0.95; velY *= 0.95; } void draw() const { image->drawRot(posX, posY, zPlayer, angle); } void collectStars(std::list& stars) { std::list::iterator cur = stars.begin(); while (cur != stars.end()) { if (Gosu::distance(posX, posY, cur->x(), cur->y()) < 35) { cur = stars.erase(cur); score += 10; beep->play(); } else ++cur; } } }; class GameWindow : public Gosu::Window { boost::scoped_ptr backgroundImage; Animation starAnim; Gosu::Font font; Player player; std::list stars; public: GameWindow() : Window(640, 480, false), font(graphics(), Gosu::defaultFontName(), 20), player(graphics(), audio()) { setCaption(L"Gosu Tutorial Game"); std::wstring filename = Gosu::sharedResourcePrefix() + L"media/Space.png"; backgroundImage.reset(new Gosu::Image(graphics(), filename, false)); filename = Gosu::sharedResourcePrefix() + L"media/Star.png"; Gosu::imagesFromTiledBitmap(graphics(), filename, 25, 25, false, starAnim); player.warp(320, 240); } void update() { if (input().down(Gosu::kbLeft) || input().down(Gosu::gpLeft)) player.turnLeft(); if (input().down(Gosu::kbRight) || input().down(Gosu::gpRight)) player.turnRight(); if (input().down(Gosu::kbUp) || input().down(Gosu::gpButton0)) player.accelerate(); player.move(); player.collectStars(stars); if (std::rand() % 25 == 0 && stars.size() < 25) stars.push_back(Star(starAnim)); } void draw() { player.draw(); backgroundImage->draw(0, 0, zBackground); for (std::list::const_iterator i = stars.begin(); i != stars.end(); ++i) { i->draw(); } font.draw(L"Score: " + boost::lexical_cast(player.getScore()), 10, 10, zUI, 1, 1, Gosu::Colors::yellow); } void buttonDown(Gosu::Button btn) { if (btn == Gosu::kbEscape) close(); } }; int main(int argc, char* argv[]) { GameWindow window; window.show(); }