Hi,
I have a problem with my scenario. So, I made a platform game and my problem is that the character isn't stopped when he see a right or left platform. Here is my code;
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.Date; /** * Write a description of class Player here. * * @author (Kirill, Cesur) * @version (Mai 2014) */ public class Player extends Actor { private int sizeY = 32; // L'épaisseur du personnag (la taille verticale) private int speed = 7; // la vitesse du déplacement du personnage. private int vSpeed = 0; // private int acceleration = 2; // L'acceleration du personnage quand il tombe. private boolean isFalling = true; // Le personnge tombe toujours. Gravité. private long jumpCD = 0; private long prevTime = 0;//temps au dernier appel de move() // Insertion des différentes images pour l'animation private GreenfootImage player1 = new GreenfootImage("Player1.png"); private GreenfootImage player2 = new GreenfootImage("Player2.png"); private GreenfootImage player3 = new GreenfootImage("Player3.png"); private GreenfootImage player4 = new GreenfootImage("Player4.png"); private GreenfootImage player5 = new GreenfootImage("Player5.png"); private GreenfootImage player6 = new GreenfootImage("Player6.png"); private GreenfootImage player7 = new GreenfootImage("Player7.png"); private GreenfootImage player8 = new GreenfootImage("Player8.png"); private GreenfootImage player9 = new GreenfootImage("Player9.png"); private GreenfootImage player11 = new GreenfootImage("Player11.png"); private int frame = 1; // La fréquence du changement des images. private int animationCounter = 0; // Au départ égal à 0 public void act() { move(); // Permet de faire bouger le personnage if(isFalling) { fall(); // Condition et méthode pour que le personnage tombe } platformAbove(); // Détection des plateformes au-dessus du personnage walkonPlatform(); // Détection des plateformes en-dessous du personnage } private void move() { if (jumpCD > 0){ long actTime = new Date().getTime(); long deltaTime = actTime - prevTime; jumpCD -= deltaTime; //jumpCD = jumpCD - deltaTime prevTime = actTime; } else { prevTime = new Date().getTime(); jumpCD = 0; } // Condition de mouvement à partir des flèches et de la barre espace if ( Greenfoot.isKeyDown("right") ) // Droite { setImage(player1); moveRight(); } if (Greenfoot.isKeyDown("left") ) // Gauche { setImage(player1); moveLeft(); } if ( Greenfoot.isKeyDown("space") && jumpCD <= 0) // Saut { jumpCD = 700; setImage(player1); jump(); } } public void jump() { setImage(player11); vSpeed = -25;// Permet de faire tomber le personnage après un saut fall(); } public boolean foundPlatform() // Booléan permettant de détecter si nous nous confrontons avec une plateforme { // getOneIntersectingObject renvoie un Actor Actor actor = getOneIntersectingObject(Platform.class); // Permet de créer une interraction avec les plateformes { // On regarde si actor n'est pas null et si actor est une Platform if(actor != null) { if(isFalling) { setLocation( getX(), actor.getY() - ( sizeY/2 + actor.getImage().getHeight()/2 )); // Localisation de la plateforme pour que le personnage puisse tomber dessus vSpeed = 0; } return true; } else { return false; } } } public boolean platformAbove() // Booléan permettant de savoir si le personnage est oui ou non bloqué (dessus) par une plateforme { int spriteHeight = getImage().getHeight(); int yDistance = (int)(spriteHeight/-2); Actor ceiling = getOneObjectAtOffset(0, yDistance, Platform.class); if(ceiling != null) { vSpeed = 1; touchHead(ceiling); return true; } else { return false; } } public void touchHead( Actor ceiling ) // Le bloquage du movement de personnage quand il touche la plateforme d'en bas { int ceilingHeight = ceiling.getImage().getHeight(); int newY = ceiling.getY() + (ceilingHeight + getImage().getHeight())/2; setLocation( getX(), newY ); } public void walkonPlatform()// Condition permettant de connaître si oui ou non nous pouvons marcher sur une plateforme { if(foundPlatform() ) { isFalling = false; } else { isFalling = true; } } private void fall() // Méthode pour la position et la vitesse lors de la chute du personnage { setLocation( getX(), getY() + vSpeed ); vSpeed = vSpeed + acceleration; } // Animation pour mouvement à gauche et à droite private void moveRight() { setLocation( getX() + speed, getY()); // Le personnage se déplace à droite avec une certaine vitesse. if(animationCounter %4 == 0) { animateRight(); } } public void animateRight() // Changement d'images lors du mouvement du personnage. { if(frame == 1) { setImage(player6); } else if(frame == 2) { setImage(player7); } else if(frame == 3) { setImage(player8); } else if(frame == 4) { setImage(player9); frame = 1; return; } frame++; } private void moveLeft() { setLocation( getX() - speed, getY() ); // Le personnage se déplace à gauche avec une certaine vitesse. if(animationCounter %4 == 0) { animateLeft(); } } private void animateLeft()// Changement d'images lors du mouvement du personnage. Avec une fréquence de 4 secs. { if(frame == 1) { setImage(player2); } else if(frame == 2) { setImage(player3); } else if(frame == 3) { setImage(player4); } else if(frame == 4) { setImage(player5); frame = 1; return; } frame++; } }