Advertisement
Guest User

Untitled

a guest
Feb 4th, 2022
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. detekcja kolizji:
  2.  
  3. bool IfCOllides1d(double p1, double p2, double p3, double p4){
  4. std::pair<double,double> first, second;
  5. if(p1 < p3){
  6. first=std::make_pair(p1,p2);
  7. second=std::make_pair(p3,p4);
  8. }
  9. else{
  10. first=std::make_pair(p3,p4);
  11. second=std::make_pair(p1,p2);
  12. }
  13. return (second.first-first.first) < (first.second - first.first);
  14. }
  15.  
  16. bool Block::IfCollides(const Block& b2){
  17. if (!this->isColliding || !b2.isColliding){
  18. return false;
  19. }
  20.  
  21. auto p1 = this->_pos.x + this->_movingVec.x;
  22. auto p2 = this->_pos.x + this->_size.x + this->_movingVec.x;
  23. auto p3 = b2._pos.x + b2._movingVec.x;
  24. auto p4 = b2._pos.x + b2._size.x + b2._movingVec.x;
  25. bool IfCOllidesX=IfCOllides1d(p1,p2,p3,p4);
  26.  
  27. p1 = this->_pos.y + this->_movingVec.y;
  28. p2 = this->_pos.y + this->_size.y + this->_movingVec.y;
  29. p3 = b2._pos.y + b2._movingVec.y;
  30. p4 = b2._pos.y + b2._size.y + b2._movingVec.y;
  31. bool IfCOllidesY=IfCOllides1d(p1,p2,p3,p4);
  32.  
  33. return IfCOllidesX && IfCOllidesY;
  34. }
  35.  
  36.  
  37. rozwiązywanie ich:
  38. // run it when you are sure there is a collision
  39. void Engine::ResolveCollision(size_t b1, size_t b2){
  40. // define rectangle as 2 points on cartesian space
  41. auto a=level.Objects[b1]->_pos;
  42. auto b=level.Objects[b1]->_pos + level.Objects[b1]->_size;
  43.  
  44. auto c=level.Objects[b2]->_pos;
  45. auto d=level.Objects[b2]->_pos + level.Objects[b2]->_size;
  46. double scale=1.0;
  47.  
  48. // pythagoras theorem
  49. double vecLength=sqrt( level.Objects[b1]->_movingVec.x *
  50. level.Objects[b1]->_movingVec.x +
  51. level.Objects[b1]->_movingVec.y *
  52. level.Objects[b1]->_movingVec.y );
  53. double limit=0;
  54. if(b.x <= c.x || a.x >= d.x){
  55. if(a.x <= c.x){
  56. // collision from left side
  57. limit=c.x-b.x;
  58. }
  59. else{
  60. // collision from right side
  61. limit=a.x-d.x;
  62. }
  63. }
  64. else{
  65. if(a.y <= c.y){
  66. // collision from upper side
  67. limit=c.y-b.y;
  68. }
  69. else{
  70. // collision from down side
  71. limit=a.y-d.y;
  72. }
  73. }
  74. if(vecLength != 0.0){ scale=limit/vecLength; };
  75. level.Objects[b1]->_movingVec *=scale;
  76. level.Objects[b2]->_movingVec *=scale;
  77. }
  78.  
  79. void Engine::UpdateCollisions(){
  80. //std::cout<<level.Objects.size()<<std::endl;
  81. for(size_t p1=0; p1<level.Objects.size(); ++p1){
  82. for(size_t p2=p1+1; p2<level.Objects.size();++p2){
  83. if(level.Objects[p1]->IfCollides(*level.Objects[p2])){
  84. ResolveCollision(p1,p2);
  85. }
  86. }
  87. level.Objects[p1]->Update(renderer);
  88. }
  89. }
  90.  
  91. bloki trzymam jako shared_ptr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement