package games.scroller.stickmansam; import games.scroller.stickmansam.StickmanSpriteLibrary.Bullet; import java.awt.Dimension; import util.Vector; import util.input.InputClassTarget; import util.input.InputMethodTarget; import vooga.scroller.level_editor.Level; import vooga.scroller.scrollingmanager.ScrollingManager; import vooga.scroller.sprites.Sprite; import vooga.scroller.sprites.animation.state_movement.MoveLeftState; import vooga.scroller.sprites.animation.state_movement.MoveRightState; import vooga.scroller.sprites.superclasses.Player; import vooga.scroller.util.ISpriteView; import vooga.scroller.util.Pixmap; import vooga.scroller.util.physics.Force; import vooga.scroller.util.physics.Gravity; import vooga.scroller.view.GameView; /** * Stickman player * * @author David Winegar * */ @InputClassTarget public class StickmanPlayer extends Player { private static final int GRAVITY_CONSTANT = -15; private static final Pixmap STICKMAN_VIEW = StickmanSpriteLibrary.makePixmap("stickman.png"); private static final Dimension SIZE = new Dimension(32, 45); private static final int HEALTH = 100; private static final int DAMAGE = 20; private static final String INPUT_LOCATION = "games/scroller/stickmansam/keymap"; private static final Vector JUMP_VELOCITY = new Vector(Sprite.UP_DIRECTION, 149); private static final double MAX_JUMP_VELOCITY = 1; private static final int SPEED = 100; private static final int MAX_JUMPS = 1; private static final double MAX_SPEED = 300; private static final int LEFT = 180; private static final int RIGHT = 0; private static final int TIME_BETWEEN_BULLETS = 40; private static final ISpriteView MOVE_LEFT = StickmanSpriteLibrary .makePixmap("stickmanleft.png"); private static final ISpriteView STAND_LEFT = StickmanSpriteLibrary .makePixmap("stickmanleft.png"); private static final ISpriteView MOVE_RIGHT = StickmanSpriteLibrary.makePixmap("stickman.png"); private static final ISpriteView STAND_RIGHT = StickmanSpriteLibrary.makePixmap("stickman.png"); private int myJumpCount; private Force myGravity; private boolean myGravityEnabled = true; private int myDirection = RIGHT; private int myBulletTimer = 0; /** * Instantiate player * * @param gameView * @param sm */ public StickmanPlayer (GameView gameView, ScrollingManager sm) { super(STICKMAN_VIEW, SIZE, gameView, sm, HEALTH, DAMAGE); myJumpCount = 0; myGravity = new Gravity(this, GRAVITY_CONSTANT); addPossibleState(MoveLeftState.STATE_ID, new MoveLeftState(this, MOVE_LEFT, STAND_LEFT, SPEED)); addPossibleState(MoveRightState.STATE_ID, new MoveRightState(this, MOVE_RIGHT, STAND_RIGHT, SPEED)); } @Override public String getInputFilePath () { return INPUT_LOCATION; } @Override public void handleDeath (Level level) { getLevel().getDoor().goToNextLevel(); } @Override public void update (double elapsedTime, Dimension bounds) { if (myGravityEnabled) { myGravity.apply(); } if (myBulletTimer > 0) { myBulletTimer--; } if (myJumpCount == MAX_JUMPS && getVelocity().getComponentVector(Sprite.UP_DIRECTION).getMagnitude() < .5) { myJumpCount = 0; } super.update(elapsedTime, bounds); checkSpeed(); } /** * Sets whether gravity is enabled not * * @param gravity boolean */ public void setGravity (boolean gravity) { myGravityEnabled = gravity; } private void checkSpeed () { double speed = getVelocity().getMagnitude(); if (speed > MAX_SPEED) { double angle = getVelocity().getDirection(); this.setVelocity(angle, MAX_SPEED); } } @InputMethodTarget(name = "leftstart") public void walkLeft () { myDirection = LEFT; activateState(MoveLeftState.STATE_ID); } @InputMethodTarget(name = "leftend") public void stopLeft () { deactivateState(MoveLeftState.STATE_ID); } @InputMethodTarget(name = "rightstart") public void walkRight () { myDirection = RIGHT; activateState(MoveRightState.STATE_ID); } @InputMethodTarget(name = "rightend") public void stopRight () { deactivateState(MoveRightState.STATE_ID); } @InputMethodTarget(name = "jump") public void jump () { if (getVelocity().getComponentVector(Sprite.UP_DIRECTION).getMagnitude() < MAX_JUMP_VELOCITY && getVelocity().getComponentVector(Sprite.DOWN_DIRECTION).getMagnitude() < MAX_JUMP_VELOCITY) { addVector(JUMP_VELOCITY); } } @InputMethodTarget(name = "fire") public void fire () { if (myBulletTimer == 0) { getLevel().addSprite(new Bullet(myDirection, getCenter())); myBulletTimer = TIME_BETWEEN_BULLETS; } } }