RType
Collision.cpp
Go to the documentation of this file.
1 /*
2 ** EPITECH PROJECT, 2023
3 ** R-type
4 ** File description:
5 ** R-type
6 */
7 
8 #include "Collision.hpp"
9 #include "Drawable.hpp"
10 #include "SFML/Graphics/Rect.hpp"
11 #include "SFML/Window/Keyboard.hpp"
12 
13 /**
14  * @brief update, update the collision
15  * @param event
16  * @param component
17  */
18 void Collision::update(std::shared_ptr<Event> event, std::shared_ptr<IComponentRType> component)
19 {
20  auto drawable = std::dynamic_pointer_cast<Drawable>(component);
21  if (!drawable)
22  return;
23  for (auto &other : drawable->getDrawablesCollision()) {
24  if (Collision::checkCollision(drawable, other)) {
25  if (drawable->_textureId == BULLET) {
26  if (other->_textureId == ENEMY) {
27  drawable->_toDelete = true;
28  other->_toDelete = true;
29  _score += 1;
30  std::shared_ptr<Packet> sendpacket = std::make_shared<Packet>();
31  sendpacket->code = MESSAGE;
32  sendpacket->data_size = strlen(("Score: " + std::to_string(_score)).c_str());
33  sendpacket->data = malloc(sendpacket->data_size);
34  std::memcpy(sendpacket->data, ("Score: " + std::to_string(_score)).c_str(), sendpacket->data_size);
35  _serverSocket->broadcast(sendpacket.get());
36  free(sendpacket->data);
37  }
38  if (other->_textureId == BOSS) {
39  drawable->_toDelete = true;
40  other->_toDelete = true;
41  }
42  }
43  }
44  }
45 }
46 
47 /**
48  * @brief checkCollision, check the collision
49  * @param drawable
50  * @param other
51  * @return bool (true or false) if there is a collision
52  */
53 bool Collision::checkCollision(const std::shared_ptr<Drawable> &drawable, const std::shared_ptr<Drawable> &other)
54 {
55  Position pos1 = drawable->getPosition();
56  Position pos2 = other->getPosition();
57  Size size1 = {std::get<2>(drawable->getRect()) * drawable->getScale(),
58  std::get<3>(drawable->getRect()) * drawable->getScale()};
59  Size size2 = {std::get<2>(other->getRect()) * other->getScale(), std::get<3>(other->getRect()) * other->getScale()};
60 
61  sf::Rect<float> rect1(std::get<0>(pos1), std::get<1>(pos1), std::get<0>(size1), std::get<1>(size1));
62  sf::Rect<float> rect2(std::get<0>(pos2), std::get<1>(pos2), std::get<0>(size2), std::get<1>(size2));
63 
64  return rect1.intersects(rect2);
65 }
66 
67 /**
68  * @brief cancelMove, cancel the move
69  * @param event
70  * @param drawable
71  */
72 void Collision::cancelMove(const std::shared_ptr<Event> &event, const std::shared_ptr<Drawable> &drawable)
73 {
74  std::cout << "collision" << std::endl;
75  std::tuple<float, float> pos = drawable->getPosition();
76  std::cout << "pos: " << std::get<0>(pos) << " " << std::get<1>(pos) << std::endl;
77  if (event == nullptr)
78  return;
79  switch (event->key) {
80  case sf::Keyboard::Key::Left:
81  std::cout << "left" << std::endl;
82  drawable->setPosition(std::make_tuple(std::get<0>(pos) + 5, std::get<1>(pos)));
83  break;
84  case sf::Keyboard::Key::Right:
85  std::cout << "Right" << std::endl;
86  drawable->setPosition(std::make_tuple(std::get<0>(pos) - 5, std::get<1>(pos)));
87  break;
88  case sf::Keyboard::Key::Up:
89  std::cout << "Up" << std::endl;
90  drawable->setPosition(std::make_tuple(std::get<0>(pos), std::get<1>(pos) - 5));
91  break;
92  case sf::Keyboard::Key::Down:
93  std::cout << "Down" << std::endl;
94  drawable->setPosition(std::make_tuple(std::get<0>(pos), std::get<1>(pos) + 5));
95  break;
96  default:
97  break;
98  }
99 }