Merge branch 'ueb03-daniel2' into ueb03
# Conflicts: # .idea/misc.xml # src/fr/enssat/BoulderDash/controllers/GameController.java # src/fr/enssat/BoulderDash/controllers/GameKeyController.java # src/fr/enssat/BoulderDash/controllers/LevelEditorController.java # src/fr/enssat/BoulderDash/controllers/LevelEditorKeyController.java
This commit is contained in:
commit
a8dc0b20c7
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@ -3,7 +3,7 @@
|
||||
<component name="PDMPlugin">
|
||||
<option name="skipTestSources" value="false" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/classes" />
|
||||
</component>
|
||||
</project>
|
@ -0,0 +1,87 @@
|
||||
package fr.enssat.BoulderDash.controllers;
|
||||
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.KeyListener;
|
||||
|
||||
public abstract class AbstractKeyController extends AbstractLevelController implements KeyListener {
|
||||
public AbstractKeyController(LevelModel levelModel) {
|
||||
super(levelModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the 'key pressed' event
|
||||
*
|
||||
* @param e Key event
|
||||
*/
|
||||
public void keyPressed(KeyEvent e) {
|
||||
handleKey(e.getKeyCode());
|
||||
additionalSteps();
|
||||
}
|
||||
|
||||
protected void handleKey(final int keyCode) {
|
||||
switch (keyCode) {
|
||||
case KeyEvent.VK_UP:
|
||||
up();
|
||||
break;
|
||||
case KeyEvent.VK_DOWN:
|
||||
down();
|
||||
break;
|
||||
case KeyEvent.VK_LEFT:
|
||||
left();
|
||||
break;
|
||||
case KeyEvent.VK_RIGHT:
|
||||
right();
|
||||
break;
|
||||
case KeyEvent.VK_SPACE:
|
||||
space();
|
||||
break;
|
||||
case KeyEvent.VK_SHIFT:
|
||||
shift();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected void up() {
|
||||
}
|
||||
|
||||
protected void down() {
|
||||
}
|
||||
|
||||
protected void left() {
|
||||
}
|
||||
|
||||
protected void right() {
|
||||
}
|
||||
|
||||
protected void space() {
|
||||
}
|
||||
|
||||
protected void shift() {
|
||||
}
|
||||
|
||||
|
||||
protected void additionalSteps() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the 'key released' event
|
||||
*
|
||||
* @param e Key event
|
||||
*/
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the 'key typed' event
|
||||
*
|
||||
* @param e Key event
|
||||
*/
|
||||
@Override
|
||||
public void keyTyped(KeyEvent e) {
|
||||
// Do nothing.
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package fr.enssat.BoulderDash.controllers;
|
||||
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
|
||||
public abstract class AbstractLevelController {
|
||||
protected LevelModel levelModel;
|
||||
|
||||
public AbstractLevelController(LevelModel levelModel) {
|
||||
this.levelModel = levelModel;
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package fr.enssat.BoulderDash.controllers;
|
||||
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
public abstract class AbstractNavController extends AbstractLevelController implements ActionListener {
|
||||
protected NavigationBetweenViewController nav;
|
||||
|
||||
public AbstractNavController(LevelModel levelModel, NavigationBetweenViewController nav) {
|
||||
super(levelModel);
|
||||
this.nav = nav;
|
||||
}
|
||||
}
|
@ -3,11 +3,12 @@ package fr.enssat.BoulderDash.controllers;
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
import fr.enssat.BoulderDash.models.DirtModel;
|
||||
import fr.enssat.BoulderDash.models.DisplayableElementModel;
|
||||
import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
|
||||
|
||||
import static fr.enssat.BoulderDash.helpers.AudioLoadHelper.AUDIO_LOAD_HELPER;
|
||||
|
||||
/**
|
||||
* ElementPositionUpdateHelper
|
||||
*
|
||||
* <p>
|
||||
* Updates position of all elements displayed on the map, according to their
|
||||
* next potential position. Each object has a weight, which is used to compare
|
||||
* their power to destroy in the food chain. Sorry for that Darwinism.
|
||||
@ -15,9 +16,7 @@ import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
|
||||
* @author Colin Leverger <me@colinleverger.fr>
|
||||
* @since 2015-06-19
|
||||
*/
|
||||
public class BoulderAndDiamondController implements Runnable {
|
||||
private LevelModel levelModel;
|
||||
private AudioLoadHelper audioLoadHelper;
|
||||
public class BoulderAndDiamondController extends AbstractLevelController implements Runnable {
|
||||
private Thread elementMovingThread;
|
||||
|
||||
/**
|
||||
@ -25,9 +24,8 @@ public class BoulderAndDiamondController implements Runnable {
|
||||
*
|
||||
* @param levelModel Level model
|
||||
*/
|
||||
public BoulderAndDiamondController(LevelModel levelModel, AudioLoadHelper audioLoadHelper) {
|
||||
this.levelModel = levelModel;
|
||||
this.audioLoadHelper = audioLoadHelper;
|
||||
public BoulderAndDiamondController(LevelModel levelModel) {
|
||||
super(levelModel);
|
||||
|
||||
// Start thread
|
||||
this.elementMovingThread = new Thread(this);
|
||||
@ -39,7 +37,7 @@ public class BoulderAndDiamondController implements Runnable {
|
||||
*/
|
||||
public void run() {
|
||||
while (this.levelModel.isGameRunning()) {
|
||||
if(!this.levelModel.getGamePaused()){
|
||||
if (!this.levelModel.getGamePaused()) {
|
||||
this.manageFallingObject();
|
||||
}
|
||||
try {
|
||||
@ -61,7 +59,7 @@ public class BoulderAndDiamondController implements Runnable {
|
||||
// Gets the spriteName of actual DisplayableElementModel object scanned
|
||||
DisplayableElementModel elementModel = this.levelModel.getGroundLevelModel()[x][y];
|
||||
|
||||
if(elementModel == null) {
|
||||
if (elementModel == null) {
|
||||
elementModel = new DirtModel();
|
||||
}
|
||||
|
||||
@ -70,8 +68,8 @@ public class BoulderAndDiamondController implements Runnable {
|
||||
// If it is a boulder or a diamond...
|
||||
if (spriteName == "boulder" || spriteName == "diamond") {
|
||||
this.manageFall(x, y);
|
||||
} else if(spriteName == "expandingwall"){
|
||||
if(this.expandWall(x,y).equals("left")){
|
||||
} else if (spriteName == "expandingwall") {
|
||||
if (this.expandWall(x, y).equals("left")) {
|
||||
x -= 1;
|
||||
}
|
||||
}
|
||||
@ -92,12 +90,12 @@ public class BoulderAndDiamondController implements Runnable {
|
||||
String spriteNameRight = elementRight.getSpriteName();
|
||||
|
||||
String way = "";
|
||||
if(spriteNameLeft == "black"){
|
||||
this.levelModel.expandThisWallToLeft(x,y);
|
||||
if (spriteNameLeft == "black") {
|
||||
this.levelModel.expandThisWallToLeft(x, y);
|
||||
way = "left";
|
||||
}
|
||||
if(spriteNameRight == "black"){
|
||||
this.levelModel.expandThisWallToRight(x,y);
|
||||
if (spriteNameRight == "black") {
|
||||
this.levelModel.expandThisWallToRight(x, y);
|
||||
way = "right";
|
||||
}
|
||||
return way;
|
||||
@ -132,7 +130,7 @@ public class BoulderAndDiamondController implements Runnable {
|
||||
} else if (spriteNameBelow == "rockford" && this.levelModel.getGroundLevelModel()[x][y].isFalling()) {
|
||||
this.levelModel.exploseGround(x, y + 1);
|
||||
|
||||
this.audioLoadHelper.playSound("die");
|
||||
AUDIO_LOAD_HELPER.playSound("die");
|
||||
|
||||
try {
|
||||
Thread.sleep(25);
|
||||
@ -143,9 +141,9 @@ public class BoulderAndDiamondController implements Runnable {
|
||||
this.levelModel.setGameRunning(false);
|
||||
} else if (spriteNameBelow == "magicwall") {
|
||||
if (this.levelModel.getGroundLevelModel()[x][y].getSpriteName() == "boulder"
|
||||
&& (this.levelModel.getGroundLevelModel()[x][y+2].getSpriteName() == "dirt" ||
|
||||
this.levelModel.getGroundLevelModel()[x][y+2].getSpriteName() == "black")) {
|
||||
if(this.levelModel.getGroundLevelModel()[x][y].isConvertible()) {
|
||||
&& (this.levelModel.getGroundLevelModel()[x][y + 2].getSpriteName() == "dirt" ||
|
||||
this.levelModel.getGroundLevelModel()[x][y + 2].getSpriteName() == "black")) {
|
||||
if (this.levelModel.getGroundLevelModel()[x][y].isConvertible()) {
|
||||
this.levelModel.transformThisBoulderIntoADiamond(x, y);
|
||||
} else {
|
||||
this.levelModel.deleteThisBoulder(x, y);
|
||||
|
@ -1,24 +1,24 @@
|
||||
package fr.enssat.BoulderDash.controllers;
|
||||
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
|
||||
import fr.enssat.BoulderDash.views.MenuView;
|
||||
import fr.enssat.BoulderDash.views.GameView;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
|
||||
import static fr.enssat.BoulderDash.helpers.AudioLoadHelper.AUDIO_LOAD_HELPER;
|
||||
|
||||
|
||||
/**
|
||||
* GameController
|
||||
*
|
||||
* <p>
|
||||
* This system creates the view.
|
||||
* The game loop is also handled there.
|
||||
*
|
||||
* @author Colin Leverger <me@colinleverger.fr>
|
||||
* @since 2015-06-19
|
||||
*/
|
||||
public class GameController extends GameModuleController {
|
||||
private AudioLoadHelper audioLoadHelper;
|
||||
public class GameController extends AbstractNavController {
|
||||
private boolean firstClickOnPause;
|
||||
private MenuView menuView;
|
||||
private GameView gameView;
|
||||
@ -27,18 +27,18 @@ public class GameController extends GameModuleController {
|
||||
* Class constructor
|
||||
*
|
||||
* @param levelModel Level model
|
||||
* @param navigationBetweenViewController
|
||||
* @param nav
|
||||
*/
|
||||
public GameController(LevelModel levelModel, AudioLoadHelper audioLoadHelper, NavigationBetweenViewController navigationBetweenViewController) {
|
||||
super(levelModel, navigationBetweenViewController);
|
||||
public GameController(LevelModel levelModel, NavigationBetweenViewController nav) {
|
||||
super(levelModel, nav);
|
||||
|
||||
this.firstClickOnPause = true;
|
||||
|
||||
this.audioLoadHelper = audioLoadHelper;
|
||||
this.gameView = new GameView(this, levelModel);
|
||||
this.menuView = navigationBetweenViewController.getMenuView();
|
||||
this.menuView = nav.getMenuView();
|
||||
|
||||
this.getAudioLoadHelper().stopMusic();
|
||||
this.getAudioLoadHelper().playSound("new");
|
||||
AUDIO_LOAD_HELPER.stopMusic();
|
||||
AUDIO_LOAD_HELPER.playSound("new");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -46,12 +46,14 @@ public class GameController extends GameModuleController {
|
||||
*
|
||||
* @param event Action event
|
||||
*/
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
switch(event.getActionCommand()) {
|
||||
switch (event.getActionCommand()) {
|
||||
case "pause":
|
||||
LevelModel levelModel = getLevelModel();
|
||||
levelModel.setGamePaused(this.firstClickOnPause);
|
||||
if (this.firstClickOnPause) {
|
||||
this.levelModel.setGamePaused(true);
|
||||
} else if (!this.firstClickOnPause) {
|
||||
this.levelModel.setGamePaused(false);
|
||||
}
|
||||
|
||||
this.firstClickOnPause = !this.firstClickOnPause;
|
||||
this.gameView.getGameFieldView().grabFocus();
|
||||
@ -59,13 +61,13 @@ public class GameController extends GameModuleController {
|
||||
|
||||
case "restart":
|
||||
this.resetGame("restart");
|
||||
this.getAudioLoadHelper().playSound("new");
|
||||
AUDIO_LOAD_HELPER.playSound("new");
|
||||
this.gameView.getGameFieldView().grabFocus();
|
||||
break;
|
||||
|
||||
case "menu":
|
||||
this.menuView.setVisible(true);
|
||||
this.getAudioLoadHelper().startMusic("game");
|
||||
AUDIO_LOAD_HELPER.startMusic("game");
|
||||
this.resetGame("menu");
|
||||
break;
|
||||
}
|
||||
@ -77,36 +79,25 @@ public class GameController extends GameModuleController {
|
||||
private void resetGame(String source) {
|
||||
this.gameView.dispose();
|
||||
|
||||
if(source.equals("restart")){
|
||||
resetLevelModel(this.audioLoadHelper);
|
||||
LevelModel levelModel = getLevelModel();
|
||||
if (source.equals("restart")) {
|
||||
this.levelModel = new LevelModel(this.nav.getPickedLevelIdentifier());
|
||||
this.gameView = new GameView(this, levelModel);
|
||||
this.gameView.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the audio load helper instance
|
||||
*
|
||||
* @return Audio load helper instance
|
||||
*/
|
||||
public AudioLoadHelper getAudioLoadHelper() {
|
||||
return this.audioLoadHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the game view
|
||||
*
|
||||
* @return gameView
|
||||
*/
|
||||
public GameView getGameView() {
|
||||
return gameView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the gameView
|
||||
* @param gameView
|
||||
*/
|
||||
public void setGameView(GameView gameView) {
|
||||
this.gameView = gameView;
|
||||
}
|
||||
// dead code
|
||||
//
|
||||
//public void setGameView(GameView gameView) {
|
||||
// this.gameView = gameView;
|
||||
//}
|
||||
}
|
@ -2,92 +2,79 @@ package fr.enssat.BoulderDash.controllers;
|
||||
|
||||
import fr.enssat.BoulderDash.models.DisplayableElementModel;
|
||||
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 java.awt.event.KeyEvent;
|
||||
|
||||
|
||||
/**
|
||||
* GameKeyController
|
||||
*
|
||||
* <p>
|
||||
* Manages the key events controller.
|
||||
*
|
||||
* @author Colin Leverger <me@colinleverger.fr>
|
||||
* @since 2015-06-19
|
||||
*/
|
||||
public class GameKeyController extends KeyController {
|
||||
public class GameKeyController extends AbstractKeyController {
|
||||
private RockfordUpdateController updatePosRockford;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param levelModel Level model
|
||||
*/
|
||||
public GameKeyController(LevelModel levelModel, AudioLoadHelper audioLoadHelper) {
|
||||
public GameKeyController(LevelModel levelModel) {
|
||||
super(levelModel);
|
||||
new BoulderAndDiamondController(levelModel, audioLoadHelper);
|
||||
new BoulderAndDiamondController(levelModel);
|
||||
this.updatePosRockford = new RockfordUpdateController(levelModel);
|
||||
}
|
||||
|
||||
public void keyPressed(KeyEvent e) {
|
||||
int keyCode = e.getKeyCode();
|
||||
LevelModel levelModel = getLevelModel();
|
||||
|
||||
switch (keyCode) {
|
||||
// Direction: UP
|
||||
case KeyEvent.VK_UP:
|
||||
@Override
|
||||
protected void up() {
|
||||
DisplayableElementModel upElement = levelModel.getGroundLevelModel()[levelModel.getRockfordPositionX()][levelModel.getRockfordPositionY() - 1];
|
||||
|
||||
if (upElement.getPriority() < levelModel.getRockford().getPriority()) {
|
||||
this.updatePosRockford.moveRockford(levelModel.getRockfordPositionX(), levelModel.getRockfordPositionY() - 1);
|
||||
levelModel.getRockford().startRunningUp();
|
||||
this.levelModel.getRockford().startRunningUp();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
// Direction: DOWN
|
||||
case KeyEvent.VK_DOWN:
|
||||
@Override
|
||||
protected void down() {
|
||||
DisplayableElementModel downElement = levelModel.getGroundLevelModel()[levelModel.getRockfordPositionX()][levelModel.getRockfordPositionY() + 1];
|
||||
|
||||
if (downElement.getPriority() < levelModel.getRockford().getPriority()) {
|
||||
this.updatePosRockford.moveRockford(levelModel.getRockfordPositionX(), levelModel.getRockfordPositionY() + 1);
|
||||
levelModel.getRockford().startRunningDown();
|
||||
this.levelModel.getRockford().startRunningDown();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
// Direction: LEFT
|
||||
case KeyEvent.VK_LEFT:
|
||||
@Override
|
||||
protected void left() {
|
||||
DisplayableElementModel leftElement = levelModel.getGroundLevelModel()[levelModel.getRockfordPositionX() - 1][levelModel.getRockfordPositionY()];
|
||||
|
||||
if (leftElement.getPriority() < levelModel.getRockford().getPriority()) {
|
||||
this.updatePosRockford.moveRockford(levelModel.getRockfordPositionX() - 1, levelModel.getRockfordPositionY());
|
||||
levelModel.getRockford().startRunningLeft();
|
||||
this.levelModel.getRockford().startRunningLeft();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
// Direction: RIGHT
|
||||
case KeyEvent.VK_RIGHT:
|
||||
@Override
|
||||
protected void right() {
|
||||
DisplayableElementModel rightElement = levelModel.getGroundLevelModel()[levelModel.getRockfordPositionX() + 1][levelModel.getRockfordPositionY()];
|
||||
|
||||
if (rightElement.getPriority() < levelModel.getRockford().getPriority()) {
|
||||
this.updatePosRockford.moveRockford(levelModel.getRockfordPositionX() + 1, levelModel.getRockfordPositionY());
|
||||
levelModel.getRockford().startRunningRight();
|
||||
}
|
||||
|
||||
break;
|
||||
this.levelModel.getRockford().startRunningRight();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the 'key released' event
|
||||
*
|
||||
* @param e Key event
|
||||
*/
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
getLevelModel().getRockford().startStaying();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyTyped(KeyEvent e) {
|
||||
// Do nothing.
|
||||
this.levelModel.getRockford().startStaying();
|
||||
}
|
||||
}
|
||||
|
@ -8,36 +8,37 @@ import fr.enssat.BoulderDash.helpers.LevelSaveHelper;
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
import fr.enssat.BoulderDash.views.HelpView;
|
||||
import fr.enssat.BoulderDash.views.LevelEditorView;
|
||||
import fr.enssat.BoulderDash.controllers.NavigationBetweenViewController;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import static fr.enssat.BoulderDash.helpers.AudioLoadHelper.AUDIO_LOAD_HELPER;
|
||||
|
||||
/**
|
||||
* LevelEditorController
|
||||
*
|
||||
* <p>
|
||||
* Manages the level editor controller.
|
||||
*
|
||||
* @author Valerian Saliou <valerian@valeriansaliou.name>
|
||||
* @since 2015-06-19
|
||||
*/
|
||||
public class LevelEditorController extends GameModuleController {
|
||||
public class LevelEditorController extends AbstractNavController {
|
||||
private LevelEditorView levelEditorView;
|
||||
|
||||
/**
|
||||
* Class constructor'
|
||||
* Class constructor
|
||||
*
|
||||
* @param levelModel Level model
|
||||
*/
|
||||
public LevelEditorController(LevelModel levelModel, NavigationBetweenViewController nav) {
|
||||
super(levelModel, nav);
|
||||
levelModel.setShowCursor(true);
|
||||
this.levelModel.setShowCursor(true);
|
||||
|
||||
nav.getAudioLoadHelper().stopMusic();
|
||||
AUDIO_LOAD_HELPER.stopMusic();
|
||||
|
||||
this.levelEditorView = new LevelEditorView(this, levelModel, nav);
|
||||
|
||||
// Pre-bind event watcher (hack to fix a Java issue)
|
||||
levelModel.decrementCursorXPosition();
|
||||
this.levelModel.decrementCursorXPosition();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -45,27 +46,25 @@ public class LevelEditorController extends GameModuleController {
|
||||
*
|
||||
* @param event Action event
|
||||
*/
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
switch(event.getActionCommand()) {
|
||||
switch (event.getActionCommand()) {
|
||||
case "menu":
|
||||
this.levelEditorView.setVisible(false);
|
||||
super.menuActionPerformed();
|
||||
this.nav.setMenuView();
|
||||
AUDIO_LOAD_HELPER.startMusic("game");
|
||||
|
||||
break;
|
||||
|
||||
case "save":
|
||||
LevelModel levelModel = getLevelModel();
|
||||
|
||||
// Check constraints
|
||||
try {
|
||||
levelModel.checkConstraints();
|
||||
this.levelModel.checkConstraints();
|
||||
|
||||
// Save action (direct save)
|
||||
String levelId = this.levelEditorView.getSelectedLevel();
|
||||
LevelSaveHelper levelSave;
|
||||
|
||||
if(levelId == null || levelId.isEmpty()) {
|
||||
if (levelId == null || levelId.isEmpty()) {
|
||||
// Create a new level
|
||||
levelSave = new LevelSaveHelper(levelModel.getGroundLevelModel());
|
||||
} else {
|
||||
@ -77,7 +76,7 @@ public class LevelEditorController extends GameModuleController {
|
||||
JOptionPane.showMessageDialog(frameDialog, "Level saved");
|
||||
|
||||
this.levelEditorView.openedLevelChange(levelSave.getLevelId());
|
||||
} catch(LevelConstraintNotRespectedException e) {
|
||||
} catch (LevelConstraintNotRespectedException e) {
|
||||
JFrame frameDialog = new JFrame("Error");
|
||||
JOptionPane.showMessageDialog(frameDialog, e.getMessage());
|
||||
}
|
||||
@ -88,7 +87,7 @@ public class LevelEditorController extends GameModuleController {
|
||||
String levelId = this.levelEditorView.getSelectedLevel();
|
||||
JFrame frameDialog = new JFrame("Info");
|
||||
|
||||
if(levelId == null || levelId.isEmpty()) {
|
||||
if (levelId == null || levelId.isEmpty()) {
|
||||
JOptionPane.showMessageDialog(frameDialog, "Level not yet saved, no need to delete it!");
|
||||
} else {
|
||||
new LevelRemoveHelper(levelId);
|
||||
@ -119,14 +118,17 @@ public class LevelEditorController extends GameModuleController {
|
||||
return levelEditorView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the level editor view
|
||||
*
|
||||
* @param levelEditorView Level editor view
|
||||
*/
|
||||
public void setLevelEditorView(LevelEditorView levelEditorView) {
|
||||
this.levelEditorView = levelEditorView;
|
||||
}
|
||||
// dead code
|
||||
//
|
||||
//public LevelModel getLevelModel() {
|
||||
// return this.levelModel;
|
||||
//}
|
||||
|
||||
// dead code
|
||||
//
|
||||
//public void setLevelEditorView(LevelEditorView levelEditorView) {
|
||||
// this.levelEditorView = levelEditorView;
|
||||
//}
|
||||
|
||||
|
||||
}
|
@ -3,18 +3,16 @@ package fr.enssat.BoulderDash.controllers;
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
import fr.enssat.BoulderDash.views.LevelEditorView;
|
||||
|
||||
import java.awt.event.KeyEvent;
|
||||
|
||||
|
||||
/**
|
||||
* LevelEditorKeyController
|
||||
*
|
||||
* <p>
|
||||
* Manages the key events controller.
|
||||
*
|
||||
* @author Valerian Saliou <valerian@valeriansaliou.name>
|
||||
* @since 2015-06-21
|
||||
*/
|
||||
public class LevelEditorKeyController extends KeyController {
|
||||
public class LevelEditorKeyController extends AbstractKeyController {
|
||||
private LevelEditorView levelEditorView;
|
||||
private boolean capLocks;
|
||||
|
||||
@ -31,54 +29,41 @@ public class LevelEditorKeyController extends KeyController {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
int keyCode = e.getKeyCode();
|
||||
LevelModel levelModel = getLevelModel();
|
||||
|
||||
switch (keyCode) {
|
||||
// Direction: UP
|
||||
case KeyEvent.VK_UP:
|
||||
levelModel.decrementCursorYPosition();
|
||||
break;
|
||||
|
||||
// Direction: DOWN
|
||||
case KeyEvent.VK_DOWN:
|
||||
levelModel.incrementCursorYPosition();
|
||||
break;
|
||||
|
||||
// Direction: LEFT
|
||||
case KeyEvent.VK_LEFT:
|
||||
levelModel.decrementCursorXPosition();
|
||||
break;
|
||||
|
||||
// Direction: RIGHT
|
||||
case KeyEvent.VK_RIGHT:
|
||||
levelModel.incrementCursorXPosition();
|
||||
break;
|
||||
|
||||
// Key: SPACE
|
||||
case KeyEvent.VK_SPACE:
|
||||
levelModel.triggerBlockChange(this.levelEditorView.getPickedBlockValue());
|
||||
break;
|
||||
|
||||
case 16:
|
||||
this.capLocks = !capLocks;
|
||||
break;
|
||||
}
|
||||
|
||||
protected void additionalSteps() {
|
||||
// Hold block change (quick edit)
|
||||
if(capLocks) {
|
||||
levelModel.triggerBlockChange(this.levelEditorView.getPickedBlockValue());
|
||||
if (capLocks) {
|
||||
this.levelModel.triggerBlockChange(this.levelEditorView.getPickedBlockValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
// Do nothing.
|
||||
protected void up() {
|
||||
this.levelModel.decrementCursorYPosition();
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyTyped(KeyEvent e) {
|
||||
// Do nothing.
|
||||
protected void down() {
|
||||
this.levelModel.incrementCursorYPosition();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void left() {
|
||||
this.levelModel.decrementCursorXPosition();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void right() {
|
||||
this.levelModel.incrementCursorXPosition();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void space() {
|
||||
this.levelModel.triggerBlockChange(this.levelEditorView.getPickedBlockValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void shift() {
|
||||
this.capLocks = !capLocks;
|
||||
}
|
||||
}
|
||||
|
@ -3,23 +3,19 @@ package fr.enssat.BoulderDash.controllers;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
|
||||
import fr.enssat.BoulderDash.models.LevelModel;
|
||||
import fr.enssat.BoulderDash.views.MenuView;
|
||||
import fr.enssat.BoulderDash.controllers.LevelEditorController;
|
||||
import fr.enssat.BoulderDash.controllers.GameController;
|
||||
|
||||
import static fr.enssat.BoulderDash.helpers.AudioLoadHelper.AUDIO_LOAD_HELPER;
|
||||
|
||||
/**
|
||||
* Controller to navigate between the different views
|
||||
*
|
||||
* @author Colin Leverger <me@colinleverger.fr>
|
||||
*
|
||||
*/
|
||||
public class NavigationBetweenViewController implements ActionListener {
|
||||
private LevelEditorController levelEditorController;
|
||||
private MenuView menuView;
|
||||
private AudioLoadHelper audioLoadHelper;
|
||||
private LevelModel levelModelForGame, levelModelForEditor;
|
||||
private GameController gameController;
|
||||
private String pickedLevelIdentifier;
|
||||
|
||||
@ -27,10 +23,8 @@ public class NavigationBetweenViewController implements ActionListener {
|
||||
* Class constructor
|
||||
*/
|
||||
public NavigationBetweenViewController() {
|
||||
this.audioLoadHelper = new AudioLoadHelper();
|
||||
|
||||
// Play game music
|
||||
this.getAudioLoadHelper().startMusic("game");
|
||||
AUDIO_LOAD_HELPER.startMusic("game");
|
||||
|
||||
// Creation of the first view
|
||||
this.menuView = new MenuView(this);
|
||||
@ -50,8 +44,8 @@ public class NavigationBetweenViewController implements ActionListener {
|
||||
|
||||
case "editor":
|
||||
// New blank model for editor
|
||||
this.levelModelForEditor = new LevelModel(audioLoadHelper);
|
||||
this.levelEditorController = new LevelEditorController(this.levelModelForEditor, this);
|
||||
LevelModel levelModelForEditor = new LevelModel();
|
||||
this.levelEditorController = new LevelEditorController(levelModelForEditor, this);
|
||||
|
||||
this.levelEditorController.getLevelEditorView().setVisible(true);
|
||||
this.levelEditorController.getLevelEditorView().getLevelEditorGroundView().grabFocus();
|
||||
@ -66,8 +60,8 @@ public class NavigationBetweenViewController implements ActionListener {
|
||||
// Reinit the levelModelForGame...
|
||||
pickedLevelIdentifier = this.menuView.getLevelIdentifier();
|
||||
|
||||
this.levelModelForGame = new LevelModel(pickedLevelIdentifier, audioLoadHelper);
|
||||
this.gameController = new GameController(levelModelForGame, audioLoadHelper, this);
|
||||
LevelModel levelModelForGame = new LevelModel(pickedLevelIdentifier);
|
||||
this.gameController = new GameController(levelModelForGame, this);
|
||||
|
||||
if (levelEditorController != null) {
|
||||
this.levelEditorController.getLevelEditorView().setVisible(false);
|
||||
@ -82,15 +76,6 @@ public class NavigationBetweenViewController implements ActionListener {
|
||||
this.menuView.setVisible(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the audio load helper
|
||||
*
|
||||
* @return Audio load helper
|
||||
*/
|
||||
public AudioLoadHelper getAudioLoadHelper() {
|
||||
return this.audioLoadHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the first view
|
||||
*
|
||||
@ -102,8 +87,6 @@ public class NavigationBetweenViewController implements ActionListener {
|
||||
|
||||
/**
|
||||
* Set the first view
|
||||
*
|
||||
* @param menuView
|
||||
*/
|
||||
public MenuView setMenuView() {
|
||||
this.menuView = new MenuView(this);
|
||||
@ -119,14 +102,11 @@ public class NavigationBetweenViewController implements ActionListener {
|
||||
return pickedLevelIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the pickedLevelIdentifier
|
||||
*
|
||||
* @param pickedLevelIdentifier Picked level identifier
|
||||
*/
|
||||
public void setPickedLevelIdentifier(String pickedLevelIdentifier) {
|
||||
this.pickedLevelIdentifier = pickedLevelIdentifier;
|
||||
}
|
||||
// dead code
|
||||
//
|
||||
//public void setPickedLevelIdentifier(String pickedLevelIdentifier) {
|
||||
// this.pickedLevelIdentifier = pickedLevelIdentifier;
|
||||
//}
|
||||
|
||||
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ import fr.enssat.BoulderDash.models.LevelModel;
|
||||
|
||||
/**
|
||||
* ElementPositionUpdateHelper
|
||||
*
|
||||
* <p>
|
||||
* Updates position of all elements displayed on the map, according to their
|
||||
* next potential position. Each object has a weight, which is used to compare
|
||||
* their power to destroy in the food chain. Sorry for that Darwinism.
|
||||
@ -12,8 +12,7 @@ import fr.enssat.BoulderDash.models.LevelModel;
|
||||
* @author Colin Leverger <me@colinleverger.fr>
|
||||
* @since 2015-06-19
|
||||
*/
|
||||
public class RockfordUpdateController implements Runnable {
|
||||
private LevelModel levelModel;
|
||||
public class RockfordUpdateController extends AbstractLevelController implements Runnable {
|
||||
private Thread elementMovingThread;
|
||||
private int rockfordPositionX;
|
||||
private int rockfordPositionY;
|
||||
@ -25,7 +24,7 @@ public class RockfordUpdateController implements Runnable {
|
||||
* @param levelModel Level model
|
||||
*/
|
||||
public RockfordUpdateController(LevelModel levelModel) {
|
||||
this.levelModel = levelModel;
|
||||
super(levelModel);
|
||||
this.elementMovingThread = new Thread(this);
|
||||
this.elementMovingThread.start();
|
||||
this.rockfordHasMoved = false;
|
||||
@ -36,7 +35,7 @@ public class RockfordUpdateController implements Runnable {
|
||||
*/
|
||||
public void run() {
|
||||
while (this.levelModel.isGameRunning()) {
|
||||
if(!this.levelModel.getGamePaused()){
|
||||
if (!this.levelModel.getGamePaused()) {
|
||||
if (this.rockfordHasMoved) {
|
||||
this.levelModel.setPositionOfRockford(rockfordPositionX, rockfordPositionY);
|
||||
this.rockfordHasMoved = false;
|
||||
|
@ -8,14 +8,18 @@ import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* AudioLoadHelper
|
||||
*
|
||||
* <p>
|
||||
* Manages audio
|
||||
*
|
||||
* @author Valerian Saliou <valerian@valeriansaliou.name>
|
||||
* @since 2015-06-19
|
||||
*/
|
||||
public class AudioLoadHelper {
|
||||
private static String pathToAudioStore = "./res/audio";
|
||||
private static final String pathToAudioStore = "./res/audio";
|
||||
/**
|
||||
* Singleton
|
||||
*/
|
||||
public static final AudioLoadHelper AUDIO_LOAD_HELPER = new AudioLoadHelper();
|
||||
|
||||
private SoundJLayerBridge musicToPlay;
|
||||
private HashMap<String, SoundJLayerBridge> preloadedSounds;
|
||||
|
@ -3,26 +3,17 @@ package fr.enssat.BoulderDash.models;
|
||||
import fr.enssat.BoulderDash.exceptions.LevelConstraintNotRespectedException;
|
||||
import fr.enssat.BoulderDash.exceptions.UnknownModelException;
|
||||
import fr.enssat.BoulderDash.helpers.LevelLoadHelper;
|
||||
import fr.enssat.BoulderDash.helpers.AudioLoadHelper;
|
||||
import fr.enssat.BoulderDash.helpers.ModelConvertHelper;
|
||||
import fr.enssat.BoulderDash.models.DisplayableElementModel;
|
||||
import fr.enssat.BoulderDash.models.RockfordModel;
|
||||
import fr.enssat.BoulderDash.models.GameInformationModel;
|
||||
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.util.Observable;
|
||||
|
||||
import static fr.enssat.BoulderDash.helpers.AudioLoadHelper.AUDIO_LOAD_HELPER;
|
||||
|
||||
|
||||
/**
|
||||
* LevelModel
|
||||
*
|
||||
* <p>
|
||||
* Levels are loaded from XML file. The view knows the model, the controller is
|
||||
* going to modify the model in function of the game panel. The model notifies
|
||||
* the view when there are changes on it.
|
||||
@ -33,7 +24,6 @@ import java.util.Observable;
|
||||
public class LevelModel extends Observable implements Runnable {
|
||||
private DisplayableElementModel[][] groundGrid;
|
||||
private String levelName;
|
||||
private AudioLoadHelper audioLoadHelper;
|
||||
private int sizeWidth = 0;
|
||||
private int sizeHeight = 0;
|
||||
private int cursorXPosition = 0;
|
||||
@ -63,12 +53,10 @@ public class LevelModel extends Observable implements Runnable {
|
||||
* Class constructor
|
||||
*
|
||||
* @param levelName Level name
|
||||
* @param audioLoadHelper Audio load helper
|
||||
* @param mode Instance mode
|
||||
*/
|
||||
public LevelModel(String levelName, AudioLoadHelper audioLoadHelper, String mode) {
|
||||
public LevelModel(String levelName, String mode) {
|
||||
this.levelName = levelName;
|
||||
this.audioLoadHelper = audioLoadHelper;
|
||||
this.gamePaused = false;
|
||||
this.gameRunning = true;
|
||||
this.mode = mode;
|
||||
@ -84,7 +72,7 @@ public class LevelModel extends Observable implements Runnable {
|
||||
|
||||
this.createLimits();
|
||||
|
||||
if(this.mode.equals("game")) {
|
||||
if (this.mode.equals("game")) {
|
||||
this.initRockford();
|
||||
this.initThreadAnimator();
|
||||
}
|
||||
@ -94,19 +82,15 @@ public class LevelModel extends Observable implements Runnable {
|
||||
* Class constructor
|
||||
*
|
||||
* @param levelName Level name
|
||||
* @param audioLoadHelper Audio load helper
|
||||
*/
|
||||
public LevelModel(String levelName, AudioLoadHelper audioLoadHelper) {
|
||||
this(levelName, audioLoadHelper, "game");
|
||||
public LevelModel(String levelName) {
|
||||
this(levelName, "game");
|
||||
}
|
||||
|
||||
/**
|
||||
* Class constructor (editor mode)
|
||||
*
|
||||
* @param audioLoadHelper Audio load helper
|
||||
*/
|
||||
public LevelModel(AudioLoadHelper audioLoadHelper) {
|
||||
this.audioLoadHelper = audioLoadHelper;
|
||||
public LevelModel() {
|
||||
this.gameRunning = false;
|
||||
this.mode = "editor";
|
||||
|
||||
@ -209,7 +193,7 @@ public class LevelModel extends Observable implements Runnable {
|
||||
}
|
||||
|
||||
if (collisionSound != null) {
|
||||
this.audioLoadHelper.playSound(collisionSound);
|
||||
AUDIO_LOAD_HELPER.playSound(collisionSound);
|
||||
}
|
||||
}
|
||||
|
||||
@ -274,12 +258,12 @@ public class LevelModel extends Observable implements Runnable {
|
||||
*/
|
||||
public void triggerBlockChange(String blockValue) {
|
||||
// No block value?
|
||||
if(blockValue == null || blockValue.isEmpty()) {
|
||||
if (blockValue == null || blockValue.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Cancel if Rockford is already in model
|
||||
if((blockValue.equals("Rockford") || blockValue.equals("rockford")) && this.isRockfordInModel()) {
|
||||
if ((blockValue.equals("Rockford") || blockValue.equals("rockford")) && this.isRockfordInModel()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -343,7 +327,7 @@ public class LevelModel extends Observable implements Runnable {
|
||||
public BufferedImage getImage(int x, int y) {
|
||||
DisplayableElementModel elementModel = this.getDisplayableElement(x, y);
|
||||
|
||||
if(elementModel == null) {
|
||||
if (elementModel == null) {
|
||||
return new DirtModel().getSprite();
|
||||
}
|
||||
|
||||
@ -376,7 +360,7 @@ public class LevelModel extends Observable implements Runnable {
|
||||
// Iterate and catch it!
|
||||
for (int x = 0; x < this.getSizeWidth() && !isInModel; x++) {
|
||||
for (int y = 0; y < this.getSizeHeight() && !isInModel; y++) {
|
||||
if(this.groundGrid[x][y] != null && this.groundGrid[x][y].getSpriteName() == "rockford") {
|
||||
if (this.groundGrid[x][y] != null && this.groundGrid[x][y].getSpriteName() == "rockford") {
|
||||
isInModel = true;
|
||||
}
|
||||
}
|
||||
@ -396,7 +380,7 @@ public class LevelModel extends Observable implements Runnable {
|
||||
// Iterate and catch it!
|
||||
for (int x = 0; x < this.getSizeWidth(); x++) {
|
||||
for (int y = 0; y < this.getSizeHeight(); y++) {
|
||||
if(this.groundGrid[x][y] != null && this.groundGrid[x][y].getSpriteName() == "diamond") {
|
||||
if (this.groundGrid[x][y] != null && this.groundGrid[x][y].getSpriteName() == "diamond") {
|
||||
numberOfDiamonds += 1;
|
||||
}
|
||||
}
|
||||
@ -410,12 +394,12 @@ public class LevelModel extends Observable implements Runnable {
|
||||
*/
|
||||
public void checkConstraints() throws LevelConstraintNotRespectedException {
|
||||
// Diamonds number?
|
||||
if(this.countDiamonds() < 3) {
|
||||
if (this.countDiamonds() < 3) {
|
||||
throw new LevelConstraintNotRespectedException("Add at least 3 diamonds!");
|
||||
}
|
||||
|
||||
// Rockford in model?
|
||||
if(!this.isRockfordInModel()) {
|
||||
if (!this.isRockfordInModel()) {
|
||||
throw new LevelConstraintNotRespectedException("Add Rockford on the map!");
|
||||
}
|
||||
}
|
||||
@ -480,7 +464,7 @@ public class LevelModel extends Observable implements Runnable {
|
||||
* @param y Sprite block vertical position
|
||||
*/
|
||||
public void updateSprites(int x, int y) {
|
||||
if(groundGrid[x][y] == null) {
|
||||
if (groundGrid[x][y] == null) {
|
||||
groundGrid[x][y] = new DirtModel();
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@ public class GameGroundView extends GroundView {
|
||||
|
||||
this.gameController = gameController;
|
||||
|
||||
this.addKeyListener(new GameKeyController(this.levelModel, this.gameController.getAudioLoadHelper()));
|
||||
this.addKeyListener(new GameKeyController(this.levelModel));
|
||||
|
||||
this.setBorder(BorderFactory.createLineBorder(Color.black));
|
||||
this.setFocusable(true);
|
||||
|
@ -169,10 +169,10 @@ public class LevelEditorView extends JFrame implements Observer {
|
||||
|
||||
if(selectedLevelValue != null && !selectedLevelValue.isEmpty()) {
|
||||
// Load existing model
|
||||
pickedLevelModel = new LevelModel(selectedLevelValue, this.nav.getAudioLoadHelper(), "editor");
|
||||
pickedLevelModel = new LevelModel(selectedLevelValue, "editor");
|
||||
} else {
|
||||
// New blank model for editor
|
||||
pickedLevelModel = new LevelModel(this.nav.getAudioLoadHelper());
|
||||
pickedLevelModel = new LevelModel();
|
||||
}
|
||||
|
||||
pickedLevelModel.setShowCursor(true);
|
||||
|
Loading…
x
Reference in New Issue
Block a user