package vooga.scroller.level_editor; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import javax.swing.ImageIcon; import util.Location; import util.input.Input; import util.input.InputClassTarget; import util.input.InputMethodTarget; import vooga.scroller.util.IGameComponent; import vooga.scroller.level_editor.controllerSuite.LEGrid; import vooga.scroller.level_editor.model.SpriteBox; import vooga.scroller.level_management.LevelPortal; import vooga.scroller.level_management.SpriteManager; import vooga.scroller.scrollingmanager.ScrollingManager; import vooga.scroller.sprites.Sprite; import vooga.scroller.sprites.interfaces.IDoor; import vooga.scroller.sprites.superclasses.Player; import vooga.scroller.util.PlatformerConstants; import vooga.scroller.view.GameView; @InputClassTarget public class Level implements IGameComponent { private Dimension mySize; private Dimension frameOfReferenceSize; private SpriteManager mySpriteManager; private LevelStateManager myStateManager; private ScrollingManager myScrollingManager; private Image myBackground; private Image CITY_BACKGROUND = new ImageIcon("/vooga/scroller/images/background_small.png") .getImage(); private int myID; private IDoor myDoor; private Location myStartPoint; // public Level (int id, ScrollingManager sm) { // this(); // TODO Incomplete. figure out SM constraints... // } private Level () { mySize = PlatformerConstants.DEFAULT_LEVEL_SIZE; myBackground = CITY_BACKGROUND; frameOfReferenceSize = PlatformerConstants.REFERENCE_FRAME_SIZE; // mySprites = new ArrayList<Sprite>(); myStartPoint = new Location(); // initFrames(); } public Level (int id) { this(); myID = id; } // public Level (int id, ScrollingManager sm) { // this(); // TODO Incomplete. figure out SM constraints... // } public Level (int id, ScrollingManager sm) { // MIGHT WANT TO INITIALIZE THIS WITH A PLAYER AS WELL this(); mySpriteManager = new SpriteManager(this); myStateManager = new LevelStateManager(mySpriteManager); myScrollingManager = sm; myID = id; } // public Level (int id, ScrollingManager sm) { // this(); // TODO Incomplete. figure out SM constraints... // } public Level (int id, ScrollingManager sm, LEGrid grid) { this(id, sm); setSize(grid.getPixelSize()); for (SpriteBox box : grid.getBoxes()) { addSprite(box.getSprite()); } if (grid.getBackground() != null) { setBackground(grid.getBackground().getImage()); } } // public Level (int id, ScrollingManager sm) { // this(); // TODO Incomplete. figure out SM constraints... // } public void update (double elapsedTime, Dimension bounds, GameView gameView) { myStateManager.update(elapsedTime, bounds, gameView); } @Override public void paint (Graphics2D pen) { myStateManager.paint(pen); } public int getID () { return myID; } public void setSize (Dimension size) { mySize = size; } /** * Adds a sprite to the level. * * @param s the Sprite to be added */ public void addSprite (Sprite s) { if (StartPoint.class.isAssignableFrom(s.getClass())) { myStartPoint = s.getCenter(); return; } if (LevelPortal.class.isAssignableFrom(s.getClass())) { addDoor((LevelPortal) s); } mySpriteManager.addSprite(s); } public void removeSprite (Sprite s) { mySpriteManager.removeSprite(s); } public void addPlayer (Player p) { mySpriteManager.addPlayer(p); } public void setBackground (Image i) { myBackground = i; } public Image getBackground () { return myBackground; } public ScrollingManager getScrollManager () { return myScrollingManager; } public double getRightBoundary (Dimension frame) { return myScrollingManager.getRightBoundary(frame, getPlayer().getCenter()); } public double getLeftBoundary (Dimension frame) { return myScrollingManager.getLeftBoundary(frame, getPlayer().getCenter()); } public double getUpperBoundary (Dimension frame) { return myScrollingManager.getUpperBoundary(frame, getPlayer().getCenter()); } public double getLowerBoundary (Dimension frame) { return myScrollingManager.getLowerBoundary(frame, getPlayer().getCenter()); } public double getRightBoundary () { return myScrollingManager.getRightBoundary(frameOfReferenceSize, getPlayer().getCenter()); } public double getLeftBoundary () { return myScrollingManager.getLeftBoundary(frameOfReferenceSize, getPlayer().getCenter()); } public double getUpperBoundary () { return myScrollingManager.getUpperBoundary(frameOfReferenceSize, getPlayer().getCenter()); } public double getLowerBoundary () { return myScrollingManager.getLowerBoundary(frameOfReferenceSize, getPlayer().getCenter()); } public Dimension getLevelBounds () { return mySize; } /** * Gives the player currently in the level. Returns null if * player has never been added to the level. * * @return This level's player. */ public Player getPlayer () { return mySpriteManager.getPlayer(); } /** * adds listeners to all level elements that are controllable * * @param myInput input that controls level elements. */ public void addInputListeners (Input myInput) { // TODO: sprite manager? myInput.replaceMappingResourcePath(getPlayer().getInputFilePath()); myInput.addListenerTo(getPlayer()); myInput.addListenerTo(this); } /** * removes listeners from all level elements that are controllable * * @param myInput input that controls level elements. */ public void removeInputListeners (Input myInput) { // TODO: sprite manager? myInput.removeListener(getPlayer()); myInput.removeListener(this); } /** * TODO - define default door or make it clear that door needs to be set. * * @return */ public IDoor getDoor () { return myDoor; } public void addDoor (IDoor door) { myDoor = door; } public void addStartPoint (Location start) { myStartPoint = start; } public Location getStartPoint () { return myStartPoint; } /** * Pauses the current game. */ @InputMethodTarget(name = "pause") public void pauseGame () { if (myStateManager.isActive(LevelStateManager.DEFAULT_ID)) { myStateManager.removeState(LevelStateManager.DEFAULT_ID); myStateManager.addState(LevelStateManager.PAUSED_ID); return; } if (myStateManager.isActive(LevelStateManager.PAUSED_ID)) { myStateManager.addState(LevelStateManager.DEFAULT_ID); myStateManager.removeState(LevelStateManager.PAUSED_ID); return; } } }