I modified the "Player" code so that the player has to pick up a key before being able to exit through the door:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Player here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Player extends Actor
{
private int vSpeed = 0;
private int acceleration = 1;
private boolean jumping;
private int jumpStrength = 16;
private int speed = 4;
private boolean haskey;
private int direction = 1; // 1 = right and -1 = left
private int shootingCounter = 20; // Delay shooting
private GreenfootImage run1r = new GreenfootImage("run1r.png");
private GreenfootImage run2r = new GreenfootImage("run2r.png");
private GreenfootImage run3r = new GreenfootImage("run3r.png");
private GreenfootImage run4r = new GreenfootImage("run4r.png");
private GreenfootImage run1l = new GreenfootImage("run1l.png");
private GreenfootImage run2l = new GreenfootImage("run2l.png");
private GreenfootImage run3l = new GreenfootImage("run3l.png");
private GreenfootImage run4l = new GreenfootImage("run4l.png");
private int frame = 1;
private int animationCounter = 0;
/**
* Act - do whatever the Player wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
checkKey();
checkFall();
shooting();
platformAbove();
checkRightWalls();
checkLeftWalls();
grab();
exit();
shootingCounter --;
animationCounter++;
}
public void checkKey()
{
if(Greenfoot.isKeyDown("right"))
{
direction = 1;
moveRight();
}
if(Greenfoot.isKeyDown("left"))
{
direction = -1;
moveLeft();
}
if(Greenfoot.isKeyDown("up") && jumping == false)
{
jump();
}
}
public boolean shooting()
{
if(Greenfoot.isKeyDown("space") && shootingCounter <= 0 && direction ==1)
{
getWorld().addObject(new ShootRight(), getX(), getY());
shootingCounter = 20;
return true;
}
if(Greenfoot.isKeyDown("space") && shootingCounter <= 0 && direction ==-1)
{
getWorld().addObject(new ShootLeft(), getX(), getY());
shootingCounter = 20;
return true;
}
return false;
}
public void moveRight()
{
setLocation(getX()+speed, getY());
if(animationCounter % 4 == 0)
{
animateRight();
}
}
public void animateRight()
{
if(frame == 1)
{
setImage(run1r);
}
else if(frame == 2)
{
setImage(run2r);
}
else if(frame == 3)
{
setImage(run3r);
}
else if(frame == 4)
{
setImage(run4r);
frame = 1;
return;
}
frame++;
}
public void moveLeft()
{
setLocation(getX()-speed, getY());
if(animationCounter %4 == 0)
{
animateLeft();
}
}
public void animateLeft()
{
if(frame == 1)
{
setImage(run1l);
}
else if(frame == 2)
{
setImage(run2l);
}
else if(frame == 3)
{
setImage(run3l);
}
else if(frame == 4)
{
setImage(run4l);
frame = 1;
return;
}
frame++;
}
public boolean platformAbove()
{
int spriteHeight = getImage().getHeight();
int yDistance = (int)(spriteHeight/-2);
Actor ceiling = getOneObjectAtOffset(0, yDistance, Platform.class);
if(ceiling != null)
{
vSpeed = 1;
bopHead(ceiling);
return true;
}
else
{
return false;
}
}
public boolean checkRightWalls()
{
int spriteWidth = getImage().getWidth();
int xDistance = (int)(spriteWidth/2);
Actor rightWall = getOneObjectAtOffset(xDistance, 0, Platform.class);
if(rightWall == null)
{
return false;
}
else
{
stopByRightWall(rightWall);
return true;
}
}
public void stopByRightWall(Actor rightWall)
{
int wallWidth = rightWall.getImage().getWidth();
int newX = rightWall.getX() - (wallWidth + getImage().getWidth())/2;
setLocation(newX - 5, getY());
}
public boolean checkLeftWalls()
{
int spriteWidth = getImage().getWidth();
int xDistance = (int)(spriteWidth/-2);
Actor leftWall = getOneObjectAtOffset(xDistance, 0, Platform.class);
if(leftWall == null)
{
return false;
}
else
{
stopByLeftWall(leftWall);
return true;
}
}
public void stopByLeftWall(Actor leftWall)
{
int wallWidth = leftWall.getImage().getWidth();
int newX = leftWall.getX() + (wallWidth + getImage().getWidth())/2;
setLocation(newX + 5, getY());
}
public void bopHead(Actor ceiling)
{
int ceilingHeight = ceiling.getImage().getHeight();
int newY = ceiling.getY() + (ceilingHeight + getImage().getHeight())/2;
setLocation(getX(), newY);
}
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/2) + 5;
Actor ground = getOneObjectAtOffset(0, getImage().getHeight()/2, Platform.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())/2;
setLocation(getX(), newY);
jumping = false;
}
public void checkFall()
{
if(onGround())
{
vSpeed = 0;
}
else
{
fall();
}
}
public void jump()
{
vSpeed = vSpeed - jumpStrength;
jumping = true;
fall();
}
public void grab()
{
if (canSee(Key.class) )
{
get(Key.class);
haskey = true;
//Greenfoot.playSound("keyfound.wav");
}
}
public void exit()
{
if (canSee(Door.class) && haskey == true)
{
// Open door / Exit to new level
haskey = false; // Use key from inventory
//Greenfoot.playSound("keyfound.wav");
}
}
/**
* Return true if we can see an object of class 'clss' right where we are.
* False if there is no such object here.
*/
public boolean canSee(Class clss)
{
Actor actor = getOneObjectAtOffset(0, 0, clss);
return actor != null;
}
/**
* Try to grab an object of class 'clss'. This is only successful if there
* is such an object where we currently are. Otherwise this method does
* nothing.
*/
public void get(Class clss)
{
Actor actor = getOneObjectAtOffset(0, 0, clss);
if(actor != null) {
getWorld().removeObject(actor);
}
}
}
I also added some code to the "BadGuys" superclass so that I could use "cansee" and "eat" (which I changed to "get"):
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class BadGuys here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class BadGuys extends Actor
{
/**
* Act - do whatever the BadGuys wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
// Add your action code here.
}
/**
* Return true if we can see an object of class 'clss' right where we are.
* False if there is no such object here.
*/
public boolean canSee(Class clss)
{
Actor actor = getOneObjectAtOffset(0, 0, clss);
return actor != null;
}
/**
* Try to grab an object of class 'clss'. This is only successful if there
* is such an object where we currently are. Otherwise this method does
* nothing.
*/
public void get(Class clss)
{
Actor actor = getOneObjectAtOffset(0, 0, clss);
if(actor != null) {
getWorld().removeObject(actor);
}
}
}
No comments:
Post a Comment