BGSpriteComponent.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // ----------------------------------------------------------------
  2. // From Game Programming in C++ by Sanjay Madhav
  3. // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
  4. //
  5. // Released under the BSD License
  6. // See LICENSE in root directory for full details.
  7. // ----------------------------------------------------------------
  8. #include "BGSpriteComponent.h"
  9. #include "Actor.h"
  10. BGSpriteComponent::BGSpriteComponent(class Actor* owner, int drawOrder)
  11. :SpriteComponent(owner, drawOrder)
  12. ,mScrollSpeed(0.0f)
  13. {
  14. }
  15. void BGSpriteComponent::Update(float deltaTime)
  16. {
  17. SpriteComponent::Update(deltaTime);
  18. for (auto& bg : mBGTextures)
  19. {
  20. // Update the x offset
  21. bg.mOffset.x += mScrollSpeed * deltaTime;
  22. // If this is completely off the screen, reset offset to
  23. // the right of the last bg texture
  24. if (bg.mOffset.x < -mScreenSize.x)
  25. {
  26. bg.mOffset.x = (mBGTextures.size() - 1) * mScreenSize.x - 1;
  27. }
  28. }
  29. }
  30. void BGSpriteComponent::Draw(SDL_Renderer* renderer)
  31. {
  32. // Draw each background texture
  33. for (auto& bg : mBGTextures)
  34. {
  35. SDL_Rect r;
  36. // Assume screen size dimensions
  37. r.w = static_cast<int>(mScreenSize.x);
  38. r.h = static_cast<int>(mScreenSize.y);
  39. // Center the rectangle around the position of the owner
  40. r.x = static_cast<int>(mOwner->GetPosition().x - r.w / 2 + bg.mOffset.x);
  41. r.y = static_cast<int>(mOwner->GetPosition().y - r.h / 2 + bg.mOffset.y);
  42. // Draw this background
  43. SDL_RenderCopy(renderer,
  44. bg.mTexture,
  45. nullptr,
  46. &r
  47. );
  48. }
  49. }
  50. void BGSpriteComponent::SetBGTextures(const std::vector<SDL_Texture*>& textures)
  51. {
  52. int count = 0;
  53. for (auto tex : textures)
  54. {
  55. BGTexture temp;
  56. temp.mTexture = tex;
  57. // Each texture is screen width in offset
  58. temp.mOffset.x = count * mScreenSize.x;
  59. temp.mOffset.y = 0;
  60. mBGTextures.emplace_back(temp);
  61. count++;
  62. }
  63. }