A 2D tile-based sandbox game.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include <cygnet/Context.h>
  2. #include <cygnet/Window.h>
  3. #include <cygnet/Renderer.h>
  4. #include <swan-common/constants.h>
  5. #include <time.h>
  6. #include <stdint.h>
  7. #include <iostream>
  8. #include <SDL_image.h>
  9. #include <SDL.h>
  10. double getTime() {
  11. struct timespec tv;
  12. clock_gettime(CLOCK_MONOTONIC, &tv);
  13. return tv.tv_sec + tv.tv_nsec / 1000000000.0;
  14. }
  15. void addTile(Cygnet::Renderer &rnd, const char *path) {
  16. static size_t id = 0;
  17. SDL_Surface *surf = IMG_Load(path);
  18. rnd.registerTileTexture(id++, surf->pixels, surf->pitch * surf->h);
  19. SDL_FreeSurface(surf);
  20. }
  21. int main() {
  22. Cygnet::Context ctx;
  23. IMG_Init(IMG_INIT_PNG);
  24. Cygnet::Window win("Cygnet Test", 680, 680);
  25. Cygnet::Renderer rnd;
  26. for (auto path: {
  27. "core.mod/assets/tile/dirt.png",
  28. "core.mod/assets/tile/grass.png",
  29. "core.mod/assets/tile/leaves.png",
  30. "core.mod/assets/tile/stone.png",
  31. "core.mod/assets/tile/torch.png",
  32. "core.mod/assets/tile/tree-trunk.png",
  33. }) addTile(rnd, path);
  34. rnd.uploadTileTexture();
  35. Cygnet::RenderChunk chunk;
  36. {
  37. uint16_t tiles[SwanCommon::CHUNK_WIDTH * SwanCommon::CHUNK_HEIGHT];
  38. memset(tiles, 0, sizeof(tiles));
  39. tiles[0] = 1;
  40. tiles[1] = 2;
  41. tiles[2] = 3;
  42. chunk = rnd.createChunk(tiles);
  43. }
  44. Cygnet::RenderCamera cam = {
  45. .pos = { 0, 0 },
  46. .zoom = 1,
  47. };
  48. float lol = 0;
  49. bool keys[512] = { 0 };
  50. double acc = 0;
  51. double prevTime = getTime() - 1/60.0;
  52. int frames = 0;
  53. while (true) {
  54. double currTime = getTime();
  55. double dt = currTime - prevTime;
  56. prevTime = currTime;
  57. acc += dt;
  58. frames += 1;
  59. if (acc >= 2) {
  60. std::cerr << "FPS: " << (frames / 2.0) << '\n';
  61. acc -= 2;
  62. frames = 0;
  63. }
  64. SDL_Event evt;
  65. while (SDL_PollEvent(&evt)) {
  66. switch (evt.type) {
  67. case SDL_QUIT:
  68. goto exit;
  69. case SDL_WINDOWEVENT:
  70. switch (evt.window.event) {
  71. case SDL_WINDOWEVENT_SIZE_CHANGED:
  72. win.onResize(evt.window.data1, evt.window.data2);
  73. break;
  74. }
  75. break;
  76. case SDL_MOUSEWHEEL:
  77. cam.zoom += evt.wheel.y * 0.1 * cam.zoom;
  78. break;
  79. case SDL_KEYDOWN:
  80. keys[evt.key.keysym.scancode] = true;
  81. break;
  82. case SDL_KEYUP:
  83. keys[evt.key.keysym.scancode] = false;
  84. break;
  85. }
  86. }
  87. if (keys[SDL_SCANCODE_A]) {
  88. cam.pos.x -= 1 * dt;
  89. }
  90. if (keys[SDL_SCANCODE_D]) {
  91. cam.pos.x += 1 * dt;
  92. }
  93. if (keys[SDL_SCANCODE_W]) {
  94. cam.pos.y -= 1 * dt;
  95. }
  96. if (keys[SDL_SCANCODE_S]) {
  97. cam.pos.y += 1 * dt;
  98. }
  99. lol += 1 * dt;
  100. rnd.modifyChunk(chunk, {0, 0}, (int)lol % 6);
  101. rnd.modifyChunk(chunk, {4, 4}, ((int)(lol / 2) + 3) % 6);
  102. rnd.modifyChunk(chunk, {3, 2}, ((int)(lol * 1.5) + 7) % 6);
  103. rnd.drawChunk({0, 0}, chunk);
  104. win.clear();
  105. rnd.draw(cam);
  106. win.flip();
  107. }
  108. exit:
  109. IMG_Quit();
  110. }