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.

cygnet-test.cc 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include <cygnet/Context.h>
  2. #include <cygnet/Window.h>
  3. #include <cygnet/Renderer.h>
  4. #include <cygnet/ResourceManager.h>
  5. #include <swan-common/constants.h>
  6. #include <time.h>
  7. #include <stdint.h>
  8. #include <iostream>
  9. #include <SDL_image.h>
  10. #include <SDL.h>
  11. double getTime() {
  12. struct timespec tv;
  13. clock_gettime(CLOCK_MONOTONIC, &tv);
  14. return tv.tv_sec + tv.tv_nsec / 1000000000.0;
  15. }
  16. void addTile(Cygnet::ResourceBuilder &builder, const char *path) {
  17. static size_t id = 0;
  18. SDL_Surface *surf = IMG_Load(path);
  19. builder.addTile(id++, surf->pixels);
  20. SDL_FreeSurface(surf);
  21. }
  22. Cygnet::RenderSprite loadSprite(Cygnet::ResourceBuilder &builder, const char *path, int fh) {
  23. SDL_Surface *surf = IMG_Load(path);
  24. auto sprite = builder.addSprite(path, surf->pixels, surf->w, surf->h, fh);
  25. SDL_FreeSurface(surf);
  26. return sprite;
  27. }
  28. Cygnet::RenderSprite loadSprite(Cygnet::ResourceBuilder &builder, const char *path) {
  29. SDL_Surface *surf = IMG_Load(path);
  30. auto sprite = builder.addSprite(path, surf->pixels, surf->w, surf->h);
  31. SDL_FreeSurface(surf);
  32. return sprite;
  33. }
  34. int main() {
  35. Cygnet::Context ctx;
  36. IMG_Init(IMG_INIT_PNG);
  37. Cygnet::Window win("Cygnet Test", 680, 680);
  38. Cygnet::Renderer rnd;
  39. Cygnet::ResourceBuilder rbuilder(rnd);
  40. for (auto path: {
  41. "core.mod/assets/tile/dirt.png",
  42. "core.mod/assets/tile/grass.png",
  43. "core.mod/assets/tile/leaves.png",
  44. "core.mod/assets/tile/stone.png",
  45. "core.mod/assets/tile/torch.png",
  46. "core.mod/assets/tile/tree-trunk.png",
  47. }) addTile(rbuilder, path);
  48. unsigned char lolTexture[32*32*4*3];
  49. for (size_t i = 0; i < 3; ++i) {
  50. int col = 100 * i + 50;;
  51. for (size_t y = 0; y < 32; ++y) {
  52. for (size_t x = 0; x < 32; ++x) {
  53. lolTexture[i * 32 * 32 * 4 + y * 32 * 4 + x * 4 + 0] = col;
  54. lolTexture[i * 32 * 32 * 4 + y * 32 * 4 + x * 4 + 1] = col;
  55. lolTexture[i * 32 * 32 * 4 + y * 32 * 4 + x * 4 + 2] = col;
  56. lolTexture[i * 32 * 32 * 4 + y * 32 * 4 + x * 4 + 3] = 255;
  57. }
  58. }
  59. }
  60. rbuilder.addTile(10, lolTexture, 3);
  61. Cygnet::RenderSprite playerSprite = loadSprite(
  62. rbuilder, "core.mod/assets/entity/player-still.png", 64);
  63. Cygnet::ResourceManager resources(std::move(rbuilder));
  64. Cygnet::RenderChunk chunk;
  65. {
  66. uint16_t tiles[SwanCommon::CHUNK_WIDTH * SwanCommon::CHUNK_HEIGHT];
  67. memset(tiles, 0, sizeof(tiles));
  68. tiles[0] = 1;
  69. tiles[1] = 2;
  70. tiles[2] = 3;
  71. tiles[10] = 10;
  72. chunk = rnd.createChunk(tiles);
  73. }
  74. Cygnet::RenderCamera cam = {
  75. .pos = { 0, 0 },
  76. .size = win.size(),
  77. .zoom = 1,
  78. };
  79. float lol = 0;
  80. bool keys[512] = { 0 };
  81. double tileAnimAcc = 0;
  82. double fpsAcc = 0;
  83. double prevTime = getTime() - 1/60.0;
  84. int frames = 0;
  85. float x = 0, y = 0;
  86. while (true) {
  87. double currTime = getTime();
  88. double dt = currTime - prevTime;
  89. prevTime = currTime;
  90. lol += dt;
  91. fpsAcc += dt;
  92. frames += 1;
  93. if (fpsAcc >= 2) {
  94. std::cerr << "FPS: " << (frames / 2.0) << '\n';
  95. fpsAcc -= 2;
  96. frames = 0;
  97. }
  98. tileAnimAcc += dt;
  99. if (tileAnimAcc >= 0.5) {
  100. resources.tick();
  101. tileAnimAcc -= 0.5;
  102. }
  103. SDL_Event evt;
  104. while (SDL_PollEvent(&evt)) {
  105. switch (evt.type) {
  106. case SDL_QUIT:
  107. goto exit;
  108. case SDL_WINDOWEVENT:
  109. switch (evt.window.event) {
  110. case SDL_WINDOWEVENT_SIZE_CHANGED:
  111. win.onResize(evt.window.data1, evt.window.data2);
  112. cam.size = win.size();
  113. break;
  114. }
  115. break;
  116. case SDL_MOUSEWHEEL:
  117. cam.zoom += evt.wheel.y * 0.1 * cam.zoom;
  118. break;
  119. case SDL_KEYDOWN:
  120. keys[evt.key.keysym.scancode] = true;
  121. break;
  122. case SDL_KEYUP:
  123. keys[evt.key.keysym.scancode] = false;
  124. break;
  125. }
  126. }
  127. if (keys[SDL_SCANCODE_A]) {
  128. x -= 1 * dt;
  129. }
  130. if (keys[SDL_SCANCODE_D]) {
  131. x += 1 * dt;
  132. }
  133. if (keys[SDL_SCANCODE_W]) {
  134. y -= 1 * dt;
  135. }
  136. if (keys[SDL_SCANCODE_S]) {
  137. y += 1 * dt;
  138. }
  139. rnd.drawChunk(chunk, { 0, 0 });
  140. rnd.drawSprite(playerSprite, { x, y }, (int)lol % 2);
  141. cam.pos = { x, y };
  142. win.clear();
  143. rnd.draw(cam);
  144. win.flip();
  145. }
  146. exit:
  147. IMG_Quit();
  148. }