When I move a platform, if the player jumps on a moving platform it will phase through the platform, and sometimes when a platform is hit from the side the player phases through the platform. Otherwise, it seems completely fine. Any thoughts on a solution?
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 { /** * Act - do whatever the Player wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. */ private int dir = 2; private boolean inTheAir = false; private int jumpHeight = 10; private int walkSpeed = 5; private double fallSpeed = 0.4; private double deltaX = 0; private double deltaY = 0; private int groundHeight = getImage().getHeight()/2; private int sideWidth = getImage().getWidth()/2; private World myWorld; int worldHeight; int worldWidth; int xPos; int yPos; private String[] fireboyRight = {"fireboyD.png", "fireboyD1.png", "fireboyD2.png"}; int currentImage; int currentImageU; private GreenfootImage myImage = getImage(); public void addedToWorld(World myWorld) { this.myWorld = myWorld; this.worldHeight = myWorld.getHeight(); this.worldWidth = myWorld.getWidth(); } public void act() { if(inTheAir) { fall(); } else { getCommand(); } checkCollision(); move(); animateOnMove(); } private void run(String direction) { if(direction == "left") { deltaX = walkSpeed * -1; } else { deltaX = walkSpeed; } } private void stop() { deltaX = 0; } private void jump() { deltaY -= jumpHeight; inTheAir = true; } private void fall() { deltaY += fallSpeed; } private void move() { double newX = getX() + deltaX; double newY = getY() + deltaY; Actor platformBelow = getOneObjectAtOffset((int)deltaX,groundHeight+14 + (int) deltaY, Platform.class); Actor platformAbove = getOneObjectAtOffset((int)deltaX,groundHeight-5 + (int) deltaY-60, Platform.class); Actor platformToLeft = getOneObjectAtOffset(sideWidth+5 + (int) deltaX,(int) deltaY,Platform.class); Actor platformToRight = getOneObjectAtOffset(sideWidth-5 + (int)deltaX,(int) deltaY,Platform.class); if(platformBelow!=null) { deltaY=0; inTheAir = false; newY = platformBelow.getY()-60; } else if(getY()>=worldHeight - groundHeight) { deltaY=0; inTheAir = false; } else { inTheAir = true; } if(platformAbove!=null) { if(deltaY<0) { deltaY=0; GreenfootImage platformImage = platformAbove.getImage(); int bottomOfPlatform = platformAbove.getY()+platformImage.getHeight()/2; newY = bottomOfPlatform + groundHeight; } } if(getX()<=sideWidth) { deltaX = Math.abs(deltaX); } if(getX()>=worldWidth-sideWidth) { deltaX = Math.abs(deltaX) * -1; } if(platformToRight!=null) { deltaX = 0; } if(platformToLeft!=null) { deltaX = 0; } setLocation((int)newX,(int)newY); } private void getCommand() { if(Greenfoot.isKeyDown("left")) { run("left"); } else if(Greenfoot.isKeyDown("right")) { run("right"); } else { stop(); } if(Greenfoot.isKeyDown("up")) { jump(); } } private void checkCollision() { if(isTouching(Fire.class)) { removeTouching(Player2.class); } } private void animateOnMove() { if(getX()!=xPos) { currentImage++; if(currentImage>=fireboyRight.length * 4) { currentImage=0; } GreenfootImage newImage = new GreenfootImage(fireboyRight[currentImage/4]); if(getX()<xPos) { newImage.mirrorHorizontally(); } setImage(newImage); myImage=getImage(); } else { setImage("Fireboy.png"); } xPos = getX(); yPos = getY(); } }