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.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. Cygnet::RenderSprite loadSprite(Cygnet::Renderer &rnd, const char *path) {
  22. SDL_Surface *surf = IMG_Load(path);
  23. auto sprite = rnd.createSprite(surf->pixels, surf->w, surf->h);
  24. SDL_FreeSurface(surf);
  25. return sprite;
  26. }
  27. int main() {
  28. Cygnet::Context ctx;
  29. IMG_Init(IMG_INIT_PNG);
  30. Cygnet::Window win("Cygnet Test", 680, 680);
  31. Cygnet::Renderer rnd;
  32. for (auto path: {
  33. "core.mod/assets/tile/dirt.png",
  34. "core.mod/assets/tile/grass.png",
  35. "core.mod/assets/tile/leaves.png",
  36. "core.mod/assets/tile/stone.png",
  37. "core.mod/assets/tile/torch.png",
  38. "core.mod/assets/tile/tree-trunk.png",
  39. }) addTile(rnd, path);
  40. rnd.uploadTileTexture();
  41. Cygnet::RenderSprite playerSprite = loadSprite(rnd, "core.mod/assets/entity/player-running.png");
  42. Cygnet::RenderChunk chunk;
  43. {
  44. uint16_t tiles[SwanCommon::CHUNK_WIDTH * SwanCommon::CHUNK_HEIGHT];
  45. memset(tiles, 0, sizeof(tiles));
  46. tiles[0] = 1;
  47. tiles[1] = 2;
  48. tiles[2] = 3;
  49. chunk = rnd.createChunk(tiles);
  50. }
  51. Cygnet::RenderCamera cam = {
  52. .pos = { 0, 0 },
  53. .size = win.size(),
  54. .zoom = 1,
  55. };
  56. float lol = 0;
  57. bool keys[512] = { 0 };
  58. double acc = 0;
  59. double prevTime = getTime() - 1/60.0;
  60. int frames = 0;
  61. float x = 0;
  62. while (true) {
  63. double currTime = getTime();
  64. double dt = currTime - prevTime;
  65. prevTime = currTime;
  66. acc += dt;
  67. frames += 1;
  68. if (acc >= 2) {
  69. std::cerr << "FPS: " << (frames / 2.0) << '\n';
  70. acc -= 2;
  71. frames = 0;
  72. }
  73. SDL_Event evt;
  74. while (SDL_PollEvent(&evt)) {
  75. switch (evt.type) {
  76. case SDL_QUIT:
  77. goto exit;
  78. case SDL_WINDOWEVENT:
  79. switch (evt.window.event) {
  80. case SDL_WINDOWEVENT_SIZE_CHANGED:
  81. win.onResize(evt.window.data1, evt.window.data2);
  82. cam.size = win.size();
  83. break;
  84. }
  85. break;
  86. case SDL_MOUSEWHEEL:
  87. cam.zoom += evt.wheel.y * 0.1 * cam.zoom;
  88. break;
  89. case SDL_KEYDOWN:
  90. keys[evt.key.keysym.scancode] = true;
  91. break;
  92. case SDL_KEYUP:
  93. keys[evt.key.keysym.scancode] = false;
  94. break;
  95. }
  96. }
  97. if (keys[SDL_SCANCODE_A]) {
  98. cam.pos.x -= 1 * dt;
  99. }
  100. if (keys[SDL_SCANCODE_D]) {
  101. cam.pos.x += 1 * dt;
  102. }
  103. if (keys[SDL_SCANCODE_W]) {
  104. cam.pos.y -= 1 * dt;
  105. }
  106. if (keys[SDL_SCANCODE_S]) {
  107. cam.pos.y += 1 * dt;
  108. }
  109. lol += 1 * dt;
  110. rnd.modifyChunk(chunk, { 0, 0 }, (int)lol % 6);
  111. rnd.modifyChunk(chunk, { 4, 4 }, ((int)(lol / 2) + 3) % 6);
  112. rnd.modifyChunk(chunk, { 3, 2 }, ((int)(lol * 1.5) + 7) % 6);
  113. rnd.drawChunk(chunk, { 0, 0 });
  114. x += dt;
  115. rnd.drawSprite(playerSprite, { x, 0 });
  116. win.clear();
  117. rnd.draw(cam);
  118. win.flip();
  119. }
  120. exit:
  121. IMG_Quit();
  122. }