package vooga.scroller.marioGame.spritesDefinitions;
import java.awt.Dimension;
import java.awt.geom.Point2D;
import vooga.scroller.extra_resources.sprite_interfaces.ICollectible;
import vooga.scroller.extra_resources.sprite_interfaces.IEnemy;
import vooga.scroller.extra_resources.sprite_interfaces.IPlatform;
import vooga.scroller.level_editor.Level;
import vooga.scroller.level_editor.library.EncapsulatedSpriteLibrary;
import vooga.scroller.level_management.LevelPortal;
import vooga.scroller.sprites.Sprite;
import vooga.scroller.sprites.animation.Animation;
import vooga.scroller.sprites.animation.MovingSpriteAnimationFactory;
import vooga.scroller.sprites.interfaces.Locatable;
import vooga.scroller.sprites.movement.BackAndForth;
import vooga.scroller.sprites.movement.Movement;
import vooga.scroller.sprites.movement.TrackPlayer;
import vooga.scroller.sprites.superclasses.GameCharacter;
import vooga.scroller.sprites.superclasses.Player;
import vooga.scroller.util.ISpriteView;
import vooga.scroller.util.Pixmap;
/**
* This class is a convenient way to gather all the classes and use reflection
* to retrieve all classes. Not sure if this is the best way to implement this.
* But it is definitely better than having to parse the package. -DF
* The Classes are static to allow instantiation w/o an instance of MarioLib.
* TODO - Decide Whether to keep this implementation or switch to ENUM
* Moreover, it is an example of the sprite-specification file the game designer
* will need to provide.
*/
public class MarioLib extends EncapsulatedSpriteLibrary {
private static final Dimension DEFAULT_SIZE = new Dimension(32, 32);
private static final int DEFAULT_HEALTH = 1;
private static final int DEFAULT_DAMAGE = 0;
public static class Coin extends GameCharacter implements ICollectible {
private static final String DEFAULT_IMG = "coin.png";
private static final int DEFAULT_COIN_VALUE = 900;
public Coin () {
super(makePixmap(DEFAULT_IMG), DEFAULT_SIZE, DEFAULT_HEALTH, DEFAULT_DAMAGE);
}
@Override
public int getValue () {
return DEFAULT_COIN_VALUE;
}
@Override
public void handleDeath (Level level) {
// killing this does not do anything
}
}
public static class Koopa extends GameCharacter implements IEnemy {
private static final String DEFAULT_IMG = "koopa.png";
private static final Dimension KOOPA_SIZE = new Dimension(32, 64);
private int SPEED = 30;
private int RADIUS = 45;
private TrackPlayer movement = new TrackPlayer(this, getLocatable(), SPEED, RADIUS);
public Koopa () {
super(makePixmap(DEFAULT_IMG), KOOPA_SIZE, new Integer(1), new Integer(1));
}
public void update (double elapsedTime, Dimension bounds) {
movement.execute();
super.update(elapsedTime, bounds);
}
@Override
public void handleDeath (vooga.scroller.level_editor.Level level) {
// TODO Auto-generated method stub
}
@Override
public void addTarget (Locatable target) {
movement.setTarget(target);
}
}
public static class Turtle extends GameCharacter implements IEnemy {
private static final String DEFAULT_IMG = "turtle.gif";
private int SPEED = 30;
private int RADIUS = 45;
private Movement movement = new TrackPlayer(this, getLocatable(), SPEED, RADIUS);
public Turtle () {
super(makePixmap(DEFAULT_IMG), DEFAULT_SIZE, new Integer(1), new Integer(2));
}
public void update (double elapsedTime, Dimension bounds) {
movement.execute();
super.update(elapsedTime, bounds);
}
@Override
public void handleDeath (vooga.scroller.level_editor.Level level) {
// TODO Auto-generated method stub
}
}
public static class Platform extends Sprite implements IPlatform {
private static final String DEFAULT_IMG = "block.png";
public Platform () {
this(DEFAULT_IMG, DEFAULT_SIZE);
}
public Platform (String img, Dimension size) {
super(makePixmap(img), size);
}
}
public static class Plant extends GameCharacter implements IEnemy {
private static final String DEFAULT_IMG = "plant.png";
public Plant () {
super(makePixmap(DEFAULT_IMG), DEFAULT_SIZE, DEFAULT_HEALTH,
new Integer(2));
}
@Override
public void handleDeath (vooga.scroller.level_editor.Level level) {
// TODO Auto-generated method stub
}
}
public static class MovingPlatform extends Sprite implements IPlatform {
private static final Dimension MOVING_PLATFORM_SIZE = new Dimension(96, 32);
private static final String DEFAULT_IMG = "platform.gif";
private int SPEED = 30;
private Point2D START = new Point2D.Double(500.0, 100.0);
private Point2D END = new Point2D.Double(200.0, 500.0);
private Movement movement = new BackAndForth(this, START, END, SPEED);
public MovingPlatform () {
super(makePixmap(DEFAULT_IMG), MOVING_PLATFORM_SIZE);
}
public void update (double elapsedTime, Dimension bounds) {
movement.execute();
super.update(elapsedTime, bounds);
}
}
public static class LevelTwoBlockOne extends Platform implements IPlatform {
private static final String DEFAULT_IMG = "leveltwoblock1.png";
private static final Dimension DEFAULT_SIZE = new Dimension(128, 96);
public LevelTwoBlockOne () {
super(DEFAULT_IMG, DEFAULT_SIZE);
}
}
public static class LevelTwoBlockTwo extends Platform implements IPlatform {
private static final String DEFAULT_IMG = "leveltwoblock2.png";
private static final Dimension DEFAULT_SIZE = new Dimension(96, 32);
public LevelTwoBlockTwo () {
super(DEFAULT_IMG, DEFAULT_SIZE);
}
}
public static class LevelTwoBlockThree extends Platform implements IPlatform {
private static final String DEFAULT_IMG = "leveltwoblock3.png";
private static final Dimension DEFAULT_SIZE = new Dimension(768, 192);
public LevelTwoBlockThree () {
super(DEFAULT_IMG, DEFAULT_SIZE);
}
}
public static class ItemBlock extends Sprite implements IPlatform {
private static final String BLOCK_IMG = "itemBlock.gif";
public ItemBlock () {
super(makePixmap(BLOCK_IMG), DEFAULT_SIZE);
}
}
public static class DoorPortal extends LevelPortal {
private static final String PORTAL_IMG = "door.png";
private static final Dimension PORTAL_SIZE = new Dimension(32, 64);
@Override
public ISpriteView initView () {
return makePixmap(PORTAL_IMG);
}
@Override
public Dimension initSize () {
return PORTAL_SIZE;
}
}
public static class StarPortal extends LevelPortal {
private static final String PORTAL_IMG = "star.png";
private static final Dimension PORTAL_SIZE = new Dimension(32, 32);
@Override
public ISpriteView initView () {
return makePixmap(PORTAL_IMG);
}
@Override
public Dimension initSize () {
return PORTAL_SIZE;
}
}
/**
* TODO - how to enforce implementation of this?
*
* @return
*/
public static String getImagesDirectory () {
return "/vooga/scroller/marioGame/images/";
}
public static Pixmap makePixmap (String fileName) {
return makePixmap(getImagesDirectory(), fileName);
}
public static void addLeftRightAnimationToPlayer (Player player, String baseFileName) {
MovingSpriteAnimationFactory msaf =
new MovingSpriteAnimationFactory(getImagesDirectory(), baseFileName);
Animation<Sprite> playerAnimation = msaf.generateAnimation(player);
player.setView(playerAnimation);
}
}