Collider.hpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #pragma once
  2. #include <fstream>
  3. #include <nlohmann/json.hpp>
  4. #include "Log.hpp"
  5. #include "IEntity.hpp"
  6. #define CW 20
  7. #define CH 12
  8. using json = nlohmann::json;
  9. class Collider {
  10. public:
  11. Collider(std::string filename) {
  12. std::ifstream ifs(filename);
  13. json j;
  14. ifs >> j;
  15. auto layer = j["layers"][6];
  16. auto layerT1 = j["layers"][4];
  17. m_data.resize(layer["width"]);
  18. for (std::size_t i = 0; i < layer["width"]; ++i) {
  19. m_data[i].resize(layer["height"]);
  20. for (std::size_t j = 0; j < layer["height"]; ++j) {
  21. setBlock(i, j, 0);
  22. }
  23. }
  24. for (std::size_t i = 0; i < layer["data"].size(); ++i) {
  25. int tile = layer["data"][i];
  26. size_t x = i % layer["width"];
  27. size_t y = i / layer["width"];
  28. if (tile == 16) {
  29. setBlock(x, y, 2);
  30. }
  31. }
  32. for (std::size_t i = 0; i < layerT1["data"].size(); ++i) {
  33. int tile = layerT1["data"][i];
  34. size_t x = i % layerT1["width"];
  35. size_t y = i / layerT1["width"];
  36. if (tile == 49 || tile == 50) {
  37. setBlock(x, y, 1);
  38. }
  39. }
  40. }
  41. static bool isWithin(sf::IntRect r, sf::Vector2f pos) {
  42. return (pos.x >= r.left * 32.f && pos.x <= r.width * 32.f && pos.y >= r.top * 32.f && pos.y <= r.height * 32.f);
  43. }
  44. int check(sf::Vector2f pos, float dx, float dy) {
  45. float box_x = 5.f;
  46. float box_y = 4.f;
  47. //return getBlock(pos.x / 32.f, pos.y / 32.f);
  48. if (dx < 0.f) {
  49. return getBlock((pos.x - box_x + dx) / 32.f, pos.y / 32.f);
  50. }
  51. else if (dx > 0.f) {
  52. return getBlock((pos.x + box_x + dx) / 32.f, pos.y / 32.f);
  53. }
  54. else if (dy < 0.f) {
  55. return getBlock(pos.x / 32.f, (pos.y - box_y + dy) / 32.f);
  56. }
  57. else {
  58. return getBlock(pos.x / 32.f, (pos.y + box_y + 3.f + dy) / 32.f);
  59. }
  60. }
  61. int getBlock(int x, int y) {
  62. return m_data[x][y];
  63. }
  64. void setBlock(int x, int y, int type) {
  65. m_data[x][y] = type;
  66. }
  67. private:
  68. int getTile(int x, int y) {
  69. if(x < 0 || y < 0 || x >= CW || y >= CH) {
  70. return -1;
  71. }
  72. return x + CW * y;
  73. }
  74. std::vector<std::vector<short>> m_data;
  75. float m_localX;
  76. };