Advertisement
pajadam

Platform Collisions

Sep 18th, 2015
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.57 KB | None | 0 0
  1. #####################
  2.  WAY TO SPACE INDEV
  3.  by Adam Pajkert
  4. #####################
  5.  
  6. void Player::Update() // Aktualizacja logiki wywoływana 128 razy na sekundę ( 128tps )
  7. {
  8.     // Wyłapujemy input związany z ruchem naszej postaci
  9.     if( sf::Keyboard::isKeyPressed(sf::Keyboard::A) && sf::Keyboard::isKeyPressed(sf::Keyboard::D) == false )
  10.         moveX( false ); // moveX( bool wPrawo )
  11.     else
  12.     if( sf::Keyboard::isKeyPressed(sf::Keyboard::D) && sf::Keyboard::isKeyPressed(sf::Keyboard::A) == false )
  13.         moveX( true ); // moveX( bool wPrawo )
  14.     if( sf::Keyboard::isKeyPressed(sf::Keyboard::Space) )
  15.         jump();
  16.    
  17.     movementUpdate(); // Aktualizacja poruszania się ( płynne przyśpieszanie i wytracanie prędkości, czy opadanie lub skok )
  18.    
  19.     // Pozycję box colliderów
  20.     eCoTop.setPosition( mPosX + 7, mPosY ); // Górny
  21.     eCoDown.setPosition( mPosX + 7, mPosY + 176); // Dolny
  22.     eCoDownB.setPosition( mPosX + 7, mPosY + 192); // Dolny najniższy -> sprawdza czy pod nami jest blok kolizyjny,
  23.                            // jeśli nie - postać spada niżej
  24.     eCoLeft.setPosition( mPosX, mPosY + 12); // Lewy
  25.     eCoRight.setPosition( mPosX + 80, mPosY + 12); // Prawy
  26.     eCoAll.setPosition( mPosX, mPosY ); // Obszar zajmowany przez wszystkie, najpierw sprawdzamy z nim kolizję mapy kolizji.
  27.  
  28.     unsigned int j = 0; // zmienna pomocnicza, odpowiada za opadanie postaci gdy nie ma pod nią bloku
  29.    
  30.     // na początek pętla która przeleci przez wszystkie Collision Boxy z mapy kolizji
  31.     for( unsigned int i = 0; i < CollMap->ColBox.size(); i++)
  32.     {
  33.     // najpierw sprawdzamy czy kolidują z obszarem w którym znajdują się collidery gracza
  34.         if( CollMap->ColBox[i].intersects( sf::IntRect( eCoAll.getGlobalBounds().left, eCoAll.getGlobalBounds().top,
  35.                                                         eCoAll.getGlobalBounds().width, eCoAll.getGlobalBounds().height ) ) )
  36.         {
  37.         //jeśli tak, sprawdzamy resztę
  38.         //Dolna kolizja
  39.             if( CollMap->ColBox[i].intersects( sf::IntRect( eCoDown.getGlobalBounds().left, eCoDown.getGlobalBounds().top,
  40.                                                             eCoDown.getGlobalBounds().width, eCoDown.getGlobalBounds().height ) ) )
  41.             {   // ponieważ uderzył w ziemię....
  42.                 isJumping = false; //  ustawiamy flagę skoku na 0
  43.                 isFalling = false; //  ustawiamy flagę spadania na 0
  44.                 SpeedY = 0; // Zerujemy prędkość spadania
  45.  
  46.                 mPosY = CollMap->ColBox[i].top - 192; // wyrównujemy pozycję tak,
  47.                               // aby postać była ponad collision boxem, nie stykając się z nim
  48.                 isModified = true; // Ustawiamy flagę która mówi nam że zmodyfikowaliśmy pozycję gracza.
  49.             }
  50.             if( CollMap->ColBox[i].intersects( sf::IntRect( eCoDownB.getGlobalBounds().left, eCoDownB.getGlobalBounds().top,
  51.                                                             eCoDownB.getGlobalBounds().width, eCoDownB.getGlobalBounds().height ) ) )
  52.             { // teraz jeśli collider postaci ( odpowiedzialny za opadanie gdy pod postacią nie ma kolizji ) koliduje z collision boxem..
  53.                 j++; // zwiększamy wartość j
  54.             }
  55.             if( CollMap->ColBox[i].intersects( sf::IntRect( eCoTop.getGlobalBounds().left, eCoTop.getGlobalBounds().top,
  56.                                                             eCoTop.getGlobalBounds().width, eCoTop.getGlobalBounds().height ) ) )
  57.             { // jeśli górny collider postaci złapał kolizję
  58.                 isJumping = false; //  ustawiamy flagę skoku na 0
  59.                 isFalling = true; //  ustawiamy flagę spadania na 1
  60.                 SpeedY = 0; // zerujemy prędkość spadania
  61.                 JumpY = 0; // zerujemy zmienną wysokości skoku ( nie ważne :D )
  62.  
  63.                 mPosY = CollMap->ColBox[i].top + 64; // zmieniamy pozycję gracza tak by nie uderzał o sufit (górny)
  64.                 isModified = true; // standardowo flaga zmodyfikowanej pozycji
  65.             }
  66.  
  67.             if( CollMap->ColBox[i].intersects( sf::IntRect( eCoLeft.getGlobalBounds().left, eCoLeft.getGlobalBounds().top ,
  68.                                                             eCoLeft.getGlobalBounds().width, eCoLeft.getGlobalBounds().height ) ) )
  69.             { // analogicznie to powyższych dwóch sytuacji
  70.                 SpeedX = 0;
  71.  
  72.                 mPosX = CollMap->ColBox[i].left + 64;
  73.                 isModified = true;
  74.             }
  75.             if( CollMap->ColBox[i].intersects( sf::IntRect( eCoRight.getGlobalBounds().left, eCoRight.getGlobalBounds().top,
  76.                                                             eCoRight.getGlobalBounds().width, eCoRight.getGlobalBounds().height ) ) )
  77.             {
  78.                 SpeedX = 0;
  79.  
  80.                 mPosX = CollMap->ColBox[i].left - 96;
  81.  
  82.                 isModified = true;
  83.             }
  84.             if( isModified == true )
  85.             { // tutaj aktualizujemy pozycję naszych bounding boxów gracza
  86.                 eCoTop.setPosition( mPosX + 7, mPosY );
  87.                 eCoDown.setPosition( mPosX + 7, mPosY + 176);
  88.                 eCoDownB.setPosition( mPosX + 7, mPosY + 192);
  89.                 eCoLeft.setPosition( mPosX, mPosY + 12);
  90.                 eCoRight.setPosition( mPosX + 80, mPosY + 12);
  91.                 eCoAll.setPosition( mPosX, mPosY );
  92.                 isModified = false;
  93.             }
  94.         }
  95.     }
  96.  
  97.     if( j == 0 && isJumping == false )
  98.     { // jeśli pod nami nie ma bloku oraz nie jesteśmy podczas skoku...
  99.         isFalling = true; // .. zacznij spadać
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement