Package games.stendhal.client

Source Code of games.stendhal.client.CompositeLayerRenderer

/***************************************************************************
*                   (C) Copyright 2003-2010 - Stendhal                    *
***************************************************************************
***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
***************************************************************************/
package games.stendhal.client;

import games.stendhal.client.sprite.CompositeSprite;
import games.stendhal.client.sprite.Sprite;
import games.stendhal.client.sprite.SpriteCache;

import java.util.ArrayList;
import java.util.List;

/**
* A LayerRenderer that merges several tile layers in to one using
* CompositeSprites.
*/
public class CompositeLayerRenderer extends TileRenderer {
  /**
   * Create a CompositeLayerRenderer from a set of {@link TileRenderer}s
   *
   * @param layerRenderers TileRenderers used for compositing
   */
  public CompositeLayerRenderer(List<TileRenderer> layerRenderers) {
    LayerRenderer lr = layerRenderers.get(0);
    width = lr.getWidth();
    height = lr.getHeight();
   
    Sprite maps[][] = new Sprite[layerRenderers.size()][];
    int i = 0;
    for (LayerRenderer layer : layerRenderers) {
      maps[i] = ((TileRenderer) layer).spriteMap;
      i++;       
    }
    createComposites(layerRenderers);
  }

  /**
   * Fill the spriteMap with composite sprites.
   *
   * @param renderers slave layers
   */
  private void createComposites(List<TileRenderer> renderers) {
    int size = width * height;
    spriteMap = new Sprite[size];
    SpriteCache cache = SpriteCache.get();
    int layers = renderers.size();
   
    List<Sprite> slaveSprites = new ArrayList<Sprite>(layers);
   
    for (int i = 0; i < size; i++) {
      for (TileRenderer r : renderers) {
        slaveSprites.add(r.tileset.getSprite(r.map[i]));
      }
      spriteMap[i] = CompositeSprite.getComposite(cache, slaveSprites);
      slaveSprites.clear();
    }
   
    // Wipe out unneeded data from the slaves. Assumes their draw() method
    // will not be called from anywhere. The renderers will be useless by
    // themselves after this, so if the assumption changes, this needs code
    // will need to be revisited
    for (TileRenderer r : renderers) {
      r.map = null;
      r.spriteMap = null;
      r.tileset = null;
    }
  }
}
TOP

Related Classes of games.stendhal.client.CompositeLayerRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.