Got some collision code problems

Hi :slight_smile: I made this collision code, but its a little buggy. My player cant move either right or left and up or down when standing next to a wall. I’m pretty sure it has to do with detecting which rectangle is close to the player. I also want to optimise it so that it only checks the rectangles closest to the player :slight_smile: Any help would be nice :slight_smile:

public void collision(){
        	
        	//Collision
            //Save old position
            float oldX = getX();
            float oldY = getY();
            boolean collisionX = false, collisionY = false;
            
            rectPlayer.setSize(rectPlayer.getWidth() / world.getUnitScale(), rectPlayer.getWidth() / world.getUnitScale());

            // move on x
            setX(getX() + speedX / world.getUnitScale());

            if(speedX < 0) { // going left
                    for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                    	if(getX() > world.getCollisionBoxes().get(i).x){
                    		if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                    			collisionX = true;
                    			
                    			System.out.println("Left");
                    		}
                    	}
                    }
            }else if(speedX > 0) { // going right
            	for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                	if(getX() < world.getCollisionBoxes().get(i).x){
                		if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                			collisionX = true;
                			
                			System.out.println("Right");
                		}
                		
                	}
                }
            }
            // react to x collision
            if(collisionX) {
                    setX(oldX);
                    speedX = 0;
            }

            // move on y
            setY(getY() + speedY / world.getUnitScale());

            if(speedY < 0) { // going down
            	for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                	if(getY() > world.getCollisionBoxes().get(i).y){
                		if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                			collisionY = true;
                			
                			System.out.println("Down");
                		}
                		
                	}
                }
            }else if(speedY > 0) { // going up
            	for(int i = 0; i < world.getCollisionBoxes().size(); i++){
                	if(getY() < world.getCollisionBoxes().get(i).y){
                		if(rectPlayer.overlaps(world.getCollisionBoxes().get(i))){
                			collisionY = true;
                			
                			System.out.println("Up");
                		}
                		
                	}
                } 
            }
            
            // react to y collision
            if(collisionY) {
                    setY(oldY);
                    speedY = 0;
            }

            rectPlayer.setSize(rectPlayer.getWidth() * world.getUnitScale(), rectPlayer.getHeight() * world.getUnitScale());
            
        }