This site requires JavaScript, please enable it in your browser!
Greenfoot back
VideoGame
VideoGame wrote ...

2014/5/17

Platform problem

VideoGame VideoGame

2014/5/17

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

2014/5/18

#
Please
danpost danpost

2014/5/18

#
There does not appear to be any code to stop him from going into the platform from the right or left.
VideoGame VideoGame

2014/5/18

#
Yes but how to code this ? I have the code with the platform above the character but I don't know how to code the fact that the character has to stop when he is near (right or left) a platform... The problem is; Either he teleports above or below, or he goes behind the platform...
danpost danpost

2014/5/18

#
If you code the horizontal movement first and keep the actor off the platform that way, it will not teleport anywhere (or go behind, of course). Code it in the fashion of 'move-if intersects a platform-move back off'.
VideoGame VideoGame

2014/5/19

#
He teleports always when he is near a platform ( while he is jumping ) but the probleme with the fact he goes behind the platform is solved... But always not this teleportation;
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
       }
       checkPlatformright();
       checkPlatformleft();
       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;
    }
       
    [b]// Stop par la plateforme droite
    public boolean checkPlatformright()
    {
       int spriteWidth = getImage().getWidth();
       int xDistance = (int)(spriteWidth/2);
       Actor Platform = getOneObjectAtOffset(xDistance, 0, Platform.class); 
       if(Platform == null)
        {
            return false;
        }
        else
        {
            stopByPlatform (Platform);
            return true;
        }
    }
    
    public void stopByPlatform(Actor Platform)
    {
        int platformWidth = Platform.getImage().getWidth();
        int newX = Platform.getX() - (platformWidth + getImage().getWidth())/2;
        setLocation(newX, getY());
    }
    
    
    public boolean checkPlatformleft()
    {
       int spriteWidth = getImage().getWidth();
       int xDistance = (int)(spriteWidth/-2);
       Actor Platform = getOneObjectAtOffset(xDistance, 0, Platform.class); 
       if(Platform == null)
        {
            return false;
        }
        else
        {
            stopByPlatformleft (Platform);
            return true;
        }
    }
    
    public void stopByPlatformleft(Actor Platform)
    {
        int platformWidth = Platform.getImage().getWidth();
        int newX = Platform.getX() + (platformWidth + getImage().getWidth())/2;
        setLocation(newX, getY());
    }[/b][/u][/u][/h1][/h1][/b]
    
    // 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++;
    }
}
danpost danpost

2014/5/19

#
danpost wrote...
If you code the horizontal movement first and keep the actor off the platform that way, it will not teleport anywhere (or go behind, of course).
What I meant by this was * move horizontally * check for left/right obstacles and move back if necessary * move vertically * check for above/below obstacles and move back if necessary Your 'move' method right now is doing both movements together before the checking.
You need to login to post a reply.