A 2D tile-based sandbox game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Win.h 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #pragma once
  2. #include "log.h"
  3. #include "common.h"
  4. #include <SDL2/SDL.h>
  5. #include <optional>
  6. namespace Swan {
  7. class Win {
  8. public:
  9. Win(SDL_Window *window, SDL_Renderer *renderer): window_(window), renderer_(renderer) {
  10. if (SDL_GetRendererInfo(renderer_, &rinfo_) < 0) {
  11. panic << "GetRenedrerInfo failed: " << SDL_GetError();
  12. abort();
  13. }
  14. info << "Using renderer: " << rinfo_.name;
  15. }
  16. Vec2 getSize() {
  17. int w, h;
  18. SDL_GetWindowSize(window_, &w, &h);
  19. return Vec2(((float)w / scale_) / TILE_SIZE, ((float)h / scale_) / TILE_SIZE);
  20. }
  21. SDL_Rect createDestRect(Vec2 pos, Vec2 pixsize) {
  22. return SDL_Rect{
  23. (int)((pos.x - cam_.x) * TILE_SIZE * scale_),
  24. (int)((pos.y - cam_.y) * TILE_SIZE * scale_),
  25. (int)(pixsize.x * scale_), (int)(pixsize.y * scale_),
  26. };
  27. }
  28. struct ShowTextureArgs {
  29. SDL_RendererFlip flip = SDL_FLIP_NONE;
  30. double hscale = 1;
  31. double vscale = 1;
  32. double angle = 0;
  33. std::optional<SDL_Point> center = std::nullopt;
  34. };
  35. void showTexture(
  36. const Vec2 &pos, SDL_Texture *tex, SDL_Rect *srcrect,
  37. ShowTextureArgs args) {
  38. SDL_Point *center = args.center ? &*args.center : nullptr;
  39. SDL_Rect destrect = createDestRect(pos, Vec2(srcrect->w * args.hscale, srcrect->h * args.hscale));
  40. if (SDL_RenderCopyEx(renderer_, tex, srcrect, &destrect, args.angle, center, args.flip) < 0)
  41. warn << "RenderCopyEx failed: " << SDL_GetError();
  42. }
  43. // We want an overload which uses RenderCopy instead of RenderCopyEx,
  44. // because RenderCopy might be faster
  45. void showTexture(const Vec2 &pos, SDL_Texture *tex, SDL_Rect *srcrect) {
  46. SDL_Rect destrect = createDestRect(pos, Vec2(srcrect->w, srcrect->h));
  47. if (SDL_RenderCopy(renderer_, tex, srcrect, &destrect) < 0)
  48. warn << "RenderCopy failed: " << SDL_GetError();
  49. }
  50. void drawRect(const Vec2 &pos, const Vec2 &size) {
  51. SDL_Rect destrect = createDestRect(pos, size * TILE_SIZE);
  52. if (SDL_RenderDrawRect(renderer_, &destrect) < 0)
  53. warn << "RenderDrawRect failed: " << SDL_GetError();
  54. }
  55. float scale_ = 2;
  56. Vec2 cam_;
  57. SDL_Window *window_;
  58. SDL_Renderer *renderer_;
  59. SDL_RendererInfo rinfo_;
  60. };
  61. }