Debug_demo/Collisions.cpp (54 lines of code) (raw):

#include "Collisions.h" CollisionType getCollisionWithWalls(const Ball& b, const QRectF& bounding) { auto ballBB = b.aabb(); if (ballBB.right() > bounding.right()) return Right; if (ballBB.left() < bounding.left()) return Left; if (ballBB.top() < bounding.top()) return Top; return None; } CollisionType getCollisionWithBrick(const Ball& b, const QRectF& brick) { auto ballBB = b.aabb(); auto inters = ballBB.intersected(brick); if (inters.isEmpty()) { return None; } else { if (inters.width() > inters.height()){ if(inters.center().y()<ballBB.center().y()) { return Top; } else { return Bottom; } } else if(ballBB.center().x()>inters.center().x()) { return Left; } else return Right; } } bool applyCollision(Ball& b, CollisionType type) { int mulX = 1, mulY = 1; switch (type) { case Left: if (b.getSpeed().x() < 0) mulX = -1; break; case Right: if (b.getSpeed().x() > 0) mulX = -1; break; case Top: if (b.getSpeed().y() < 0) mulY = -1; break; case Bottom: if (b.getSpeed().y() > 0) mulY = -1; break; case None:break; } if (mulX == -1 || mulY == -1) { b.setSpeed(QPointF(b.getSpeed().x() * mulX, b.getSpeed().y() * mulY)); return true; } else { return false; } }