Colission Detection + ECS

Hey I wrote a while back a Colission Detection which works more or less.
The problem is that if i am pressing up and left or right and above me is a colission Tile my Sprite goes the whole way right/left to the last colission Tile and I dont get why.

And how can I make it more intuitive? Because I want to be able to rotate Sprite, so they are not just looking in one of the four directions.

atm, I am doing it so:

TiledMapTileLayer colissionLayer = (TiledMapTileLayer) gameMap.getLayers().get("colission");

        Vector3 colissionTile = null;
        if (colissionLayer != null || colissionOn) {
            if (pseudoPlayer == null) this.pseudoPlayer = new Player(player.getPostition(), player.getImage());
            pseudoPlayer.setFacing(player.getFacing());
            pseudoPlayer.setX(player.getX());
            pseudoPlayer.setY(player.getY());
            pseudoPlayer.update(elpasedTime);
            colissionTile = Collision.getTileColission(pseudoPlayer, colissionLayer, "blocked");
        }
        if (colissionTile == null) {
            player.update(elpasedTime);
        } else {
            switch (player.getFacing()) {
                case RIGHT:
                    player.setX(colissionTile.x - player.getWidth() - 1);
                    break;
                case LEFT:
                    player.setX(colissionTile.x + getTileSize() + 1);
                    break;
                case UP:
                    player.setY(colissionTile.y - player.getHeight() - 1);
                    break;
                case DOWN:
                    player.setY(colissionTile.y + getTileSize() + 1);
                    break;
            }
        }

    public static Vector3 getTileColission(IEntiy entity, TiledMapTileLayer layer, String term) {
        float y = entity.getY(), x = entity.getX();
        float TILE_SIZE = layer.getTileWidth();

        int tileX = (int) (x / TILE_SIZE);
        int tileY = (int) (y / TILE_SIZE);

        Vector3 tileA = new Vector3(x, y, 0);
        Vector3 ereg = new Vector3(0, 0, 0);
        int width = (int) entity.getWidth();
        int height = (int) entity.getHeight();

        tileA.x = tileX * TILE_SIZE;
        tileA.y = tileY * TILE_SIZE;
        if (intersects(entity, tileA, 32, 32) && !tileisFree(tileX, tileY, layer, term)) {


            return ereg.set(World.tilesToPixels(tileX, (int) TILE_SIZE), World.tilesToPixels(tileY, (int) TILE_SIZE), 0);
        }

        x += width;
        tileX = (int) (x / TILE_SIZE);
        if (intersects(entity, tileA, 32, 32) && !tileisFree(tileX, tileY, layer, term)) {
            return ereg.set(World.tilesToPixels(tileX, (int) TILE_SIZE), World.tilesToPixels(tileY, (int) TILE_SIZE), 0);
        }

        x -= width;
        y += height;
        tileY = (int) (y / TILE_SIZE);
        tileX = (int) (x / TILE_SIZE);
        if (intersects(entity, tileA, 32, 32) && !tileisFree(tileX, tileY, layer, term)) {
            return ereg.set(World.tilesToPixels(tileX, (int) TILE_SIZE), World.tilesToPixels(tileY, (int) TILE_SIZE), 0);
        }

        x += width;
        tileX = (int) (x / TILE_SIZE);
        if (intersects(entity, tileA, 32, 32) && !tileisFree(tileX, tileY, layer, term)) {
            return ereg.set(World.tilesToPixels(tileX, (int) TILE_SIZE), World.tilesToPixels(tileY, (int) TILE_SIZE), 0);
        }

        return null;
    }

So, how can I avoid that?

I recently discovered Entity Systems and like the concept so far.
How should I make an Colission System? And how to communicate between the Systems?
I thought about just processing the Movement System and then a collide System. If in the collide System a colission is detected it would set the sprite to the next safe place.
How to make an InputComponent? I thought about making just an COmponent with a List<Input.keys, Gameaction> this is then rendered by an System which checks if and key of the COmponent is pressend and then takes the GameAction and performs and Action depending on the GameAction.

Edit PseudoCode:


method1(){
if(checkifColissionLayer){
    generate pseudoPlayer; set values to values of Player
    update pseudoPlayer;
    Vector3 clollTile= checkColission(pseudoPlayer)   //collTile is bottom left pixel of Tile
}
if(colltile==null) player.update;  //no colission
else
adjust player position depending on Direction he moved last
so, if the player last pressed up and there is an colission -> above me is an colissionTile -> calculate nearest pixel to the colissionTile
}

Vector3 checkColission(Player p,Layer l, String term){ //l... The layer where colissionTiles are exppected;  term... the property of a Tile if is colidable
tileX,TileY = The Tile, the player is standing on

calculate for all four corners the pixel Position and then change it back to the x,y coordinate of the Tile
if the player intersects with this Tile and the Tile is not free -> return bottom left Vector of the Tile the colission happened.

}


I already read many articles about Colission Detection, but didnt undersand them. So developed this one for my own. Although I knew that its not very sophisticated.

Well, has nobody an clue whats wrong?

I have no clue how your game looks, so i cant really tell how you make something more intuitive.

About the collission however, try to check both x, and y axis, and calculate the smallest path to some free space.
I dont really get your code, so i dont know what you are doing atm.
Maybe you could just write down in steps how you are checking colission now.

Okay, thx.
Updated the first post, hope somebody can now imagine what I am doing. But I basiclly guess that my Player has such a bad behaviour, due to the Input of more than one Key.