A 2D tile-based sandbox game.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

Chunk.h 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #pragma once
  2. #include <string.h>
  3. #include <stdint.h>
  4. #include <memory>
  5. #include "common.h"
  6. #include "Tile.h"
  7. namespace Swan {
  8. class World;
  9. class Game;
  10. class Chunk {
  11. public:
  12. using RelPos = TilePos;
  13. ChunkPos pos_;
  14. Chunk(ChunkPos pos): pos_(pos) {
  15. data_.reset(new uint8_t[CHUNK_WIDTH * CHUNK_HEIGHT * sizeof(Tile::ID)]);
  16. visuals_.reset(new Visuals());
  17. visuals_->dirty_ = false;
  18. }
  19. Tile::ID *getTileData();
  20. Tile::ID getTileID(RelPos pos);
  21. void setTileID(RelPos pos, Tile::ID id);
  22. void drawBlock(RelPos pos, const Tile &t);
  23. void compress();
  24. void decompress();
  25. void render(const Context &ctx);
  26. void draw(const Context &ctx, Win &win);
  27. void tick(float dt);
  28. bool keepActive(); // Returns true if chunk was inactive
  29. bool isActive() { return deactivate_timer_ > 0; }
  30. private:
  31. static constexpr float DEACTIVATE_INTERVAL = 20;
  32. static uint8_t *renderbuf;
  33. bool isCompressed() { return compressed_size_ != -1; }
  34. std::unique_ptr<uint8_t[]> data_;
  35. ssize_t compressed_size_ = -1; // -1 if not compressed, a positive number if compressed
  36. bool need_render_ = false;
  37. float deactivate_timer_ = DEACTIVATE_INTERVAL;
  38. struct Visuals {
  39. std::unique_ptr<SDL_Texture, void (*)(SDL_Texture *)> texture_{nullptr, SDL_DestroyTexture};
  40. bool dirty_;
  41. };
  42. std::unique_ptr<Visuals> visuals_;
  43. };
  44. }