Agora pode ficar abaixado enquanto tenta descer chao impassavel
[Projeto-PCG.git] / collision.cpp
blob3de2a78d20ca92769d67e4aa41da9f6d56ab1245
1 #include "collision.h"
3 void CollisionManager::subscribe(Thing* thing){
4 things.insert(thing);
7 void CollisionManager::remove(Thing* thing){
8 things.erase(thing);
11 void CollisionManager::update(){
12 std::set<Thing*>::iterator it1,it2;
13 for (it1 = things.begin(); it1 != things.end(); it1++) {
14 for (it2 = it1; it2 != things.end(); it2++) {
15 if (*it1 == *it2) continue;
16 checkCollision(*it1,*it2);
21 bool pointInsidePolygon(Ponto ponto, Polygon p) {
22 std::vector<Linha>::iterator it;
23 Ponto infinito(0xffffff,ponto.y);
24 int inter = 0;
25 Linha toinfinity(ponto,infinito);
26 for (it = p.linhas.begin(); it != p.linhas.end(); it++) {
27 if (linesIntersect(*it,toinfinity)) {
28 inter++;
31 if (inter % 2 == 1)
32 return true;
33 else
34 return false;
37 bool CollisionManager::checkCollision(Thing* a, Thing* b){
38 if (a->dead || b->dead)
39 return false;
40 Polygon pa,pb;
41 pa = a->getCollision();
42 pb = b->getCollision();
43 pa.translate(a->getPosition());
44 pb.translate(b->getPosition());
45 std::vector<Linha>::iterator ita,itb;
46 if (pointInsidePolygon(pb.linhas[0].vertices[0],pa)) {
47 a->collide(b);
48 b->collide(a);
49 return true;
51 for (ita = pa.linhas.begin(); ita != pa.linhas.end(); ita++) {
52 for (itb = pb.linhas.begin(); itb != pb.linhas.end(); itb++) {
53 /*std::cout<<"A:"<<(*ita).vertices[0].x<<" "<<(*ita).vertices[0].y<<" "
54 <<(*ita).vertices[1].x<<" "<<(*ita).vertices[1].y<<std::endl;
55 std::cout<<"B:"<<(*itb).vertices[0].x<<" "<<(*itb).vertices[0].y<<" "
56 <<(*itb).vertices[1].x<<" "<<(*itb).vertices[1].y<<std::endl;*/
57 if (linesIntersect(*ita,*itb)) {
58 a->collide(b);
59 b->collide(a);
60 return true;
64 return false;