diff --git a/src/modele/calculs/Controle4Directions.java b/src/modele/calculs/Controle4Directions.java index 7737e3a..f9d2b97 100644 --- a/src/modele/calculs/Controle4Directions.java +++ b/src/modele/calculs/Controle4Directions.java @@ -1,9 +1,12 @@ package modele.calculs; +import modele.donnees.ElementFond; import modele.donnees.ElementPhysique; import modele.donnees.Entite; import modele.donnees.EntiteDynamique; +import java.awt.*; + /** * Controle4Directions permet d'appliquer une direction (connexion avec le clavier) à un ensemble d'entités dynamiques */ @@ -33,15 +36,21 @@ public class Controle4Directions extends RealisateurDeDeplacement { if (e.avancerDirectionChoisie(directionCourante)) ret = true; break; - + case bas: case haut: + ElementFond ef = e.regarderDerriereSoit(); + + if(ef != null && ef.peutPermettreDeMonterDescendre()) { + ret = e.avancerDirectionChoisie(directionCourante); + } + /* // on ne peut pas sauter sans prendre appui // (attention, test d'appui réalisé à partir de la position courante, si la gravité à été appliquée, il ne s'agit pas de la position affichée, amélioration possible) ElementPhysique eBas = e.regarderDansLaDirection(Direction.bas); if (eBas != null && eBas.peutServirDeSupport()) { if (e.avancerDirectionChoisie(Direction.haut)) ret = true; - } + }*/ break; } } diff --git a/src/modele/calculs/Gravite.java b/src/modele/calculs/Gravite.java index 73689d8..e74705e 100644 --- a/src/modele/calculs/Gravite.java +++ b/src/modele/calculs/Gravite.java @@ -1,9 +1,6 @@ package modele.calculs; -import modele.donnees.ElementPhysique; -import modele.donnees.Entite; -import modele.donnees.EntiteDynamique; -import modele.donnees.ObjetGyromide; +import modele.donnees.*; public class Gravite extends RealisateurDeDeplacement { @Override @@ -12,7 +9,9 @@ public class Gravite extends RealisateurDeDeplacement { for (Entite e : lstEntitesDynamiques) { ElementPhysique eBas = e.regarderDansLaDirection(Direction.bas); - if (eBas == null || (eBas != null && !eBas.peutServirDeSupport())) { + ElementFond eFond = e.regarderDerriereSoit(); + if(!(eFond != null && eFond.peutPermettreDeMonterDescendre()) + && eBas == null || (eBas != null && !eBas.peutServirDeSupport())) { if (e.avancerDirectionChoisie(Direction.bas)) ret = true; } diff --git a/src/modele/calculs/Jeu.java b/src/modele/calculs/Jeu.java index 76b7998..bfe9d3f 100644 --- a/src/modele/calculs/Jeu.java +++ b/src/modele/calculs/Jeu.java @@ -100,6 +100,11 @@ public class Jeu { Point positionEntite = map.get(e); return objetALaPosition(calculerPointCible(positionEntite, d)); } + + public ElementFond regarderDerriereSoit(Entite e) { + Point positionEntite = map.get(e); + return fondALaPosition(positionEntite); + } /** Si le déplacement de l'entité est autorisé (pas de mur ou autre entité), il est réalisé * Sinon, rien n'est fait. @@ -168,11 +173,7 @@ public class Jeu { } private ElementPhysique objetALaPosition(Point p) { - ObjetGyromide retour = null; - - if (contenuDansGrille(p)) { - retour = grilleEntites[p.x][p.y][0]; - } + ObjetGyromide retour = objetGyALaPosition(p, 0); if(retour instanceof ElementPhysique) return (ElementPhysique) retour; @@ -180,6 +181,24 @@ public class Jeu { return null; } + private ElementFond fondALaPosition(Point p) { + ObjetGyromide retour = objetGyALaPosition(p, 1); + + if(retour instanceof ElementFond) + return (ElementFond) retour; + else + return null; + } + + private ObjetGyromide objetGyALaPosition(Point p, int prof) { + ObjetGyromide retour = null; + + if (contenuDansGrille(p)) { + retour = grilleEntites[p.x][p.y][prof]; + } + return retour; + } + public Ordonnanceur getOrdonnanceur() { return ordonnanceur; } diff --git a/src/modele/donnees/Entite.java b/src/modele/donnees/Entite.java index b3a368d..d75e99a 100644 --- a/src/modele/donnees/Entite.java +++ b/src/modele/donnees/Entite.java @@ -19,4 +19,7 @@ public abstract class Entite extends ElementPhysique implements ElementDynamique public ElementPhysique regarderDansLaDirection(Direction d) { return jeu.regarderDansLaDirection(this, d); } + public ElementFond regarderDerriereSoit() { + return jeu.regarderDerriereSoit(this); + } }