import greenfoot.*; public class Player extends Actor { private int speed = 6; private int jumpStrength = 20; private int gravity = 1; private int verticalSpeed = 0; private boolean onGround = false; public void act() { moveLeftAndRight(); jump(); fall(); } // Bewegung nach links und rechts private void moveLeftAndRight() { if (Greenfoot.isKeyDown("a")) { setLocation(getX() - speed, getY()); } if (Greenfoot.isKeyDown("d")) { setLocation(getX() + speed, getY()); } } // Springen private void jump() { if (Greenfoot.isKeyDown("space") && onGround) { verticalSpeed = -jumpStrength; onGround = false; } } // Schwerkraft private void fall() { int oldY = getY(); verticalSpeed += gravity; int newY = getY() + verticalSpeed; setLocation(getX(), newY); Actor ground = getOneIntersectingObject(Ground.class); if (ground != null && verticalSpeed >= 0) { int groundTop = ground.getY() - ground.getImage().getHeight() / 2; int characterBottom = getY() + getImage().getHeight() / 2; // Nur landen, wenn der Spieler vorher über dem Boden war int oldCharacterBottom = oldY + getImage().getHeight() / 2; if (oldCharacterBottom <= groundTop && characterBottom >= groundTop) { setLocation( getX(), groundTop - getImage().getHeight() / 2 ); verticalSpeed = 0; onGround = true; } } else { onGround = false; } } }