Render.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * 2D Game Engine
  3. * Render.h:
  4. * Based on pikuma.com 2D game engine in C++ and Lua course
  5. * Copyright (c) 2021 986-Studio. All rights reserved.
  6. *
  7. * Created by Manoël Trapier on 12/02/2021.
  8. */
  9. #ifndef GAMEENGINE_RENDER_H
  10. #define GAMEENGINE_RENDER_H
  11. #include <SDL.h>
  12. #include <AssetStore.h>
  13. #include <ECS.h>
  14. #include <Components/Transform.h>
  15. #include <Components/Sprite.h>
  16. class RenderSystem: public System
  17. {
  18. public:
  19. RenderSystem()
  20. {
  21. this->requireComponent<TransformComponent>();
  22. this->requireComponent<SpriteComponent>();
  23. }
  24. void update(SDL_Renderer *renderer, std::unique_ptr<AssetStore> &assetStore, SDL_Rect &camera)
  25. {
  26. struct RenderableEntity
  27. {
  28. TransformComponent transformComponent;
  29. SpriteComponent spriteComponent;
  30. };
  31. std::vector<RenderableEntity> renderableEntities;
  32. for(auto entity: this->getSystemEntities())
  33. {
  34. RenderableEntity renderableEntity;
  35. renderableEntity.spriteComponent = entity.getComponent<SpriteComponent>();
  36. renderableEntity.transformComponent = entity.getComponent<TransformComponent>();
  37. renderableEntities.emplace_back(renderableEntity);
  38. }
  39. std::sort(renderableEntities.begin(), renderableEntities.end(), [](const RenderableEntity &a, const RenderableEntity &b)
  40. {
  41. return a.spriteComponent.zIndex < b.spriteComponent.zIndex;
  42. });
  43. for(auto entity: renderableEntities)
  44. {
  45. const auto transform = entity.transformComponent;
  46. const auto sprite = entity.spriteComponent;
  47. SDL_Texture *texture = assetStore->getTexture(sprite.assetId);
  48. SDL_Rect destRect =
  49. {
  50. static_cast<int>(transform.position.x - (sprite.isFixed?0.:camera.x)),
  51. static_cast<int>(transform.position.y - (sprite.isFixed?0.:camera.y)),
  52. static_cast<int>(sprite.width * transform.scale.x),
  53. static_cast<int>(sprite.height * transform.scale.y)
  54. };
  55. SDL_RenderCopyEx(renderer, texture, &sprite.sourceRect, &destRect,
  56. transform.rotation, NULL, SDL_FLIP_NONE);
  57. }
  58. }
  59. };
  60. #endif /* GAMEENGINE_RENDER_H */