Changeset 0807aeb in opengl-game for vulkan-game.cpp


Ignore:
Timestamp:
Mar 10, 2020, 2:53:34 AM (5 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
22217d4
Parents:
44f23af
git-author:
Dmitry Portnoy <dmp1488@…> (03/10/20 00:43:57)
git-committer:
Dmitry Portnoy <dmp1488@…> (03/10/20 02:53:34)
Message:

Spawn asteroids at a regular interval and make them move in the player's direction, change the movement of all game objects to depend on elapsed time and be framerate-independent, and switch from SDL2 timers to the C++ chrono library

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.cpp

    r44f23af r0807aeb  
    22
    33#include <array>
    4 #include <chrono>
    54#include <iostream>
    65#include <set>
     
    3231
    3332void VulkanGame::run(int width, int height, unsigned char guiFlags) {
     33   seedRandomNums();
     34
    3435   cout << "DEBUGGING IS " << (ENABLE_VALIDATION_LAYERS ? "ON" : "OFF") << endl;
    3536
     
    586587   bool quit = false;
    587588
    588    curTime = SDL_GetPerformanceCounter();
     589   this->startTime = high_resolution_clock::now();
     590   this->curTime = duration<float, seconds::period>(high_resolution_clock::now() - this->startTime).count();
     591
     592   lastSpawn_asteroid = this->curTime;
    589593
    590594   while (!quit) {
    591595
    592       prevTime = curTime;
    593       curTime = SDL_GetPerformanceCounter();
    594 
    595       elapsedTime = (double)((curTime - prevTime) * 1000 / (double)SDL_GetPerformanceFrequency());
     596      this->prevTime = this->curTime;
     597      this->curTime = duration<float, seconds::period>(high_resolution_clock::now() - this->startTime).count();
     598      this->elapsedTime = this->curTime - this->prevTime;
    596599
    597600      gui->processEvents();
     
    629632                        mat4(1.0f)
    630633                     }, true);
    631                } else if (e.key.keycode == SDL_SCANCODE_Z) {
    632                   addObject(asteroidObjects, asteroidPipeline,
    633                      addObjectIndex<AsteroidVertex>(asteroidObjects.size(),
    634                      addVertexNormals<AsteroidVertex>({
    635 
    636                         // front
    637                         {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    638                         {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    639                         {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    640                         {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    641                         {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    642                         {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    643 
    644                         // top
    645                         {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    646                         {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    647                         {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    648                         {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    649                         {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    650                         {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    651 
    652                         // bottom
    653                         {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    654                         {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    655                         {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    656                         {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    657                         {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    658                         {{ 1.0f, -1.0f, -1.0}, {0.4f, 0.4f, 0.4f}},
    659 
    660                         // back
    661                         {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    662                         {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    663                         {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    664                         {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    665                         {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    666                         {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    667 
    668                         // right
    669                         {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    670                         {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    671                         {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    672                         {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    673                         {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    674                         {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    675 
    676                         // left
    677                         {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    678                         {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    679                         {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    680                         {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    681                         {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
    682                         {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
    683                      })), {
    684                         0,  1,  2,  3,  4,  5,
    685                         6,  7,  8,  9, 10, 11,
    686                         12, 13, 14, 15, 16, 17,
    687                         18, 19, 20, 21, 22, 23,
    688                         24, 25, 26, 27, 28, 29,
    689                         30, 31, 32, 33, 34, 35,
    690                      }, {
    691                         mat4(1.0f),
    692                         10.0f,
    693                         0
    694                      }, true);
    695 
    696                   // translate(mat4(1.0f), vec3(getRandomNum(-1.3f, 1.3f), -1.2f, getRandomNum(-5.5f, -4.5f))) *
    697                   asteroidObjects.back().model_base =
    698                      translate(mat4(1.0f), vec3(getRandomNum(-1.3f, 1.3f), -1.2f, -2.0f)) *
    699                      rotate(mat4(1.0f), radians(60.0f), vec3(1.0f, 1.0f, -1.0f)) *
    700                      scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
    701 
    702                   updateObject(asteroidObjects, asteroidPipeline, asteroidObjects.size() - 1);
    703634               } else {
    704635                  cout << "Key event detected" << endl;
     
    725656      // Check which keys are held down
    726657
    727       float shipSpeed = 0.0005f;
    728       float asteroidSpeed = 0.002f;
    729 
    730658      if (gui->keyPressed(SDL_SCANCODE_LEFT)) {
    731          shipObjects[0].model_transform = translate(mat4(1.0f), vec3(-shipSpeed * elapsedTime, 0.0f, 0.0f))
     659         shipObjects[0].model_transform = translate(mat4(1.0f), vec3(-this->shipSpeed * this->elapsedTime, 0.0f, 0.0f))
    732660            * shipObjects[0].model_transform;
    733661
    734662         updateObject(shipObjects, shipPipeline, 0);
    735663      } else if (gui->keyPressed(SDL_SCANCODE_RIGHT)) {
    736          shipObjects[0].model_transform = translate(mat4(1.0f), vec3(shipSpeed * elapsedTime, 0.0f, 0.0f))
     664         shipObjects[0].model_transform = translate(mat4(1.0f), vec3(this->shipSpeed * this->elapsedTime, 0.0f, 0.0f))
    737665            * shipObjects[0].model_transform;
    738666
     
    740668      }
    741669
     670      // TODO: Remove this block of code and correctly update the center of all objects when they are transformed
    742671      if (gui->keyPressed(SDL_SCANCODE_X)) {
    743672         if (asteroidObjects.size() > 0 && !asteroidObjects[0].ssbo.deleted) {
    744             asteroidObjects[0].model_transform = translate(mat4(1.0f), vec3(0.0f, 0.0f, asteroidSpeed * elapsedTime))
     673            asteroidObjects[0].model_transform = translate(mat4(1.0f), vec3(0.0f, 0.0f, this->asteroidSpeed * this->elapsedTime))
    745674               * asteroidObjects[0].model_transform;
    746675
     
    765694// where it will run just once per frame
    766695void VulkanGame::updateScene(uint32_t currentImage) {
    767    static auto startTime = chrono::high_resolution_clock::now();
    768 
    769    auto currentTime = chrono::high_resolution_clock::now();
    770    float time = chrono::duration<float, chrono::seconds::period>(currentTime - startTime).count();
    771 
    772696   for (int i = 0; i < modelObjects.size(); i++) {
    773697      modelObjects[i].model_transform =
    774698         translate(mat4(1.0f), vec3(0.0f, -2.0f, -0.0f)) *
    775          rotate(mat4(1.0f), time * radians(90.0f), vec3(0.0f, 0.0f, 1.0f));
     699         rotate(mat4(1.0f), this->curTime * radians(90.0f), vec3(0.0f, 0.0f, 1.0f));
    776700
    777701      updateObject(modelObjects, modelPipeline, i);
     702   }
     703
     704   for (int i = 0; i < asteroidObjects.size(); i++) {
     705      if (!asteroidObjects[i].ssbo.deleted) {
     706         asteroidObjects[i].model_transform =
     707            translate(mat4(1.0f), vec3(0.0f, 0.0f, this->asteroidSpeed * this->elapsedTime)) *
     708            asteroidObjects[i].model_transform;
     709
     710         updateObject(asteroidObjects, asteroidPipeline, i);
     711      }
     712   }
     713
     714   if (this->curTime - this->lastSpawn_asteroid > this->spawnRate_asteroid) {
     715      this->lastSpawn_asteroid = this->curTime;
     716
     717      addObject(asteroidObjects, asteroidPipeline,
     718         addObjectIndex<AsteroidVertex>(asteroidObjects.size(),
     719            addVertexNormals<AsteroidVertex>({
     720
     721               // front
     722               {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     723               {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     724               {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     725               {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     726               {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     727               {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     728
     729               // top
     730               {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     731               {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     732               {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     733               {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     734               {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     735               {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     736
     737               // bottom
     738               {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     739               {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     740               {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     741               {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     742               {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     743               {{ 1.0f, -1.0f, -1.0}, {0.4f, 0.4f, 0.4f}},
     744
     745               // back
     746               {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     747               {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     748               {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     749               {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     750               {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     751               {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     752
     753               // right
     754               {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     755               {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     756               {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     757               {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     758               {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     759               {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     760
     761               // left
     762               {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     763               {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     764               {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     765               {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     766               {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
     767               {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
     768               })), {
     769                  0,  1,  2,  3,  4,  5,
     770                  6,  7,  8,  9, 10, 11,
     771                  12, 13, 14, 15, 16, 17,
     772                  18, 19, 20, 21, 22, 23,
     773                  24, 25, 26, 27, 28, 29,
     774                  30, 31, 32, 33, 34, 35,
     775         }, {
     776            mat4(1.0f),
     777            10.0f,
     778            0
     779         }, true);
     780
     781      // translate(mat4(1.0f), vec3(getRandomNum(-1.3f, 1.3f), -1.2f, getRandomNum(-5.5f, -4.5f))) *
     782      // translate(mat4(1.0f), vec3(0.0504826f, -1.2f, 1.0f)) *
     783      asteroidObjects.back().model_base =
     784         translate(mat4(1.0f), vec3(getRandomNum(-1.3f, 1.3f), -1.2f, -2.0f)) *
     785         rotate(mat4(1.0f), radians(60.0f), vec3(1.0f, 1.0f, -1.0f)) *
     786         scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
     787
     788      updateObject(asteroidObjects, asteroidPipeline, asteroidObjects.size() - 1);
    778789   }
    779790
Note: See TracChangeset for help on using the changeset viewer.