This site requires JavaScript, please enable it in your browser!
Greenfoot back
spencer_h
spencer_h wrote ...

2018/5/19

Help with actor falling through the floor randomly

spencer_h spencer_h

2018/5/19

#
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);
    }
}
danpost danpost

2018/5/19

#
I think it possible that because you are using two variable for vertical speed (namely vSpeed and jumpSpeed), your control is compromised on jumping which is causing problems with ground state. What was the purpose on having both of those fields?
spencer_h spencer_h

2018/5/19

#
I fixed the issue. It was an issue with the antiNoClip() method
You need to login to post a reply.