package games.fighter.billMuenstermanJouster.util; import java.awt.Rectangle; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import vooga.fighter.model.objects.AttackObject; import vooga.fighter.model.objects.CharacterObject; import vooga.fighter.model.objects.EnvironmentObject; import vooga.fighter.model.objects.GameObject; import vooga.fighter.model.objects.MapObject; import vooga.fighter.model.objects.MenuObject; import vooga.fighter.model.objects.MouseClickObject; /** * Detects collisions between all the game objects. Collision handling is achieved * in the game objects themselves, and * * @author James Wei, alanni * @modified Matthew Parides * @modified Jack Matteucci */ public class CollisionManager { CollisionDetector myCollisionDetector; public CollisionManager () { setCollisionDetector(); } public void setCollisionDetector(){ myCollisionDetector = new CollisionDetector(); } /** * Checks for collisions between the game objects. */ public void checkCollisions (List<GameObject> myObjects) { for (int i = 0; i < myObjects.size() - 1; i++) { for (int j = i + 1; j < myObjects.size(); j++) { GameObject o1 = myObjects.get(i); GameObject o2 = myObjects.get(j); if (!(o1 instanceof MapObject || o2 instanceof MapObject)){ Rectangle o1Rect = o1.getCurrentState().getCurrentRectangle(); Rectangle o2Rect = o2.getCurrentState().getCurrentRectangle(); if (myCollisionDetector.quickDetectCollision(o1Rect, o2Rect)) { handleCollisions(o1, o2); } } } } } /** * Delegates to specific collision methods based on the runtime type of our * colliding game objects using reflection. */ public void handleCollisions (GameObject o1, GameObject o2) { try { Class<?>[] runtimeClasses = new Class[] { o1.getClass(), o2.getClass() }; Object[] parameters = new Object[] { o1, o2 }; Method method = this.getClass().getMethod("collide", runtimeClasses); method.invoke(this, parameters); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (Exception e) { } } /** * Handles collisions between two attack objects. * */ public void collide (AttackObject o1, AttackObject o2) { o1.endCounter(); o2.endCounter(); } /** * Handles collisions between a character object and an attack object. * Destroys object on collision with character object */ public void collide (CharacterObject o1, AttackObject o2) { collide(o2, o1); } /** * Handles collisions between an attack object and a character object. */ public void collide (AttackObject o1, CharacterObject o2) { if (!o1.getOwner().equals(o2)) { o1.inflictDamage(o2); o1.addTargetForEffects(o2); } o1.endCounter(); } /** * Handles collisions between an environment object and an attack object. */ public void collide (EnvironmentObject o1, AttackObject o2) { collide(o2, o1); } /** * Handles collisions between an attack object and an environment object. */ public void collide (AttackObject o1, EnvironmentObject o2) { o1.endCounter(); } /** * Handles collisions between a character object and an environment object. */ public void collide (CharacterObject o1, EnvironmentObject o2) { collide(o2, o1); } /** * Handles collisions between an environment object and a character object. */ public void collide (EnvironmentObject o1, CharacterObject o2) { Rectangle o1Rect = o1.getCurrentState().getCurrentRectangle(); Rectangle o2Rect = o2.getCurrentState().getCurrentRectangle(); if (myCollisionDetector.hitBottom(o2Rect, o1Rect)) { o2.moveBack(); } } /** * Handles collisions between a Menu object and an MouseClick object. */ public void collide (MenuObject o1, MouseClickObject o2) { o1.tellDelegate(); } /** * Handles collisions between an MouseClick object and a Menu object. */ public void collide (MouseClickObject o1, MenuObject o2) { o2.tellDelegate(); } }