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++;
}
}
