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

2017/1/4

Some scrolling platform issues

Jochends Jochends

2017/1/4

#
Hi, I'm busy making a scrolling platform that looks like that of 'Super Mario Bros', but somehow i can't seem to find how to make it exactly scroll it like in the game. If i move, the scrolling starts like it should do but i don't find the code to move my character at a constant place like in 'super mario bros'. I just run untill i get behind that scrolling and not inside the scrolling itself. Also if i return back again the scrolling does nothing. I suppose this has to do with the following code:
public void act()
    {
        if (Greenfoot.isKeyDown("right")) {
            img0.scroll();
            img1.scroll();
I need to this with some kind of boolean? I want this => But got this => My greenfoot This is the code i use.. WORLD
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
/**
 * Write a description of class MyWorld here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class MyWorld extends World
{
    private Background img0, img1;

    // Gebruik maken van een array voor het plaatsen van de X-coördinaten van de bomen
    private int[] GeleBoomX = { 25, 150, 255, 340, 500, 700, 900, 1200, 1500, 1800, 2000, 3000, 3500, 3700, 4000, 4500 }; // de Coordinaten waar de bomen zich gaan bevinden.
    private int[] SteenX = { 150, 450, 600, 870, 1400 };
    /**
     * Constructor for objects of class MyWorld.
     * 
     */
    public MyWorld()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels. False zorgt ervoor dat het mannetje de rand niet raakt.
        super(1000, 400, 1, false); // True is bounded en false is unbounded

        img0 = new Background(); // maakt een achtergrond aan
        addObject( img0, getWidth()/2, getHeight()/2 ); // hierdoor wordt de image mooi gecentreerd in de wereld

        img1 = new Background(); // maakt een achtergrond aan MAAR aan de rechterkant van de afbeelding die niet zichtbaar is maar gescrollt
        addObject( img1, getWidth() + getWidth()/2 , getHeight()/2 );

        for(int t=0; t<GeleBoomX.length; t++) { // GeleBoom start bij 0 en gaat altijd 1 omhoog( zie lijst bovenaan ). als de boom kleiner is dan de lengte van de lijst blijft hij opbouwen tot hij het einde bereikt.
            addObject(new GeleBoom(), GeleBoomX[t], 335);

            addObject(new Hoofdplatform(), 65, 385);
            addObject(new Hoofdplatform(), 193, 385);
            addObject(new Hoofdplatform(), 321, 385);
            addObject(new Hoofdplatform(), 449, 385);
            addObject(new Hoofdplatform(), 577, 385);
            addObject(new Hoofdplatform(), 705, 385);
            addObject(new Hoofdplatform(), 833, 385);
            addObject(new Hoofdplatform(), 961, 385);

            addObject(new mannetje(), 80, 346);
        }
    }

    public void act()
    {
        if (Greenfoot.isKeyDown("right")) {
            img0.scroll();
            img1.scroll();

            List<GeleBoom> Gelebomen = getObjects(GeleBoom.class);
            for( int t=0; t<Gelebomen.size(); t++) {
                GeleBoom geleboom = Gelebomen.get(t); // Alles in java = Object
                geleboom.scroll();
            }

        }
    }
}
CHARACTER
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class testmannetje here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class mannetje extends Scroller
{
    private int speed = 1; // snelheid( in pixels ) waarmee het mannetje horizontaal loopt.
    private int vSpeed = 0; // V staat voor verticale speed, dus springen en vallen.
    private int acceleration = 1; //het mannetje gaat hierdoor vallen zoals bij de zwaartekracht( realistischer ).
    private boolean jumping;
    private int jumpStrength = 14; // Hoe hoger het aantal hoe hoger het mannetje springt.
    private int frame = 1; // de afbeeldingen per aantal die geladen worden.
    private int animationCounter = 0;
    
    private GreenfootImage manRechts2 = new GreenfootImage("manRechts2.png");
    private GreenfootImage manRechts3 = new GreenfootImage("manRechts3.png");
    private GreenfootImage manRechts4 = new GreenfootImage("manRechts4.png");
    private GreenfootImage manRechts5 = new GreenfootImage("manRechts5.png");
    private GreenfootImage manRechts6 = new GreenfootImage("manRechts6.png");
    
    private GreenfootImage manLinks2 = new GreenfootImage("manLinks2.png");
    private GreenfootImage manLinks3 = new GreenfootImage("manLinks3.png");
    private GreenfootImage manLinks4 = new GreenfootImage("manLinks4.png");
    private GreenfootImage manLinks5 = new GreenfootImage("manLinks5.png");
    private GreenfootImage manLinks6 = new GreenfootImage("manLinks6.png");

    public void act() 
    {
      checkKeys();
      checkFall();
      animationCounter++;
      checkRightWalls();
      checkLeftWalls();
    }   

public void checkKeys()
{
if (Greenfoot.isKeyDown("left") ) // Als ik de linker keyarrow indruk gaat de afbeelding van het man-links laden en de methode moveLeft aanroepen
{
   moveLeft();
}
 
if (Greenfoot.isKeyDown("right") ) // Als ik de rechter keyarrow indruk gaat de afbeelding van het man-rechts laden en de methode moveRight aanroepen
{
   moveRight();
}
 
if (Greenfoot.isKeyDown("space") && jumping == false){
     jump();
}
}

    private boolean checkRightWalls() // controleert de rechterkant van de muren. 
{
        int spriteWidth = getImage().getWidth(); // berekent de omvang van de afbeelding
        int xDistance = (int)(spriteWidth/2); // berekent de grootte van de afbeelding en gaat aan de hand daarvan de eerste aanraking met het object berekenen.
        Actor rightWall = getOneObjectAtOffset(xDistance, 0, Hoofdplatform.class);
        if(rightWall == null)
        {
            return false;
        }
        else
        {
            stopByRightWall(rightWall);
            return true;
        }
}

    private void stopByRightWall(Actor rightWall) // Het mannetje gaat automatisch stoppen bij het aanraken van de rechterkant van het object.
    {
        int wallWidth = rightWall.getImage().getWidth(); 
        int newX = rightWall.getX() - (wallWidth + getImage().getWidth())/2;
        setLocation(newX - 5, getY());
    }

    private boolean checkLeftWalls() // controleert de linkerkant van de muren.
    {
        int spriteWidth = getImage().getWidth();
        int xDistance = (int)(spriteWidth/-2); // berekent 
        Actor leftWall = getOneObjectAtOffset(xDistance, 0, Hoofdplatform.class);
        if(leftWall == null)
        {
            return false;
        }
        else
        {
            stopByLeftWall(leftWall);
            return true;
        }
    }

    private void stopByLeftWall(Actor leftWall) // Het mannetje gaat automatisch stoppen bij het aanraken van de linkerkant van het object.
    {
        int wallWidth = leftWall.getImage().getWidth();
        int newX = leftWall.getX() + (wallWidth + getImage().getWidth())/2;
        setLocation(newX + 5, getY());
    }

    private void moveRight()
    {
    setLocation(getX()+speed, getY()); // +speed, getY = de beweging naar rechts die uitgevoerd wordt op de horizontale lijn.
    if(animationCounter %5 == 0) // % van de hoeveelheid afbeeldingen die geladen worden( hoe hoger hoe sneller de animatie gebeurd )
    {
        animateRight();
    }
    }

    private void moveLeft()
    {
    setLocation(getX()-speed, getY()); // +speed, getY = de beweging naar links die uitgevoerd wordt op de horizontale lijn.
    if(animationCounter %5 == 0) // % van de hoeveelheid afbeeldingen die geladen worden( hoe hoger, hoe sneller de animatie gebeurd )
    {
        animateLeft();
    }
    }

    private void fall()
    {
        setLocation(getX(), getY() + vSpeed); // Laat het mannetje vallen met een snelheid die meer volgende de zwaartekracht werkt.
        if(vSpeed <=9)
        {
            vSpeed = vSpeed + acceleration; // De Vspeed ( snelheid ) + acceleration ( de zwaartekracht om het realistischer te maken ).
        }
        jumping = true;
    }

private boolean onGround() // Als het mannetje de grond niet raakt, kan het niet springen. Pas vanaf dat het mannetje een grond raakt kan er gesprongen worden.
{
    Actor ground = getOneObjectAtOffset (0, getImage().getHeight() / 2, Hoofdplatform.class); // Berekent de breedte en hoogte van de image / 2 om de juiste aanraking van de grond mogenlijk te maken.
    if(ground == null)
    {
       jumping = true;
       return false;
    }
    else
    {
       moveToGround(ground);
       return true;
    }
}

    private void moveToGround(Actor ground)
    {
        int groundHeight = ground.getImage().getHeight();
        int newY = ground.getY() - (groundHeight + getImage().getHeight())/2; // De grootte van het mannetje wordt in 2 gedeeld, zodat deze het object het platform niet aanraakt in het midden, maar op de rand van zijn voeten.
        setLocation(getX(), newY);
        jumping = false;
    }

    private void checkFall() // Controleert of het mannetje de grond raakt, en laat deze dan stoppen. Als de 'onGround' niet herkent wordt, blijft hij vallen.
    {
        if(onGround())
        {
            vSpeed = 0;
        }
        else
        {
            fall();
        }
    }

    private void jump()
    {
        vSpeed = -jumpStrength; // Bij de jump gaat het mannetje verzwakken in jumpstrenght om zo een realistische val te maken ( anders blijft het op dezelfde hoogte )
        jumping = true;
        fall();
    }
    
private void animateLeft() // De animatie dat het mannetje maakt als hij naar links stapt. Volgende afbeeldingen worden dan geladen en terug in een loop geplaatst.
{
    if(frame == 1)
        {
            setImage(manLinks2);
        }
        else if(frame == 2)
        {
            setImage(manLinks3);
        }
        else if(frame == 3)
        {
            setImage(manLinks4);
        }
        else if(frame == 4)
        {
            setImage(manLinks5);
        }
        else if(frame == 5)
        {
            setImage(manLinks6);
            frame = 1;
            return;
        }
    frame++;
}

private void animateRight() // De animatie dat het mannetje maakt als hij naar rechts stapt. Volgende afbeeldingen worden dan geladen en terug in een loop geplaatst.
{
    if(frame == 1)
        {
            setImage(manRechts2);
        }
        else if(frame == 2)
        {
            setImage(manRechts3);
        }
        else if(frame == 3)
        {
            setImage(manRechts4);
        }
        else if(frame == 4)
        {
            setImage(manRechts5);
        }
        else if(frame == 5)
        {
            setImage(manRechts6);
            frame = 1;
            return;
        }
    frame++;
}
}

danpost danpost

2017/1/4

#
Maybe you can get some pointers from my Scrolling Tutorial scenario.
Jochends Jochends

2017/1/6

#
Thanks danpost but this still seems to be overcomplicated for me. I want the code to be very basic and easy to understand. I also can't seem to open your scenario to check it in greenfoot itself? Thanks in advance
danpost danpost

2017/1/6

#
Jochends wrote...
Thanks danpost but this still seems to be overcomplicated for me. I want the code to be very basic and easy to understand.
Nobody said the code for scrolling was basic and easy. In fact, scrolling is quite involved and not recommended for the inexperienced programmer.
I also can't seem to open your scenario to check it in greenfoot itself?
You are to run the scenario here on the site. There is also a link to a discussion thread in the description with some basic instruction and code to look at.
You need to login to post a reply.