package games.scroller.stickmansam; import games.scroller.stickmansam.StickmanSpriteLibrary.Bullet; import games.scroller.stickmansam.StickmanSpriteLibrary.StickZombie; import util.Vector; import vooga.scroller.collision_manager.CollisionDirection; import vooga.scroller.collision_manager.VisitLibrary; import vooga.scroller.extra_resources.sprite_interfaces.IEnemy; import vooga.scroller.extra_resources.sprite_interfaces.IPlatform; import vooga.scroller.sprites.Sprite; import vooga.scroller.sprites.interfaces.IDoor; import vooga.scroller.sprites.superclasses.Player; import vooga.scroller.util.Direction; /** * Visit methods for the Stickman Sam game. * * @author David Winegar * */ public class StickmanVisitMethods extends VisitLibrary { /** * Visits the player with a platform, deals with collisions. * * @param player player * @param platform platform */ public void visit (StickmanPlayer player, IPlatform platform) { Direction collisionType = new CollisionDirection().collisionDirection(player, platform); player.setGravity(true); if (collisionType == null) return; switch (collisionType) { case TOP: player.setCenter(player.getX(), platform.getTop() - (player.getHeight() / 2)); Vector v = player.getVelocity().getComponentVector(Sprite.DOWN_DIRECTION); v.negate(); player.addVector(v); break; case BOTTOM: player.setCenter(player.getX(), platform.getBottom() + (player.getHeight() / 2)); // set gravity off when standing on solid ground player.setGravity(false); break; case LEFT: player.setCenter(platform.getLeft() - (player.getWidth() / 2), player.getY()); Vector l = player.getVelocity().getComponentVector(Sprite.LEFT_DIRECTION); l.negate(); player.addVector(l); break; case RIGHT: player.setCenter(platform.getRight() + (player.getWidth() / 2), player.getY()); Vector r = player.getVelocity().getComponentVector(Sprite.RIGHT_DIRECTION); r.negate(); player.addVector(r); break; default: break; } } /** * Deals with collisions between enemy and player, player cannot move into enemy and player * takes damage. * * @param player player * @param enemy enemy */ public void visit (StickmanPlayer player, IEnemy enemy) { player.takeHit(enemy.getHit()); Direction collisionType = new CollisionDirection().collisionDirection(player, enemy); if (collisionType == null) return; switch (collisionType) { case LEFT: player.setCenter(enemy.getLeft() - (player.getWidth() / 2), player.getY()); Vector l = player.getVelocity().getComponentVector(Sprite.LEFT_DIRECTION); l.negate(); player.addVector(l); break; case RIGHT: player.setCenter(enemy.getRight() + (player.getWidth() / 2), player.getY()); Vector r = player.getVelocity().getComponentVector(Sprite.RIGHT_DIRECTION); r.negate(); player.addVector(r); break; default: break; } } /** * When bullet hits element, the element takes damage and the bullet is destroyed. * * @param element element * @param bullet bullet */ public void visit (StickZombie element, Bullet bullet) { element.takeHit(bullet.getHit()); bullet.takeHit(2); } /** * Go to next level on hitting portal * * @param player player * @param levelPortal levelportal */ public void visit (Player player, IDoor levelPortal) { levelPortal.goToNextLevel(); } /** * don't allow enemies to fall through platforms. * * @param enemy enemy * @param platform platform */ public void visit (StickZombie enemy, IPlatform platform) { Direction collisionType = new CollisionDirection().collisionDirection(enemy, platform); if (collisionType == null) return; switch (collisionType) { case TOP: enemy.setCenter(enemy.getX(), platform.getTop() - (enemy.getHeight() / 2)); Vector v = enemy.getVelocity().getComponentVector(Sprite.DOWN_DIRECTION); v.negate(); enemy.addVector(v); break; case BOTTOM: enemy.setCenter(enemy.getX(), platform.getBottom() + (enemy.getHeight() / 2)); Vector up = enemy.getVelocity().getComponentVector(Sprite.UP_DIRECTION); up.negate(); enemy.addVector(up); break; case LEFT: enemy.setCenter(platform.getLeft() - (enemy.getWidth() / 2), enemy.getY()); Vector l = enemy.getVelocity().getComponentVector(Sprite.LEFT_DIRECTION); l.negate(); enemy.addVector(l); break; case RIGHT: enemy.setCenter(platform.getRight() + (enemy.getWidth() / 2), enemy.getY()); Vector r = enemy.getVelocity().getComponentVector(Sprite.RIGHT_DIRECTION); r.negate(); enemy.addVector(r); break; default: break; } } }