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.

Game.h 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #pragma once
  2. #include <bitset>
  3. #include <map>
  4. #include <string>
  5. #include <optional>
  6. #include <SDL.h>
  7. #include "common.h"
  8. #include "Resource.h"
  9. #include "Mod.h"
  10. #include "World.h"
  11. namespace Swan {
  12. class Game {
  13. public:
  14. Game(Win &win):
  15. win_(win),
  16. mousePos_(0, 0) {}
  17. std::optional<ModWrapper> loadMod(std::string path, World &world);
  18. void createWorld(const std::string &worldgen, const std::vector<std::string> &mods);
  19. void onKeyDown(SDL_Keysym sym) {
  20. pressedKeys_[sym.scancode] = true;
  21. didPressKeys_[sym.scancode] = true;
  22. }
  23. void onKeyUp(SDL_Keysym sym) {
  24. pressedKeys_[sym.scancode] = false;
  25. didReleaseKeys_[sym.scancode] = true;
  26. }
  27. void onMouseMove(Sint32 x, Sint32 y) {
  28. mousePos_ = { x, y };
  29. }
  30. void onMouseDown(Sint32 x, Sint32 y, Uint8 button) {
  31. mousePos_ = { x, y };
  32. pressedButtons_[button] = true;
  33. didPressButtons_[button] = true;
  34. }
  35. void onMouseUp(Sint32 x, Sint32 y, Uint8 button) {
  36. mousePos_ = { x, y };
  37. pressedButtons_[button] = false;
  38. didReleaseButtons_[button] = true;
  39. }
  40. void onScrollWheel(Sint32 y) {
  41. didScroll_ = (y > 0 ? 1 : -1 );
  42. }
  43. bool isKeyPressed(SDL_Scancode code) { return pressedKeys_[code]; }
  44. bool wasKeyPressed(SDL_Scancode code) { return didPressKeys_[code]; }
  45. bool wasKeyReleased(SDL_Scancode code) { return didReleaseKeys_[code]; }
  46. Vec2i getMousePos() { return mousePos_; }
  47. bool isMousePressed(Uint8 button) { return pressedButtons_[button]; }
  48. bool wasMousePressed(Uint8 button) { return didPressButtons_[button]; }
  49. bool wasMouseReleased(Uint8 button) { return didReleaseButtons_[button]; }
  50. int wasWheelScrolled() { return didScroll_; }
  51. TilePos getMouseTile();
  52. SDL_Color backgroundColor();
  53. void draw();
  54. void update(float dt);
  55. void tick(float dt);
  56. std::unique_ptr<World> world_ = NULL;
  57. std::unique_ptr<ImageResource> invalidImage_ = NULL;
  58. std::unique_ptr<Tile> invalidTile_ = NULL;
  59. std::unique_ptr<Item> invalidItem_ = NULL;
  60. Win &win_;
  61. private:
  62. std::bitset<SDL_NUM_SCANCODES> pressedKeys_;
  63. std::bitset<SDL_NUM_SCANCODES> didPressKeys_;
  64. std::bitset<SDL_NUM_SCANCODES> didReleaseKeys_;
  65. Vec2i mousePos_;
  66. std::bitset<SDL_BUTTON_X2> pressedButtons_;
  67. std::bitset<SDL_BUTTON_X2> didPressButtons_;
  68. std::bitset<SDL_BUTTON_X2> didReleaseButtons_;
  69. int didScroll_ = 0;
  70. };
  71. }