Merge branch 'ueb03-semenovykh' into ueb03

# Conflicts:
#	.idea/misc.xml
#	src/fr/enssat/BoulderDash/controllers/BoulderAndDiamondController.java
#	src/fr/enssat/BoulderDash/models/LevelModel.java
This commit is contained in:
0nlineSam 2024-11-07 22:32:45 +01:00
commit 32647ef118
3 changed files with 878 additions and 836 deletions

2
.idea/misc.xml generated
View File

@ -3,7 +3,7 @@
<component name="PDMPlugin"> <component name="PDMPlugin">
<option name="skipTestSources" value="false" /> <option name="skipTestSources" value="false" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/classes" /> <output url="file://$PROJECT_DIR$/classes" />
</component> </component>
</project> </project>

View File

@ -17,146 +17,156 @@ import static fr.enssat.BoulderDash.helpers.AudioLoadHelper.AUDIO_LOAD_HELPER;
* @since 2015-06-19 * @since 2015-06-19
*/ */
public class BoulderAndDiamondController extends AbstractLevelController implements Runnable { public class BoulderAndDiamondController extends AbstractLevelController implements Runnable {
private Thread elementMovingThread; private Thread elementMovingThread;
/** /**
* Class constructor * Class constructor
* *
* @param levelModel Level model * @param levelModel Level model
*/ */
public BoulderAndDiamondController(LevelModel levelModel) { public BoulderAndDiamondController(LevelModel levelModel) {
super(levelModel); super(levelModel);
// Start thread // Start thread
this.elementMovingThread = new Thread(this); this.elementMovingThread = new Thread(this);
this.elementMovingThread.start(); this.elementMovingThread.start();
} }
/** /**
* Watches for elements to be moved * Watches for elements to be moved
*/ */
public void run() { public void run() {
while (this.levelModel.isGameRunning()) { while (this.levelModel.isGameRunning()) {
if (!this.levelModel.getGamePaused()) { if(!this.levelModel.getGamePaused()){
this.manageFallingObject(); this.manageFallingObject();
} }
try { try {
Thread.sleep(250); Thread.sleep(250);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
/** /**
* Scan the ground to detect the boulders & the diamonds, then make them * Scan the ground to detect the boulders & the diamonds, then make them
* fall if necessary * fall if necessary
* Note: scan of the ground upside down: we want things to fall slowly ! * Note: scan of the ground upside down: we want things to fall slowly !
*/ */
private void manageFallingObject() { private void manageFallingObject() {
for (int x = this.levelModel.getSizeWidth() - 1; x >= 0; x--) { for (int x = this.levelModel.getSizeWidth() - 1; x >= 0; x--) {
for (int y = this.levelModel.getSizeHeight() - 1; y >= 0; y--) { for (int y = this.levelModel.getSizeHeight() - 1; y >= 0; y--) {
// Gets the spriteName of actual DisplayableElementModel object scanned // Gets the spriteName of actual DisplayableElementModel object scanned
DisplayableElementModel elementModel = this.levelModel.getGroundLevelModel()[x][y]; DisplayableElementModel elementModel = this.levelModel.getElement(x, y);
if (elementModel == null) { if(elementModel == null) {
elementModel = new DirtModel(); elementModel = new DirtModel();
} }
String spriteName = elementModel.getSpriteName(); String spriteName = elementModel.getSpriteName();
// If it is a boulder or a diamond...
if (spriteName == "boulder" || spriteName == "diamond") {
this.manageFallingObjectBehavior(x, y);
} else if(spriteName == "expandingwall"){
if(this.expandWall(x,y).equals("left")){
x -= 1;
}
}
}
}
}
// If it is a boulder or a diamond... /**
if (spriteName == "boulder" || spriteName == "diamond") { * Expand the wall at left & right
this.manageFall(x, y); *
} else if (spriteName == "expandingwall") { * @param x Horizontal position
if (this.expandWall(x, y).equals("left")) { * @param y Vertical position
x -= 1; */
} private String expandWall(int x, int y) {
} DisplayableElementModel elementLeft = this.levelModel.getElementLeft(x, y);
} DisplayableElementModel elementRight = this.levelModel.getElementRight(x, y);
}
}
/** String spriteNameLeft = elementLeft.getSpriteName();
* Expand the wall at left & right String spriteNameRight = elementRight.getSpriteName();
*
* @param x Horizontal position String way = "";
* @param y Vertical position if(spriteNameLeft == "black"){
*/ this.levelModel.expandThisWallToLeft(x,y);
private String expandWall(int x, int y) { way = "left";
DisplayableElementModel elementLeft = this.levelModel.getGroundLevelModel()[x - 1][y]; }
DisplayableElementModel elementRight = this.levelModel.getGroundLevelModel()[x + 1][y]; if(spriteNameRight == "black"){
String spriteNameLeft = elementLeft.getSpriteName(); this.levelModel.expandThisWallToRight(x,y);
String spriteNameRight = elementRight.getSpriteName(); way = "right";
}
return way;
}
String way = ""; /**
if (spriteNameLeft == "black") { * Manages the fall of elements
this.levelModel.expandThisWallToLeft(x, y); *
way = "left"; * @param x Horizontal position
} * @param y Vertical position
if (spriteNameRight == "black") { */
this.levelModel.expandThisWallToRight(x, y); private void manageFallingObjectBehavior(int x, int y) {
way = "right";
}
return way;
}
/** // Task3 - Variable to get rig of calling one Method in if-clause several times
* Manages the fall of elements DisplayableElementModel element = this.levelModel.getElement(x, y);
* DisplayableElementModel elementTwoBelow = this.levelModel.getElementTwoBelow(x, y);
* @param x Horizontal position
* @param y Vertical position
*/
private void manageFall(int x, int y) {
// Get informed about Rockford surroundings
DisplayableElementModel elementBelow = this.levelModel.getGroundLevelModel()[x][y + 1];
DisplayableElementModel elementLeft = this.levelModel.getGroundLevelModel()[x - 1][y];
DisplayableElementModel elementRight = this.levelModel.getGroundLevelModel()[x + 1][y];
String spriteNameBelow = elementBelow.getSpriteName(); // Get informed about Rockford surroundings
String spriteNameLeft = elementLeft.getSpriteName(); DisplayableElementModel elementBelow = this.levelModel.getElementBelow(x, y);
String spriteNameRight = elementRight.getSpriteName(); DisplayableElementModel elementLeft = this.levelModel.getElementLeft(x, y);
DisplayableElementModel elementRight = this.levelModel.getElementRight(x, y);
// Then, process in case of the surrounding String spriteNameBelow = elementBelow.getSpriteName();
if (spriteNameBelow == "black") { String spriteNameLeft = elementLeft.getSpriteName();
this.levelModel.makeThisDisplayableElementFall(x, y); String spriteNameRight = elementRight.getSpriteName();
} else if (spriteNameBelow == "boulder") {
// Boulders have to roll if they hit another boulder // Then, process in case of the surrounding
if (this.levelModel.getGroundLevelModel()[x - 1][y + 1].getSpriteName() == "black") { if (spriteNameBelow == "black") {
this.levelModel.makeThisBoulderSlideLeft(x, y); this.levelModel.makeThisDisplayableElementFall(x, y);
} else if (this.levelModel.getGroundLevelModel()[x + 1][y + 1].getSpriteName() == "black") { } else if (spriteNameBelow == "boulder") {
this.levelModel.makeThisBoulderSlideRight(x, y); // Boulders have to roll if they hit another boulder
} if (this.levelModel.getElementBelowLeft(x, y).getSpriteName() == "black") {
} else if (spriteNameBelow == "rockford" && this.levelModel.getGroundLevelModel()[x][y].isFalling()) { this.levelModel.makeThisBoulderSlideLeft(x, y);
this.levelModel.exploseGround(x, y + 1); } else if (this.levelModel.getElementBelowRight(x, y).getSpriteName() == "black") {
this.levelModel.makeThisBoulderSlideRight(x, y);
}
} else {
if (spriteNameBelow == "rockford" && element.isFalling()) {
this.levelModel.exploseGround(x, y + 1);
AUDIO_LOAD_HELPER.playSound("die"); AUDIO_LOAD_HELPER.playSound("die");
try { try {
Thread.sleep(25); Thread.sleep(25);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
this.levelModel.setGameRunning(false);
} else if (spriteNameBelow == "magicwall") {
if (element.getSpriteName() == "boulder"
&& (elementTwoBelow.getSpriteName() == "dirt" ||
elementTwoBelow.getSpriteName() == "black")) {
if(element.isConvertible()) {
this.levelModel.transformThisBoulderIntoADiamond(x, y);
} else {
this.levelModel.deleteThisBoulder(x, y);
}
}
} else if (elementBelow.isDestructible() && spriteNameBelow != "dirt" && element.isFalling()) {
this.levelModel.exploseThisBrickWall(x, y);
} else if (spriteNameLeft == "rockford" && this.levelModel.getRockford().isRunningRight() && elementRight.getSpriteName() == "black") {
this.levelModel.moveThisBoulderToRight(x, y);
} else if (spriteNameRight == "rockford" && this.levelModel.getRockford().isRunningLeft() && elementLeft.getSpriteName() == "black") {
this.levelModel.moveThisBoulderToLeft(x, y);
} else {
element.setFalling(false);
}
}
}
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.transformThisBoulderIntoADiamond(x, y);
} else {
this.levelModel.deleteThisBoulder(x, y);
}
}
} else if (elementBelow.isDestructible() && spriteNameBelow != "dirt" && this.levelModel.getGroundLevelModel()[x][y].isFalling()) {
this.levelModel.exploseThisBrickWall(x, y);
} else if (spriteNameLeft == "rockford" && this.levelModel.getRockford().isRunningRight() && this.levelModel.getGroundLevelModel()[x + 1][y].getSpriteName() == "black") {
this.levelModel.moveThisBoulderToRight(x, y);
} else if (spriteNameRight == "rockford" && this.levelModel.getRockford().isRunningLeft() && this.levelModel.getGroundLevelModel()[x - 1][y].getSpriteName() == "black") {
this.levelModel.moveThisBoulderToLeft(x, y);
} else {
this.levelModel.getGroundLevelModel()[x][y].setFalling(false);
}
}
} }

File diff suppressed because it is too large Load Diff