to lessen the load a little bit, or just to avoid unnessecary redundancy, I made it so that each layer takes the normal camera unless a parallax camera is set.
Per frame (using SpriteCache here, you may use SpriteBatch or anything else of course)
if (parallaxCamera != null)
{
updateParallaxCamera(camera);
spriteCache.setProjectionMatrix(parallaxCamera.combined);
}
else
{
spriteCache.setProjectionMatrix(camera.combined);
}
spriteCache.begin();
spriteCache.draw(cacheID);
spriteCache.end();
public void updateParallaxCamera(OrthographicCamera normalCamera)
{
parallaxCamera.zoom = normalCamera.zoom;
minX = (Gdx.graphics.getWidth()*0.5f)*normalCamera.zoom;
maxX = (baseWidth*TILESIZE) - ((Gdx.graphics.getWidth()*0.5f)*normalCamera.zoom);
minXpara = (Gdx.graphics.getWidth()*0.5f)*parallaxCamera.zoom;
maxXpara = (width*TILESIZE) - ((Gdx.graphics.getWidth()*0.5f)*parallaxCamera.zoom);
minY = (Gdx.graphics.getHeight()*0.5f)*normalCamera.zoom;
maxY = (baseHeight*TILESIZE) - ((Gdx.graphics.getHeight()*0.5f)*normalCamera.zoom);
minYpara = (Gdx.graphics.getHeight()*0.5f)*parallaxCamera.zoom;
maxYpara = (height*TILESIZE) - ((Gdx.graphics.getHeight()*0.5f)*parallaxCamera.zoom);
parallaxCamera.position.x = minXpara + (((maxXpara-minXpara)/100f)*((100.0f/(maxX-minX))*(normalCamera.position.x - minX)));
parallaxCamera.position.y = minYpara + (((maxYpara-minYpara)/100f)*((100.0f/(maxY-minY))*(normalCamera.position.y - minY)));
parallaxCamera.update();
}
I kinda calculated this percentage wise.
I think it doesnt yet work properly if you wanna have one layer zoomed and one not and so on, but I dont need that so I didnt bother fixing it; but it would be easy to do so.