Graphics.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "Graphics.h"
  2. #include "sfwindow.h"
  3. #include <SFML/Graphics.hpp>
  4. #include "utility/misc.h"
  5. using namespace WalrusRPG;
  6. using WalrusRPG::Graphics::Texture;
  7. using WalrusRPG::Graphics::Pixel;
  8. using WalrusRPG::Utils::Rect;
  9. sf::RenderWindow window;
  10. sf::View view;
  11. sf::RenderTexture buffer;
  12. void Graphics::init()
  13. {
  14. // window.create(sf::VideoMode::getDesktopMode(), "WalrusRPG", sf::Style::Fullscreen);
  15. window.create(sf::VideoMode(640, 480), "WalrusRPG");
  16. window.setFramerateLimit(60);
  17. view = sf::View(window.getDefaultView());
  18. buffer.create(320, 240);
  19. }
  20. void Graphics::deinit()
  21. {
  22. window.close();
  23. }
  24. void Graphics::frame_begin()
  25. {
  26. window.clear(sf::Color::Black);
  27. }
  28. void Graphics::frame_end()
  29. {
  30. sf::Sprite sprite(buffer.getTexture());
  31. sf::Vector2u winsize = window.getSize();
  32. sf::Event event;
  33. float scale = min(winsize.x / 320.f, winsize.y / 240.f);
  34. while (window.pollEvent(event))
  35. {
  36. }
  37. window.setView(view = sf::View(sf::FloatRect(0, 0, winsize.x, winsize.y)));
  38. buffer.display();
  39. window.clear();
  40. sprite.setScale(scale, scale);
  41. sprite.setPosition((winsize.x - 320.f * scale) / 2, (winsize.y - 240.f * scale) / 2);
  42. window.draw(sprite);
  43. window.display();
  44. }
  45. void Graphics::put_sprite(const WalrusRPG::Graphics::Texture &sheet, int x, int y,
  46. const Rect &window)
  47. {
  48. sf::Sprite sprite;
  49. sprite.setTexture(sheet.data);
  50. sprite.setTextureRect(sf::IntRect(window.x, window.y, window.width, window.height));
  51. sprite.setPosition(x, y);
  52. buffer.draw(sprite);
  53. }
  54. void Graphics::put_sprite_tint(const WalrusRPG::Graphics::Texture &sheet, int x, int y,
  55. const Rect &window,
  56. const Pixel &color)
  57. {
  58. sf::Sprite sprite;
  59. sprite.setTexture(sheet.data);
  60. sprite.setTextureRect(sf::IntRect(window.x, window.y, window.width, window.height));
  61. sprite.setPosition(x, y);
  62. sprite.setColor(sf::Color(color.r << 3, color.g << 2, color.b << 3, 255));
  63. buffer.draw(sprite);
  64. }
  65. void Graphics::fill(const Pixel &color)
  66. {
  67. buffer.clear(sf::Color(color.r << 3, color.g << 2, color.b << 2, 255));
  68. }
  69. void Graphics::put_pixel(uint16_t x, uint16_t y, const Pixel &color)
  70. {
  71. sf::RectangleShape pixel;
  72. pixel.setSize(sf::Vector2f(1, 1));
  73. pixel.setFillColor(sf::Color(color.r << 3, color.g << 2, color.b << 3));
  74. pixel.setPosition(x, y);
  75. buffer.draw(pixel);
  76. }
  77. void Graphics::put_horizontal_line(uint16_t x, uint16_t x2, uint16_t y, const Pixel &color)
  78. {
  79. put_line(x, y, x2, y, color);
  80. }
  81. void Graphics::put_vertical_line(uint16_t x, uint16_t y, uint16_t y2, const Pixel &color)
  82. {
  83. put_line(x, y, x, y2, color);
  84. }
  85. void Graphics::put_line(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2, const Pixel& color)
  86. {
  87. sf::Color lineColor(color.r<<3, color.g<<2, color.b<<3);
  88. sf::Vertex line[] =
  89. {
  90. sf::Vertex(sf::Vector2f(x, y), lineColor),
  91. sf::Vertex(sf::Vector2f(x2, y2), lineColor)
  92. };
  93. buffer.draw(line, 2, sf::Lines);
  94. }
  95. void Graphics::put_rectangle(const Rect &rect, const Pixel& color)
  96. {
  97. sf::RectangleShape rectangle;
  98. rectangle.setSize(sf::Vector2f(rect.width, rect.height));
  99. rectangle.setFillColor(sf::Color(color.r<<3, color.g<<2, color.b<<3));
  100. rectangle.setPosition(rect.x, rect.y);
  101. buffer.draw(rectangle);
  102. }