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:
I need to this with some kind of boolean?
I want this =>
But got this => My greenfoot
This is the code i use..
WORLD
CHARACTER
public void act()
{
if (Greenfoot.isKeyDown("right")) {
img0.scroll();
img1.scroll();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();
}
}
}
}
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++;
}
}
