I am having an issue with my actor falling through the floor semi-unpredictably. I have no clue what the issue is and I have tried several different methods of implementing a collision detection but the problem still persists. Anyone know what the issue may be? If you play around with the game a bit you will most likely see what I mean.
Scenario: http://www.greenfoot.org/scenarios/21295
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
*
*/
public class BobRoss extends Actor implements Movable{
private int speed;
private int maxSpeed;
private int jumpSpeed;
private int maxJump;
private int vSpeed;
private int accel;
private int frame;
private boolean isLeft;
private boolean isStill;
private long paintCooldown;
private boolean dead;
/**
*
*/
public BobRoss(){
speed = 25;
vSpeed = 0;
maxJump = 100;
accel = 10;
frame = 0;
paintCooldown = 0;
}
/**
*
*/
public BobRoss(int speed, int vSpeed, int accel){
this.speed = speed;
this.vSpeed = vSpeed;
this.accel = accel;
frame = 0;
jumpSpeed = 0;
paintCooldown = 0;
}
/**
* Checks for user input and Bob acts accordingly. This also checks if Bob
* is falling or has died.
*/
public void act(){
isStill = true;
checkInput();
fall();
takePalette();
if(isStill && !isLeft) setImage("BRStandR_0.png");
else if (isStill && isLeft) setImage("BRStandL_0.png");
if(happyAccident() || dead) {
getWorld().addObject(new Image("YouDied-Text.png"), 750, 200);
if(dead) {
try {
Thread.sleep(2000);
} catch(InterruptedException | IllegalMonitorStateException ex) {}
Greenfoot.setWorld(new Level(((Level)getWorld()).getLevelNum()));
}
dead = true;
}
}
/**
*
*/
public void checkInput() {
if(Greenfoot.isKeyDown("Left") && !Greenfoot.isKeyDown("Right")) {
isLeft = true;
isStill = false;
walkL();
}
if(Greenfoot.isKeyDown("Right") && !Greenfoot.isKeyDown("Left")) {
isLeft = false;
isStill = false;
walkR();
}
if(Greenfoot.isKeyDown("Up")) {
isStill = false;
jump();
}
if(Greenfoot.isKeyDown("Space")) {
isStill = false;
attack();
}
if(Greenfoot.isKeyDown("Left") && !Greenfoot.isKeyDown("Right") && Greenfoot.isKeyDown("Space")) {
isLeft = true;
isStill = false;
attackWalkL();
}
if(Greenfoot.isKeyDown("Right") && !Greenfoot.isKeyDown("Left") && Greenfoot.isKeyDown("Space")) {
isLeft = false;
isStill = false;
attackWalkR();
}
}
/**
*
*/
public void walkL() {
if(frame == 0) setImage("BRWalkL_0.png");
if(frame == 2) setImage("BRWalkL_1.png");
if(frame == 4) setImage("BRWalkL_2.png");
if(frame == 6)setImage("BRWalkL_3.png");
if(frame == 8) setImage("BRWalkL_4.png");
if(frame == 10) {
setImage("BRWalkL_5.png");
frame = 0;
setLocation(getX() - speed, getY());
return;
}
setLocation(getX() - speed, getY());
frame++;
}
/**
*
*/
public void walkR() {
if(frame == 0) setImage("BRWalkR_0.png");
if(frame == 2) setImage("BRWalkR_1.png");
if(frame == 4) setImage("BRWalkR_2.png");
if(frame == 6) setImage("BRWalkR_3.png");
if(frame == 8) setImage("BRWalkR_4.png");
if(frame == 10) {
setImage("BRWalkR_5.png");
frame = 0;
setLocation(getX() + speed, getY());
return;
}
setLocation(getX() + speed, getY());
frame++;
}
/**
*
*/
public void attack() {
int offset = 0;
if(isLeft){
setImage("BRAttackL.png");
offset = -90;
}
else {
setImage("BRAttackR.png");
offset = 90;
}
fire(offset);
}
/**
*
*/
public void attackWalkR() {
if(frame == 0) setImage("BRAttackWalkR_0.png");
if(frame == 2) setImage("BRAttackWalkR_1.png");
if(frame == 4) setImage("BRAttackWalkR_2.png");
if(frame == 6) setImage("BRAttackWalkR_3.png");
if(frame == 8) setImage("BRAttackWalkR_4.png");
if(frame == 10)setImage("BRAttackWalkR_5.png");
fire(90);
}
/**
*
*/
public void attackWalkL() {
if(frame == 0) setImage("BRAttackWalkL_0.png");
if(frame == 2) setImage("BRAttackWalkL_1.png");
if(frame == 4) setImage("BRAttackWalkL_2.png");
if(frame == 6)setImage("BRAttackWalkL_3.png");
if(frame == 8) setImage("BRAttackWalkL_4.png");
if(frame == 10) setImage("BRAttackWalkL_5.png");
fire(-90);
}
/**
*
*/
public void fire(int offset) {
if (System.currentTimeMillis() - paintCooldown >= 1000) {
getWorld().addObject(new PaintSplat(isLeft), getX() + offset, getY() + 22 );
paintCooldown = System.currentTimeMillis();
}
}
/**
*
*/
public void jump() {
if(jumpSpeed <= 0) {
jumpSpeed = maxJump;
return;
}
if(onGround()) {
jumpSpeed = maxJump;
}
if(isLeft) {
setImage("BRJumpL.png");
} else {
setImage("BRJumpR.png");
}
jumpSpeed -= accel;
setLocation(getX(), getY() - jumpSpeed);
}
/**
*
*/
public void fall() {
if(onGround()){
vSpeed = 0;
return;
}
vSpeed += accel;
setLocation(getX(), getY() + vSpeed);
antiNoClip();
}
/**
*
*/
public void antiNoClip() {
Actor clipTile = getOneIntersectingObject(Tiles.class);
while(clipTile != null) {
if(!onGround()) {
break;
}
setLocation(getX(), getY() - 1);
clipTile = getOneIntersectingObject(Tiles.class);
}
}
/**
*
*/
public boolean onGround() {
boolean result = false;
Actor belowL = getOneObjectAtOffset(-15, (getImage().getHeight()/2), Tiles.class);
Actor belowR = getOneObjectAtOffset(15, (getImage().getHeight()/2), Tiles.class);
Actor below = getOneObjectAtOffset(0, (getImage().getHeight()/2), Tiles.class);
if (belowL != null || belowR != null || below != null) {
result = true;
}
return result;
}
/**
*
*/
public boolean happyAccident() {
Actor enemy = getOneObjectAtOffset(15, 0, EvilRabbit.class);
if(enemy != null) return true;
enemy = getOneObjectAtOffset(-15, 0, EvilRabbit.class);
if(enemy != null) return true;
if(getY() > 394) return true;
return false;
}
/**
*
*/
public void takePalette() {
Actor palette = getOneObjectAtOffset(15, 0, Palette.class);
if(palette != null) removeTouching(Palette.class);
palette = getOneObjectAtOffset(-15, 0, Palette.class);
if(palette != null) removeTouching(Palette.class);
}
}

