Compare commits

...

19 Commits
main ... ueb04

Author SHA1 Message Date
0nlineSam
55fab7af24 Added pdf 2024-11-19 13:30:13 +01:00
5bb81a4e65
1b: default values, constructor with fewer params 2024-11-19 11:43:30 +01:00
7a9956fb63
1b: add constructor with 3 params 2024-11-19 11:28:47 +01:00
7d3f773365
1b: inline field, make fields final 2024-11-19 10:51:32 +01:00
8cccc03881
1b: rm unused constructor 2024-11-19 10:47:58 +01:00
7c8f81ff1c
1b: inline temporary static fields 2024-11-19 10:47:43 +01:00
d937090e5f
1b: chained constructor with default values 2024-11-19 09:57:10 +01:00
cb6b7513aa
1b: rm duplicate assignment 2024-11-19 09:57:03 +01:00
266283c49c
1b: inline static fields and reuse fields of super class 2024-11-19 09:56:58 +01:00
ab04dc1fd8
1b: inline static fields 2024-11-19 09:56:52 +01:00
5ec9fa6e18
1a: revert move LevelModel to subpackage 2024-11-19 09:56:47 +01:00
f0ad616ae2
1a: encapsulate classes with factory 2024-11-19 09:56:37 +01:00
11ee2dc2ea
rm built files 2024-11-19 09:54:28 +01:00
0nlineSam
d9bcafa8ee ModelConvertHelper singleton pattern -> private constructor 2024-11-17 14:10:26 +01:00
0nlineSam
3dc8f7f10a small fix 2024-11-16 14:50:42 +01:00
0nlineSam
53dc37347c Updated javadoc for createMethods of LevelModel 2024-11-16 14:46:55 +01:00
0nlineSam
c74f2d5056 Merge remote-tracking branch 'origin/ueb04-artem' into ueb04 2024-11-16 14:39:34 +01:00
0nlineSam
ed80b6a94c LevelModel: Replace Multiple Constructors with Creation Methods 2024-11-16 14:38:22 +01:00
Artem Semenovykh
61e87948ab add Singleton in ModelConvertHelper 2024-11-16 13:10:18 +01:00
111 changed files with 344 additions and 669 deletions

2
.idea/misc.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

BIN
Exercise 04.pdf Normal file

Binary file not shown.

View File

@ -1,2 +1,3 @@
/bin/ /bin/
/out/ /out/
/classes/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 832 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 856 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,8 +1,7 @@
package fr.enssat.BoulderDash.controllers; package fr.enssat.BoulderDash.controllers;
import fr.enssat.BoulderDash.models.LevelModel; import fr.enssat.BoulderDash.models.LevelModel;
import fr.enssat.BoulderDash.models.DirtModel; import fr.enssat.BoulderDash.models.displayableElement.DisplayableElementModel;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
import fr.enssat.BoulderDash.helpers.AudioLoadHelper; import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
/** /**
@ -62,7 +61,7 @@ public class BoulderAndDiamondController implements Runnable {
DisplayableElementModel elementModel = this.levelModel.getGroundLevelModel()[x][y]; DisplayableElementModel elementModel = this.levelModel.getGroundLevelModel()[x][y];
if(elementModel == null) { if(elementModel == null) {
elementModel = new DirtModel(); elementModel = DisplayableElementModel.newDirtModel();
} }
String spriteName = elementModel.getSpriteName(); String spriteName = elementModel.getSpriteName();

View File

@ -2,7 +2,6 @@ package fr.enssat.BoulderDash.controllers;
import fr.enssat.BoulderDash.models.LevelModel; import fr.enssat.BoulderDash.models.LevelModel;
import fr.enssat.BoulderDash.helpers.AudioLoadHelper; import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
import fr.enssat.BoulderDash.controllers.NavigationBetweenViewController;
import fr.enssat.BoulderDash.views.MenuView; import fr.enssat.BoulderDash.views.MenuView;
import fr.enssat.BoulderDash.views.GameView; import fr.enssat.BoulderDash.views.GameView;
@ -86,7 +85,7 @@ public class GameController implements ActionListener {
this.gameView.dispose(); this.gameView.dispose();
if(source.equals("restart")){ if(source.equals("restart")){
this.levelModel = new LevelModel(this.navigationBetweenViewController.getPickedLevelIdentifier(), audioLoadHelper); this.levelModel = LevelModel.createGameLevelModel(this.navigationBetweenViewController.getPickedLevelIdentifier(), audioLoadHelper);
this.gameView = new GameView(this, levelModel); this.gameView = new GameView(this, levelModel);
this.gameView.setVisible(true); this.gameView.setVisible(true);
} }

View File

@ -1,9 +1,7 @@
package fr.enssat.BoulderDash.controllers; package fr.enssat.BoulderDash.controllers;
import fr.enssat.BoulderDash.models.DisplayableElementModel; import fr.enssat.BoulderDash.models.displayableElement.DisplayableElementModel;
import fr.enssat.BoulderDash.models.LevelModel; import fr.enssat.BoulderDash.models.LevelModel;
import fr.enssat.BoulderDash.controllers.RockfordUpdateController;
import fr.enssat.BoulderDash.controllers.BoulderAndDiamondController;
import fr.enssat.BoulderDash.helpers.AudioLoadHelper; import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;

View File

@ -9,7 +9,6 @@ import fr.enssat.BoulderDash.helpers.LevelSaveHelper;
import fr.enssat.BoulderDash.models.LevelModel; import fr.enssat.BoulderDash.models.LevelModel;
import fr.enssat.BoulderDash.views.HelpView; import fr.enssat.BoulderDash.views.HelpView;
import fr.enssat.BoulderDash.views.LevelEditorView; import fr.enssat.BoulderDash.views.LevelEditorView;
import fr.enssat.BoulderDash.controllers.NavigationBetweenViewController;
import javax.swing.*; import javax.swing.*;

View File

@ -6,8 +6,6 @@ import java.awt.event.ActionListener;
import fr.enssat.BoulderDash.helpers.AudioLoadHelper; import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
import fr.enssat.BoulderDash.models.LevelModel; import fr.enssat.BoulderDash.models.LevelModel;
import fr.enssat.BoulderDash.views.MenuView; import fr.enssat.BoulderDash.views.MenuView;
import fr.enssat.BoulderDash.controllers.LevelEditorController;
import fr.enssat.BoulderDash.controllers.GameController;
/** /**
* Controller to navigate between the different views * Controller to navigate between the different views
@ -50,7 +48,7 @@ public class NavigationBetweenViewController implements ActionListener {
case "editor": case "editor":
// New blank model for editor // New blank model for editor
this.levelModelForEditor = new LevelModel(audioLoadHelper); this.levelModelForEditor = LevelModel.createEditorLevelModel(audioLoadHelper);
this.levelEditorController = new LevelEditorController(this.levelModelForEditor, this); this.levelEditorController = new LevelEditorController(this.levelModelForEditor, this);
this.levelEditorController.getLevelEditorView().setVisible(true); this.levelEditorController.getLevelEditorView().setVisible(true);
@ -66,7 +64,7 @@ public class NavigationBetweenViewController implements ActionListener {
// Reinit the levelModelForGame... // Reinit the levelModelForGame...
pickedLevelIdentifier = this.menuView.getLevelIdentifier(); pickedLevelIdentifier = this.menuView.getLevelIdentifier();
this.levelModelForGame = new LevelModel(pickedLevelIdentifier, audioLoadHelper); this.levelModelForGame = LevelModel.createGameLevelModel(pickedLevelIdentifier, audioLoadHelper);
this.gameController = new GameController(levelModelForGame, audioLoadHelper, this); this.gameController = new GameController(levelModelForGame, audioLoadHelper, this);
if (levelEditorController != null) { if (levelEditorController != null) {

View File

@ -2,17 +2,8 @@ package fr.enssat.BoulderDash.helpers;
import fr.enssat.BoulderDash.exceptions.UnknownModelException; import fr.enssat.BoulderDash.exceptions.UnknownModelException;
import fr.enssat.BoulderDash.helpers.ModelConvertHelper; import fr.enssat.BoulderDash.models.displayableElement.RockfordModel;
import fr.enssat.BoulderDash.models.ExpandingWallModel; import fr.enssat.BoulderDash.models.displayableElement.DisplayableElementModel;
import fr.enssat.BoulderDash.models.RockfordModel;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
import fr.enssat.BoulderDash.models.EmptyModel;
import fr.enssat.BoulderDash.models.BrickWallModel;
import fr.enssat.BoulderDash.models.BoulderModel;
import fr.enssat.BoulderDash.models.DiamondModel;
import fr.enssat.BoulderDash.models.DirtModel;
import fr.enssat.BoulderDash.models.MagicWallModel;
import fr.enssat.BoulderDash.models.SteelWallModel;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
@ -258,8 +249,8 @@ public class LevelLoadHelper {
* @param lineIndex Position in line (vertical axis) * @param lineIndex Position in line (vertical axis)
*/ */
private DisplayableElementModel constructGridElement(String spriteName, int rowIndex, int lineIndex, boolean convertible) throws UnknownModelException { private DisplayableElementModel constructGridElement(String spriteName, int rowIndex, int lineIndex, boolean convertible) throws UnknownModelException {
ModelConvertHelper modelConvert = new ModelConvertHelper(); ModelConvertHelper modelConvert = ModelConvertHelper.getInstance();
DisplayableElementModel element = modelConvert.toModel(spriteName, convertible); DisplayableElementModel element = modelConvert.toModel(spriteName, convertible);
// Custom actions? // Custom actions?
switch (spriteName) { switch (spriteName) {

View File

@ -3,8 +3,6 @@ package fr.enssat.BoulderDash.helpers;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -17,8 +15,7 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import fr.enssat.BoulderDash.models.DisplayableElementModel; import fr.enssat.BoulderDash.models.displayableElement.DisplayableElementModel;
import fr.enssat.BoulderDash.models.DirtModel;
/** /**
@ -320,13 +317,13 @@ public class LevelSaveHelper {
// Null? // Null?
if(curGridElement == null) { if(curGridElement == null) {
curGridElement = new DirtModel(); curGridElement = DisplayableElementModel.newDirtModel();
} }
// Retrieve current values // Retrieve current values
groupValue = curGridElement.getGroupName(); groupValue = "field";
nameValue = curGridElement.getSpriteName(); nameValue = curGridElement.getSpriteName();
stateValue = curGridElement.getStateValue(); stateValue = "initial";
convertibleValue = curGridElement.isConvertible() ? "1" : "0"; convertibleValue = curGridElement.isConvertible() ? "1" : "0";
// Create sprite XML element // Create sprite XML element

View File

@ -2,34 +2,41 @@ package fr.enssat.BoulderDash.helpers;
import fr.enssat.BoulderDash.exceptions.UnknownModelException; import fr.enssat.BoulderDash.exceptions.UnknownModelException;
import fr.enssat.BoulderDash.models.ExpandingWallModel; import fr.enssat.BoulderDash.models.displayableElement.DisplayableElementModel;
import fr.enssat.BoulderDash.models.RockfordModel;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
import fr.enssat.BoulderDash.models.EmptyModel;
import fr.enssat.BoulderDash.models.BrickWallModel;
import fr.enssat.BoulderDash.models.BoulderModel;
import fr.enssat.BoulderDash.models.DiamondModel;
import fr.enssat.BoulderDash.models.DirtModel;
import fr.enssat.BoulderDash.models.MagicWallModel;
import fr.enssat.BoulderDash.models.SteelWallModel;
/** /**
* ModelConvertHelper * ModelConvertHelper
*
* Provides model conversion services. * Provides model conversion services.
* *
* @author Valerian Saliou <valerian@valeriansaliou.name> * @author Valerian Saliou <valerian@valeriansaliou.name>
* @since 2015-06-22 * @since 2015-06-22
*/ */
public class ModelConvertHelper { public class ModelConvertHelper {
/**
* Holds the single instance of the class.
*/
private static ModelConvertHelper instance = null;
/** /**
* Class constructor * Class constructor
*/ */
public ModelConvertHelper() { private ModelConvertHelper() {
// Nothing done. // Nothing done.
} }
/**
* Gets the single instance of the ModelConvertHelper.
* Creates the instance if it doesn't exist.
*
* @return The single instance of the ModelConvertHelper.
*/
public static synchronized ModelConvertHelper getInstance() {
if (instance == null) {
instance = new ModelConvertHelper();
}
return instance;
}
/** /**
* Gets the model associated to the string * Gets the model associated to the string
* *
@ -43,47 +50,47 @@ public class ModelConvertHelper {
switch (spriteName) { switch (spriteName) {
case "black": case "black":
case "Black": case "Black":
element = new EmptyModel(); element = DisplayableElementModel.newEmptyModel();
break; break;
case "boulder": case "boulder":
case "Boulder": case "Boulder":
element = new BoulderModel(isConvertible); element = DisplayableElementModel.newBoulderModel(isConvertible);
break; break;
case "brickwall": case "brickwall":
case "Brick Wall": case "Brick Wall":
element = new BrickWallModel(); element = DisplayableElementModel.newBrickWallModel();
break; break;
case "diamond": case "diamond":
case "Diamond": case "Diamond":
element = new DiamondModel(); element = DisplayableElementModel.newDiamondModel();
break; break;
case "dirt": case "dirt":
case "Dirt": case "Dirt":
element = new DirtModel(); element = DisplayableElementModel.newDirtModel();
break; break;
case "magicwall": case "magicwall":
case "Magic Wall": case "Magic Wall":
element = new MagicWallModel(); element = DisplayableElementModel.newMagicWallModel();
break; break;
case "rockford": case "rockford":
case "Rockford": case "Rockford":
element = new RockfordModel(); element = DisplayableElementModel.newRockfordModel();
break; break;
case "steelwall": case "steelwall":
case "Steel Wall": case "Steel Wall":
element = new SteelWallModel(); element = DisplayableElementModel.newSteelWallModel();
break; break;
case "expandingwall": case "expandingwall":
case "Expanding Wall": case "Expanding Wall":
element = new ExpandingWallModel(); element = DisplayableElementModel.newExpandingWallModel();
break; break;
default: default:

View File

@ -1,48 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* BoulderModel
*
* Represents the boulders.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class BoulderModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static String collideSound;
/**
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "boulder";
isDestructible = false;
canMove = true;
impactExplosive = false;
animate = true;
priority = 2;
collideSound = "die";
}
/**
* Class constructor
*/
public BoulderModel(boolean convertible) {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, false, collideSound, convertible);
this.loadSprite(spriteName);
}
public BoulderModel() {
this(false);
}
}

View File

@ -1,46 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* BrickWallModel
*
* Represents the brick wall in the game.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class BrickWallModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static boolean falling;
private static String collideSound;
/**
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "brickwall";
isDestructible = true;
canMove = false;
impactExplosive = false;
animate = false;
priority = 3;
falling = false;
collideSound = "touch";
}
/**
* Class constructor
*/
public BrickWallModel() {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, falling, collideSound);
this.loadSprite(spriteName);
}
}

View File

@ -1,47 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* CursorModel
*
* Represents the field cursor pointer.
*
* @author Valerian Saliou <valerian@valeriansaliou.name>
* @since 2015-06-22
*/
public class CursorModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static boolean falling;
private static String collideSound;
/**
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "cursor";
isDestructible = false;
canMove = false;
impactExplosive = false;
animate = false;
priority = 0;
falling = false;
collideSound = null;
}
/**
* Class constructor
*/
public CursorModel() {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, falling, collideSound);
this.loadSprite(spriteName);
}
}

View File

@ -1,47 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* DirtModel
*
* Represents the dirt in the game.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class DirtModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static boolean falling;
private static String collideSound;
/**
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "dirt";
isDestructible = true;
canMove = false;
impactExplosive = false;
animate = false;
priority = 0;
falling = false;
collideSound = null;
}
/**
* Class constructor
*/
public DirtModel() {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, falling, collideSound);
this.loadSprite(spriteName);
}
}

View File

@ -1,47 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* DoorModel
*
* Represents escape door.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class DoorModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static boolean falling;
private static String collideSound;
/**
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "door";
isDestructible = false;
canMove = false;
impactExplosive = false;
animate = false;
priority = 0;
falling = false;
collideSound = null;
}
/**
* Class constructor
*/
public DoorModel() {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, falling, collideSound);
this.loadSprite(spriteName);
}
}

View File

@ -1,47 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* EmptyModel
*
* Represents "nothing".
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class EmptyModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static boolean falling;
private static String collideSound;
/**
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "black";
isDestructible = false;
canMove = false;
impactExplosive = false;
animate = false;
priority = 0;
falling = false;
collideSound = null;
}
/**
* Class constructor
*/
public EmptyModel() {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, falling, collideSound);
this.loadSprite(spriteName);
}
}

View File

@ -1,46 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* ExpandingWallModel
*
* Represents a ExpandingWall in the game.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class ExpandingWallModel extends DisplayableElementModel {
private static String spriteName;
private static boolean destructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static boolean falling;
private static String collideSound;
/*
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "expandingwall";
destructible = false;
canMove = false;
impactExplosive = false;
animate = false;
priority = 10;
falling = false;
collideSound = null;
}
/**
* Class constructor
*/
public ExpandingWallModel() {
super(destructible, canMove, spriteName, priority, impactExplosive, animate, falling, collideSound);
this.loadSprite(spriteName);
}
}

View File

@ -5,16 +5,9 @@ import fr.enssat.BoulderDash.exceptions.UnknownModelException;
import fr.enssat.BoulderDash.helpers.LevelLoadHelper; import fr.enssat.BoulderDash.helpers.LevelLoadHelper;
import fr.enssat.BoulderDash.helpers.AudioLoadHelper; import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
import fr.enssat.BoulderDash.helpers.ModelConvertHelper; import fr.enssat.BoulderDash.helpers.ModelConvertHelper;
import fr.enssat.BoulderDash.models.DisplayableElementModel; import fr.enssat.BoulderDash.models.displayableElement.CursorModel;
import fr.enssat.BoulderDash.models.RockfordModel; import fr.enssat.BoulderDash.models.displayableElement.DisplayableElementModel;
import fr.enssat.BoulderDash.models.GameInformationModel; import fr.enssat.BoulderDash.models.displayableElement.RockfordModel;
import fr.enssat.BoulderDash.models.SteelWallModel;
import fr.enssat.BoulderDash.models.EmptyModel;
import fr.enssat.BoulderDash.models.DiamondModel;
import fr.enssat.BoulderDash.models.DoorModel;
import fr.enssat.BoulderDash.models.DirtModel;
import fr.enssat.BoulderDash.models.ExpandingWallModel;
import fr.enssat.BoulderDash.models.CursorModel;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Observable; import java.util.Observable;
@ -48,6 +41,11 @@ public class LevelModel extends Observable implements Runnable {
private boolean gamePaused; private boolean gamePaused;
// Are we in editor or game mode ? // Are we in editor or game mode ?
private String mode; private String mode;
/**
* Gets the single instance of the ModelConvertHelper.
*/
private ModelConvertHelper modelConverter = ModelConvertHelper.getInstance();
/** /**
* Sprite animation thread * Sprite animation thread
@ -66,7 +64,7 @@ public class LevelModel extends Observable implements Runnable {
* @param audioLoadHelper Audio load helper * @param audioLoadHelper Audio load helper
* @param mode Instance mode * @param mode Instance mode
*/ */
public LevelModel(String levelName, AudioLoadHelper audioLoadHelper, String mode) { private LevelModel(String levelName, AudioLoadHelper audioLoadHelper, String mode) {
this.levelName = levelName; this.levelName = levelName;
this.audioLoadHelper = audioLoadHelper; this.audioLoadHelper = audioLoadHelper;
this.gamePaused = false; this.gamePaused = false;
@ -79,7 +77,7 @@ public class LevelModel extends Observable implements Runnable {
this.sizeWidth = this.levelLoadHelper.getWidthSizeValue(); this.sizeWidth = this.levelLoadHelper.getWidthSizeValue();
this.sizeHeight = this.levelLoadHelper.getHeightSizeValue(); this.sizeHeight = this.levelLoadHelper.getHeightSizeValue();
this.cursorModel = new CursorModel(); this.cursorModel = DisplayableElementModel.newCursorModel();
this.gameInformationModel = new GameInformationModel(this.levelLoadHelper.getDiamondsToCatch()); this.gameInformationModel = new GameInformationModel(this.levelLoadHelper.getDiamondsToCatch());
this.createLimits(); this.createLimits();
@ -90,39 +88,50 @@ public class LevelModel extends Observable implements Runnable {
} }
} }
/**
* Creates LevelModel for existing level
*
* @param levelName Level name
* @param audioLoadHelper Audio load helper
* @param mode Instance mode
*/
public static LevelModel createExistingLevelModel(String levelName, AudioLoadHelper audioLoadHelper, String mode) {
return new LevelModel(levelName, audioLoadHelper, mode);
}
/** /**
* Class constructor * Creates LevelModel (game mode)
* *
* @param levelName Level name * @param levelName Level name
* @param audioLoadHelper Audio load helper * @param audioLoadHelper Audio load helper
*/ */
public LevelModel(String levelName, AudioLoadHelper audioLoadHelper) { public static LevelModel createGameLevelModel(String levelName, AudioLoadHelper audioLoadHelper) {
this(levelName, audioLoadHelper, "game"); return new LevelModel(levelName, audioLoadHelper, "game");
} }
/** /**
* Class constructor (editor mode) * Creates LevelModel (editor mode)
* *
* @param audioLoadHelper Audio load helper * @param audioLoadHelper Audio load helper
*/ */
public LevelModel(AudioLoadHelper audioLoadHelper) { public static LevelModel createEditorLevelModel(AudioLoadHelper audioLoadHelper) {
this.audioLoadHelper = audioLoadHelper; LevelModel levelModel = new LevelModel(null, audioLoadHelper, "editor");
this.gameRunning = false; levelModel.gameRunning = false;
this.mode = "editor";
this.sizeWidth = 25 + 2; levelModel.sizeWidth = 25 + 2;
this.sizeHeight = 25 + 2; levelModel.sizeHeight = 25 + 2;
// Generate dirt // Generate dirt
this.groundGrid = new DisplayableElementModel[this.sizeWidth][this.sizeHeight]; levelModel.groundGrid = new DisplayableElementModel[levelModel.sizeWidth][levelModel.sizeHeight];
for (int x = 0; x < this.sizeWidth; x++) { for (int x = 0; x < levelModel.sizeWidth; x++) {
for (int y = 0; y < this.sizeHeight; y++) { for (int y = 0; y < levelModel.sizeHeight; y++) {
this.groundGrid[x][y] = new DirtModel(); levelModel.groundGrid[x][y] = DisplayableElementModel.newDirtModel();
} }
} }
this.createLimits(); levelModel.createLimits();
return levelModel;
} }
/** /**
@ -150,12 +159,12 @@ public class LevelModel extends Observable implements Runnable {
int maxHeight = this.sizeHeight - 1; int maxHeight = this.sizeHeight - 1;
for (int x = 0; x < this.sizeWidth; x++) { for (int x = 0; x < this.sizeWidth; x++) {
this.groundGrid[x][0] = new SteelWallModel(); this.groundGrid[x][0] = DisplayableElementModel.newSteelWallModel();
this.groundGrid[x][maxHeight] = new SteelWallModel(); this.groundGrid[x][maxHeight] = DisplayableElementModel.newSteelWallModel();
} }
for (int y = 0; y < this.sizeHeight; y++) { for (int y = 0; y < this.sizeHeight; y++) {
this.groundGrid[0][y] = new SteelWallModel(); this.groundGrid[0][y] = DisplayableElementModel.newSteelWallModel();
this.groundGrid[maxWidth][y] = new SteelWallModel(); this.groundGrid[maxWidth][y] = DisplayableElementModel.newSteelWallModel();
} }
} }
@ -248,7 +257,7 @@ public class LevelModel extends Observable implements Runnable {
// Check that we are not out of bound... // Check that we are not out of bound...
if (this.isOutOfBounds(posX, posY) == false) { if (this.isOutOfBounds(posX, posY) == false) {
// Create a new empty model in the old pos of Rockford // Create a new empty model in the old pos of Rockford
this.groundGrid[oldX][oldY] = new EmptyModel(); this.groundGrid[oldX][oldY] = DisplayableElementModel.newEmptyModel();
// Save the x / y pos of Rockford in the levelModel only // Save the x / y pos of Rockford in the levelModel only
this.updateRockfordPosition(posX, posY); this.updateRockfordPosition(posX, posY);
@ -264,7 +273,7 @@ public class LevelModel extends Observable implements Runnable {
private void spawnExit() { private void spawnExit() {
int x = (int) (Math.random() * (this.getSizeHeight() - 2)); int x = (int) (Math.random() * (this.getSizeHeight() - 2));
int y = (int) (Math.random() * (this.getSizeWidth() - 2)); int y = (int) (Math.random() * (this.getSizeWidth() - 2));
this.groundGrid[x + 1][y + 1] = new DoorModel(); this.groundGrid[x + 1][y + 1] = DisplayableElementModel.newDoorModel();
} }
/** /**
@ -283,18 +292,15 @@ public class LevelModel extends Observable implements Runnable {
return; return;
} }
// Grab model value
ModelConvertHelper modelConverter = new ModelConvertHelper();
DisplayableElementModel targetModel;
int xPos, yPos; int xPos, yPos;
xPos = this.getCursorXPosition(); xPos = this.getCursorXPosition();
yPos = this.getCursorYPosition(); yPos = this.getCursorYPosition();
try { try {
targetModel = modelConverter.toModel(blockValue, false); DisplayableElementModel targetModel = modelConverter.toModel(blockValue, false);
// Apply new model in place of cursor // Apply new model in place of cursor
this.groundGrid[xPos + 1][yPos + 1] = targetModel; this.groundGrid[xPos + 1][yPos + 1] = targetModel;
// Disable cursor (important) // Disable cursor (important)
@ -344,7 +350,7 @@ public class LevelModel extends Observable implements Runnable {
DisplayableElementModel elementModel = this.getDisplayableElement(x, y); DisplayableElementModel elementModel = this.getDisplayableElement(x, y);
if(elementModel == null) { if(elementModel == null) {
return new DirtModel().getSprite(); return DisplayableElementModel.newDirtModel().getSprite();
} }
return elementModel.getSprite(); return elementModel.getSprite();
@ -358,7 +364,7 @@ public class LevelModel extends Observable implements Runnable {
public BufferedImage getCursorImage() { public BufferedImage getCursorImage() {
if (this.cursorModel == null) { if (this.cursorModel == null) {
this.cursorModel = new CursorModel(); this.cursorModel = DisplayableElementModel.newCursorModel();
} }
return this.cursorModel.getSprite(); return this.cursorModel.getSprite();
@ -481,7 +487,7 @@ public class LevelModel extends Observable implements Runnable {
*/ */
public void updateSprites(int x, int y) { public void updateSprites(int x, int y) {
if(groundGrid[x][y] == null) { if(groundGrid[x][y] == null) {
groundGrid[x][y] = new DirtModel(); groundGrid[x][y] = DisplayableElementModel.newDirtModel();
} }
groundGrid[x][y].update(System.currentTimeMillis()); groundGrid[x][y].update(System.currentTimeMillis());
@ -650,15 +656,15 @@ public class LevelModel extends Observable implements Runnable {
* @param y Object vertical position * @param y Object vertical position
*/ */
public void exploseGround(int x, int y) { public void exploseGround(int x, int y) {
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x + 1][y] = new EmptyModel(); this.groundGrid[x + 1][y] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x - 1][y] = new EmptyModel(); this.groundGrid[x - 1][y] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x][y + 1] = new EmptyModel(); this.groundGrid[x][y + 1] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x + 1][y + 1] = new EmptyModel(); this.groundGrid[x + 1][y + 1] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x - 1][y + 1] = new EmptyModel(); this.groundGrid[x - 1][y + 1] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x][y - 1] = new EmptyModel(); this.groundGrid[x][y - 1] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x + 1][y - 1] = new EmptyModel(); this.groundGrid[x + 1][y - 1] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x - 1][y - 1] = new EmptyModel(); this.groundGrid[x - 1][y - 1] = DisplayableElementModel.newEmptyModel();
this.rockford.setHasExplosed(true); this.rockford.setHasExplosed(true);
// Again a sleep to notify the observers properly // Again a sleep to notify the observers properly
@ -680,7 +686,7 @@ public class LevelModel extends Observable implements Runnable {
public void makeThisDisplayableElementFall(int x, int y) { public void makeThisDisplayableElementFall(int x, int y) {
this.groundGrid[x][y].setFalling(true); this.groundGrid[x][y].setFalling(true);
this.groundGrid[x][y + 1] = this.groundGrid[x][y]; this.groundGrid[x][y + 1] = this.groundGrid[x][y];
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -692,7 +698,7 @@ public class LevelModel extends Observable implements Runnable {
public void makeThisBoulderSlideLeft(int x, int y) { public void makeThisBoulderSlideLeft(int x, int y) {
this.groundGrid[x][y].setFalling(true); this.groundGrid[x][y].setFalling(true);
this.groundGrid[x - 1][y + 1] = this.groundGrid[x][y]; this.groundGrid[x - 1][y + 1] = this.groundGrid[x][y];
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -704,7 +710,7 @@ public class LevelModel extends Observable implements Runnable {
public void makeThisBoulderSlideRight(int x, int y) { public void makeThisBoulderSlideRight(int x, int y) {
this.groundGrid[x][y].setFalling(true); this.groundGrid[x][y].setFalling(true);
this.groundGrid[x + 1][y + 1] = this.groundGrid[x][y]; this.groundGrid[x + 1][y + 1] = this.groundGrid[x][y];
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -714,8 +720,8 @@ public class LevelModel extends Observable implements Runnable {
* @param y Object vertical position * @param y Object vertical position
*/ */
public void transformThisBoulderIntoADiamond(int x, int y) { public void transformThisBoulderIntoADiamond(int x, int y) {
this.groundGrid[x][y + 2] = new DiamondModel(); this.groundGrid[x][y + 2] = DisplayableElementModel.newDiamondModel();
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -726,7 +732,7 @@ public class LevelModel extends Observable implements Runnable {
*/ */
public void moveThisBoulderToRight(int x, int y) { public void moveThisBoulderToRight(int x, int y) {
this.groundGrid[x + 1][y] = this.groundGrid[x][y]; this.groundGrid[x + 1][y] = this.groundGrid[x][y];
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -737,7 +743,7 @@ public class LevelModel extends Observable implements Runnable {
*/ */
public void moveThisBoulderToLeft(int x, int y) { public void moveThisBoulderToLeft(int x, int y) {
this.groundGrid[x - 1][y] = this.groundGrid[x][y]; this.groundGrid[x - 1][y] = this.groundGrid[x][y];
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -747,7 +753,7 @@ public class LevelModel extends Observable implements Runnable {
* @param y Object vertical position * @param y Object vertical position
*/ */
public void deleteThisBoulder(int x, int y) { public void deleteThisBoulder(int x, int y) {
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -766,8 +772,8 @@ public class LevelModel extends Observable implements Runnable {
* @param y * @param y
*/ */
public void exploseThisBrickWall(int x, int y) { public void exploseThisBrickWall(int x, int y) {
this.groundGrid[x][y] = new EmptyModel(); this.groundGrid[x][y] = DisplayableElementModel.newEmptyModel();
this.groundGrid[x][y + 1] = new EmptyModel(); this.groundGrid[x][y + 1] = DisplayableElementModel.newEmptyModel();
} }
/** /**
@ -777,7 +783,7 @@ public class LevelModel extends Observable implements Runnable {
* @param y * @param y
*/ */
public void expandThisWallToLeft(int x, int y) { public void expandThisWallToLeft(int x, int y) {
this.groundGrid[x - 1][y] = new ExpandingWallModel(); this.groundGrid[x - 1][y] = DisplayableElementModel.newExpandingWallModel();
} }
/** /**
@ -787,7 +793,7 @@ public class LevelModel extends Observable implements Runnable {
* @param y * @param y
*/ */
public void expandThisWallToRight(int x, int y) { public void expandThisWallToRight(int x, int y) {
this.groundGrid[x + 1][y] = new ExpandingWallModel(); this.groundGrid[x + 1][y] = DisplayableElementModel.newExpandingWallModel();
} }
/** /**

View File

@ -1,46 +0,0 @@
package fr.enssat.BoulderDash.models;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/**
* SteelWallModel
*
* Represents the steelWall
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class SteelWallModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static boolean falling;
private static String collideSound;
/**
* Static dataset
* Specifies the physical parameters of the object
*/
static {
spriteName = "steelwall";
isDestructible = false;
canMove = false;
impactExplosive = false;
animate = false;
priority = 3;
falling = false;
collideSound = "touch";
}
/**
* Class constructor
*/
public SteelWallModel() {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, falling, collideSound);
this.loadSprite(spriteName);
}
}

View File

@ -0,0 +1,22 @@
package fr.enssat.BoulderDash.models.displayableElement;
/**
* BoulderModel
*
* Represents the boulders.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class BoulderModel extends DisplayableElementModel {
BoulderModel(boolean convertible) {
super("boulder", false,true);
setPriority(2);
setAnimate(true);
setCollideSound("die");
setConvertibleValue(convertible);
loadSprite("boulder");
}
}

View File

@ -0,0 +1,20 @@
package fr.enssat.BoulderDash.models.displayableElement;
/**
* BrickWallModel
*
* Represents the brick wall in the game.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class BrickWallModel extends DisplayableElementModel {
BrickWallModel() {
super("brickwall", true, false);
setPriority(3);
setCollideSound("touch");
loadSprite("brickwall");
}
}

View File

@ -0,0 +1,17 @@
package fr.enssat.BoulderDash.models.displayableElement;
/**
* CursorModel
*
* Represents the field cursor pointer.
*
* @author Valerian Saliou <valerian@valeriansaliou.name>
* @since 2015-06-22
*/
public class CursorModel extends DisplayableElementModel {
CursorModel() {
super("cursor");
this.loadSprite("cursor");
}
}

View File

@ -1,10 +1,8 @@
package fr.enssat.BoulderDash.models; package fr.enssat.BoulderDash.models.displayableElement;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import fr.enssat.BoulderDash.models.DisplayableElementModel;
/** /**
* DiamondModel * DiamondModel
@ -15,13 +13,6 @@ import fr.enssat.BoulderDash.models.DisplayableElementModel;
* @since 2015-06-19 * @since 2015-06-19
*/ */
public class DiamondModel extends DisplayableElementModel { public class DiamondModel extends DisplayableElementModel {
private static String spriteName;
private static boolean isDestructible;
private static boolean canMove;
private static boolean impactExplosive;
private static boolean animate;
private static int priority;
private static String collideSound;
private long previousTime; private long previousTime;
private int currentFrame; private int currentFrame;
@ -31,30 +22,15 @@ public class DiamondModel extends DisplayableElementModel {
private ArrayList<BufferedImage> framesDiamond; private ArrayList<BufferedImage> framesDiamond;
/** DiamondModel() {
* Static dataset super("diamond", true, true);
* Specifies the physical parameters of the object setAnimate(true);
*/ setCollideSound("coin");
static {
spriteName = "diamond";
isDestructible = true;
canMove = true;
impactExplosive = false;
animate = true;
priority = 0;
collideSound = "coin";
}
/**
* Class constructor
*/
public DiamondModel() {
super(isDestructible, canMove, spriteName, priority, impactExplosive, animate, false, collideSound);
this.initSprites(); this.initSprites();
} }
/** /**
* Updates the sprite (animation loop) * Updates the sprite (animation loop)
* *
* @param time Current time * @param time Current time

View File

@ -0,0 +1,18 @@
package fr.enssat.BoulderDash.models.displayableElement;
/**
* DirtModel
*
* Represents the dirt in the game.
*
* @author Colin Leverger <me@colinleverger.fr>
* @since 2015-06-19
*/
public class DirtModel extends DisplayableElementModel {
DirtModel() {
super("dirt", true, false);
this.loadSprite("dirt");
}
}

Some files were not shown because too many files have changed in this diff Show More