I finally got this actor to jump (actually, I copied a part of danpost's platformer scenario, sorry.), but there seems to be some problems.
The running animation is too fast, and when I jump once, the character passes the ground.
Also, most of the time, when I press "right", my actor either stops, or will do nothing. It rarely punches as it's supposed to. I believe it has something to do with the "frame" variable, but I'm not sure how to tweak it.
All help would be appreciated. Thanks in advance,
EDIT: I found the cause of the bouncing, the fast animation ground passing is still there though.
Here's the code:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Start here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Start extends Player
{
private int vSpeed = 0;
private int acceleration = 1;
private boolean jumping;
private int jumpStrength = 20;
private GreenfootImage slide = new GreenfootImage("slide.png");
private GreenfootImage punch1 = new GreenfootImage ("punch0.png");
private GreenfootImage punch2 = new GreenfootImage ("punch2.png");
private GreenfootImage punch3 = new GreenfootImage ("punch3.png");
private GreenfootImage jump = new GreenfootImage ("victoryjump.png");
private GreenfootImage walk1 = new GreenfootImage ("1.png");
private GreenfootImage walk2 = new GreenfootImage ("2.png");
private GreenfootImage walk3 = new GreenfootImage ("3.png");
private GreenfootImage walk4 = new GreenfootImage ("4.png");
private GreenfootImage walk5 = new GreenfootImage ("5.png");
private GreenfootImage walk6 = new GreenfootImage ("6.png");
private GreenfootImage walk7 = new GreenfootImage ("7.png");
private GreenfootImage walk8 = new GreenfootImage ("8.png");
private GreenfootImage walk9 = new GreenfootImage ("9.png");
private GreenfootImage walk10 = new GreenfootImage ("10.png");
private int frame = 1;
/**
* Act - do whatever the Start wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
CheckKeys();
CheckFall();
}
public void CheckKeys()//detects if player inputs a command.
{
if(Greenfoot.isKeyDown("up") && jumping == false)//prevents double jumping
{
jump();
}
else if(Greenfoot.isKeyDown("down"))
{
slide();
}
else if(Greenfoot.isKeyDown("right"))
{
punch();
}
else //runs even when no action is eneterd
{
run();
}
}
public void slide()
{
setImage (slide);
}
public void punch()
{
if(frame == 1)
{
setImage(punch1);
}
else if(frame == 2)
{
setImage(punch2);
}
else if(frame == 3)
{
setImage(punch3);
frame = 1;
return;
}
frame++;
}
public void run()
{
if(frame == 1)
{
setImage(walk1);
}
else if(frame == 2)
{
setImage(walk2);
}
else if(frame == 3)
{
setImage(walk3);
}
else if(frame == 4)
{
setImage(walk4);
}
else if(frame == 5)
{
setImage(walk5);
}
else if(frame == 6)
{
setImage(walk6);
}
else if(frame == 7)
{
setImage(walk7);
}
else if(frame == 8)
{
setImage(walk8);
}
else if(frame == 9)
{
setImage(walk9);
}
else if(frame == 10)
{
setImage(walk10);
frame = 1;
return;
}
frame++;
}
public void jump()
{
vSpeed = vSpeed - jumpStrength;
jumping = true;
fall();
}
public void fall()
{
setLocation(getX(), getY() + vSpeed);
if(vSpeed <=9)
{
vSpeed = vSpeed + acceleration;
}
jumping = true;
}
public boolean onGround()
{
int spriteHeight = getImage().getHeight();
int yDistance = (int)(spriteHeight/4) + 5;
Actor ground = getOneObjectAtOffset(0, getImage().getHeight()/4, Ground.class);
if(ground == null)
{
jumping = true;
return false;
}
else
{
moveToGround(ground);
return true;
}
}
public void moveToGround(Actor ground)
{
int groundHeight = ground.getImage().getHeight();
int newY = ground.getY() - (groundHeight + getImage().getHeight())/4;
setLocation(getX(), newY);
jumping = false;
}
public void CheckFall()
{
if(onGround())
{
vSpeed = 0;
}
else
{
fall();
}
}
}
