A 2D tile-based sandbox game.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

main.cc 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include <vector>
  2. #include <time.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <swan/common.h>
  6. #include <swan/World.h>
  7. #include <swan/Game.h>
  8. #include <swan/Timer.h>
  9. #include <SFML/System/Clock.hpp>
  10. #include <SFML/Audio.hpp>
  11. using namespace Swan;
  12. int main() {
  13. sf::Image icon;
  14. if (!icon.loadFromFile("assets/icon.png")) {
  15. fprintf(stderr, "Failed to load image 'icon.png'\n");
  16. abort();
  17. }
  18. // Cretate window
  19. sf::RenderWindow window(sf::VideoMode(800, 600), "Project: SWAN");
  20. window.setVerticalSyncEnabled(true);
  21. window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());
  22. Win win(&window);
  23. // Create music
  24. sf::SoundBuffer musicbuf;
  25. sf::Sound music;
  26. if (musicbuf.loadFromFile("assets/music/happy-1.wav")) {
  27. music.setBuffer(musicbuf);
  28. music.setLoop(true);
  29. music.play();
  30. } else {
  31. fprintf(stderr, "Failed to load music! Am very sad.\n");
  32. }
  33. Game::initGlobal();
  34. Game game(win);
  35. game.loadMod("core.mod");
  36. game.createWorld("core::default");
  37. sf::Clock clock;
  38. float fpsAcc = 0;
  39. float tickAcc = 0;
  40. int fcount = 0;
  41. int slowFrames = 0;
  42. while (window.isOpen()) {
  43. sf::Event event;
  44. while (window.pollEvent(event)) {
  45. switch (event.type) {
  46. case sf::Event::Closed:
  47. window.close();
  48. break;
  49. case sf::Event::Resized:
  50. window.setView(sf::View(sf::FloatRect(
  51. 0, 0, event.size.width, event.size.height)));
  52. break;
  53. case sf::Event::KeyPressed:
  54. game.onKeyPressed(event.key.code);
  55. break;
  56. case sf::Event::KeyReleased:
  57. game.onKeyReleased(event.key.code);
  58. break;
  59. case sf::Event::MouseMoved:
  60. game.onMouseMove(event.mouseMove.x, event.mouseMove.y);
  61. break;
  62. case sf::Event::MouseButtonPressed:
  63. game.onMousePressed(event.mouseButton.button);
  64. break;
  65. case sf::Event::MouseButtonReleased:
  66. game.onMouseReleased(event.mouseButton.button);
  67. break;
  68. default: break;
  69. }
  70. }
  71. float dt = clock.restart().asSeconds();
  72. // Display FPS
  73. fpsAcc += dt;
  74. fcount += 1;
  75. if (fpsAcc >= 4) {
  76. fprintf(stderr, "FPS: %.3f\n", fcount / 4.0);
  77. fpsAcc -= 4;
  78. fcount = 0;
  79. }
  80. if (dt > 0.1) {
  81. if (slowFrames == 0)
  82. fprintf(stderr, "Warning: delta time is too high! (%.3fs).\n", dt);
  83. slowFrames += 1;
  84. } else {
  85. if (slowFrames > 0) {
  86. if (slowFrames > 1)
  87. fprintf(stderr, "%i consecutive slow frames.\n", slowFrames);
  88. slowFrames = 0;
  89. }
  90. game.update(dt);
  91. // Call tick TICK_RATE times per second
  92. tickAcc += dt;
  93. while (tickAcc >= 1.0 / TICK_RATE) {
  94. tickAcc -= 1.0 / TICK_RATE;
  95. game.tick();
  96. }
  97. }
  98. window.clear();
  99. game.draw();
  100. window.display();
  101. }
  102. return 0;
  103. }