public BackgroundManager(GameController gc, Registry rg) {
        super(gc, rg);

        backgrounds = new ArrayList<Background>();
        parallaxBackgrounds = new ArrayList<Parallax>();

        int x, y;
        float ms;
        Background b;
        Parallax parallax;

        int camMapX = registry.getGameController().getMapOffsetX();
        int camMapY = registry.getGameController().getMapOffsetY();
        
        float moveFactor = 0.97f;
        for (int i = 0; i < CLOUD_BACKGROUND_COUNT; i++) {
            x = Rand.getRange(-(getPWidth()/2), getPWidth()*3/2);
            y = Rand.getRange(registry.getBlockManager().getMapSurfaceMin(), registry.getBlockManager().getMapSurfaceMax() + getPHeight() * 3);
            ms = (float) Rand.getFloat() + 0.5f;
            parallax = new Parallax(this, registry, "Background/Cloud" + Rand.getRange(1, 5), "Cloud", x, y, camMapX, camMapY, moveFactor, ms);
            parallaxBackgrounds.add(parallax);
        }
        moveFactor = 0.95f;
        for (int i = 0; i < MOUNTAIN_COUNT; i++) {
            x = Rand.getRange(-getPWidth(), (int)(gameController.getMapWidth()*(1-moveFactor)+gameController.getPWidth()));
            y = Rand.getRange(registry.getBlockManager().getMapSurfaceMin() - 400, registry.getBlockManager().getMapSurfaceMin() + 400);
            parallax = new Parallax(this, registry, "Background/Mountain" + Rand.getRange(1, 2), "Mountain", x, y, camMapX, camMapY, moveFactor, 0.0f);
            parallaxBackgrounds.add(parallax);
        }
        moveFactor = 0.9f;
        for (int i = 0; i < CLOUD_FORGROUND_COUNT; i++) {
            x = Rand.getRange(-(getPWidth()/2), getPWidth()*3/2);
            y = Rand.getRange(registry.getBlockManager().getMapSurfaceMin(), registry.getBlockManager().getMapSurfaceMax() + getPHeight() * 3);
            ms = (float) Rand.getFloat() + 0.5f;
            parallax = new Parallax(this, registry, "Background/Cloud" + Rand.getRange(1, 5), "Cloud", x, y, camMapX, camMapY, moveFactor, ms);
            parallaxBackgrounds.add(parallax);
        }
        moveFactor = 0.75f;
        for (int i = 0; i < TREES_COUNT; i++) {
            x = Rand.getRange(-50, (int)(gameController.getMapWidth()*(1-moveFactor)+gameController.getPWidth()));
            y = Rand.getRange(registry.getBlockManager().getMapSurfaceMin() - 500, registry.getBlockManager().getMapSurfaceMin() - 50);
            parallax = new Parallax(this, registry, "Background/Tree2", "Tree", x, y, camMapX, camMapY, moveFactor, 0.0f);
            parallaxBackgrounds.add(parallax);
        }
        moveFactor = 0.65f;
        for (int i = 0; i < TREES_COUNT; i++) {
            x = Rand.getRange(-50, (int)(gameController.getMapWidth()*(1-moveFactor)+gameController.getPWidth()));
            y = Rand.getRange(registry.getBlockManager().getMapSurfaceMin() - 500, registry.getBlockManager().getMapSurfaceMin() - 50);
            parallax = new Parallax(this, registry, "Background/Tree1", "Tree", x, y, camMapX, camMapY, moveFactor, 0.0f);
            parallaxBackgrounds.add(parallax);
        }
    }