package vooga.scroller.model;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.IOException;
import vooga.scroller.level_editor.Level;
import vooga.scroller.level_management.LevelManager;
import vooga.scroller.level_management.splash_page.SplashPage;
import vooga.scroller.scrollingmanager.ScrollingManager;
import vooga.scroller.sprites.superclasses.Player;
import vooga.scroller.util.Renderable;
import vooga.scroller.util.Renderer;
import vooga.scroller.util.mvc.Gaming;
import vooga.scroller.util.mvc.IView;
import vooga.scroller.view.GameView;
/**
* Represents a scrolling platformer.
* *
*
* @author Ross Cahoon
* @author Jay Wang
* @author Scott Valentine
*/
public class Model implements Renderable<Gaming> {
private GameView myView;
private Player myPlayer;
private LevelManager myLevelManager;
private ScrollingManager myScrollingManager;
/**
* Constructs a new Model based on the view and the scrolling manager used by the game.
*
* @param gameView which is used to display/control game.
* @param myScrollingManager used to control in-game scrolling.
* @throws IOException
*/
public Model (GameView gameView,
ScrollingManager sm,
Player player,
SplashPage splashPage,
Level ... levels) {
this(gameView, sm, player);
myLevelManager = initializeLevelManager(splashPage, player, levels);
}
/**
* TODO -...
*
* @param gameView
* @param sm
* @param player
* @param splashPage
* @param levelFileNames
*/
public Model (GameView gameView,
ScrollingManager sm,
Player player,
SplashPage splashPage,
String ... levelFileNames) {
this(gameView, sm, player);
myLevelManager = initializeLevelManager(splashPage, player, levelFileNames);
}
// public Model (GameView gameView, ScrollingManager sm, Level level) {
// this(gameView, sm, initTestPlayer(gameView, sm), level);
// }
private Model (GameView gameView, ScrollingManager sm, Player player) {
myView = gameView;
setScrollingManager(sm);
myPlayer = player;
}
/**
* Add player and begin game
*/
public void start () {
addPlayerToLevel();
}
private void addPlayerToLevel () {
myLevelManager.getCurrentLevel().addPlayer(myPlayer);
}
private LevelManager initializeLevelManager (SplashPage splashPage,
Player player,
Level[] levels) {
return new LevelManager(myScrollingManager, myView, player, splashPage, levels);
}
private LevelManager initializeLevelManager (SplashPage splashPage,
Player player,
String[] levelFileNames) {
return new LevelManager(myScrollingManager, myView, player, splashPage, levelFileNames);
}
private void setScrollingManager (ScrollingManager sm) {
myScrollingManager = sm;
myScrollingManager.initModel(this);
myScrollingManager.initView(myView);
}
/**
* Draw all elements of the game.
*/
public void paint (Graphics2D pen) {
myLevelManager.getCurrentLevel().paint(pen);
}
/**
* Updates all the game elements since the last update.
*
* @param elapsedTime is the elapsed time since the last update.
*/
public void update (double elapsedTime) {
myLevelManager.getCurrentLevel().update(elapsedTime, myView.getSize(), myView);
}
/**
* Gives various boundaries for the current level.
* TODO: can these be consolidated into one function (seems like a lot extra things that aren't
* really associated with the model.
* (we could just return the current level or maybe the bounds of the level(this might be
* dependent on other things) )
*
* @return
*/
public double getRightBoundary () {
return myLevelManager.getCurrentLevel().getRightBoundary();
}
public double getLeftBoundary () {
return myLevelManager.getCurrentLevel().getLeftBoundary();
}
public double getUpperBoundary () {
return myLevelManager.getCurrentLevel().getUpperBoundary();
}
public double getLowerBoundary () {
return myLevelManager.getCurrentLevel().getLowerBoundary();
}
public Dimension getLevelBounds () {
return myLevelManager.getCurrentLevel().getLevelBounds();
}
public Image getBackground () {
return myLevelManager.getCurrentLevel().getBackground();
}
public Player getPlayer () {
return myPlayer;
}
@Override
public Renderer<Gaming> initializeRenderer (IView<?> parent) {
return myView;
}
}