Package kku.cs.fgl

Source Code of kku.cs.fgl.SpriteManager

package kku.cs.fgl;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberInputStream;
import java.io.LineNumberReader;
import java.util.Properties;
import java.util.TreeMap;
import java.util.Vector;

import kku.cs.util.ColorUtils;
import kku.cs.util.StringUtil;

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.util.ResourceLoader;

public class SpriteManager {

  private TreeMap<String, SpriteGroup> groupMap = new TreeMap<String, SpriteGroup>();
  private TreeMap<String, SpriteSheet> sheetMap = new TreeMap<String, SpriteSheet>();
  private TreeMap<String, Image> imagesMap = new TreeMap<String, Image>();

  public SpriteManager() {

  }

  public void add(String name, SpriteSheet sheet) {
    sheetMap.put(name, sheet);
  }

  public void add(String groupname, SpriteCell... cells) {
    SpriteGroup gr = groupMap.get(groupname);
    if (gr == null) {
      gr = new SpriteGroup();
      groupMap.put(groupname, gr);
    }
    gr.add(cells);
  }

  public void add(String groupname, SpriteSheet sheet, int... cellsNo) {
    SpriteCell[] cells = new SpriteCell[cellsNo.length];
    for (int i = 0; i < cellsNo.length; i++) {
      cells[i] = sheet.getCell(cellsNo[i]);
    }
    add(groupname, cells);
  }

  public void add(String groupname, SpriteSheet sheet, String cellsList) {
    String[] cellsA = cellsList.split(",");
    Vector v = new Vector();
    for (int i = 0; i < cellsA.length; i++) {
      try {
        int cno = Integer.parseInt(cellsA[i]);
        v.add(new Integer(cno));
      } catch (Exception e) {
      }
    }
    int cellsNo[] = new int[v.size()];
    for (int i = 0; i < v.size(); i++) {
      cellsNo[i] = ((Integer) (v.get(i))).intValue();
    }
    add(groupname, sheet, cellsNo);
  }

  public SpriteGroup getGroup(String groupname) {
    return getGroup(groupname, false);
  }

  public SpriteGroup getGroup(String groupname, boolean autoCreate) {
    SpriteGroup g = groupMap.get(groupname);
    if (autoCreate && g == null) {
      g = new SpriteGroup();
      groupMap.put(groupname, g);
    }
    return g;
  }

  public SpriteSheet getSheet(String name) {
    return (SpriteSheet) (sheetMap.get(name));
  }
 
  public void clear(){
    groupMap.clear();
    sheetMap.clear();
    imagesMap.clear();   
  }

  /**
   * Read Sprite Define from file File Format (ini) image.name=filename
   * sheet.name=image.name
   *
   * @param file
   */
  public void load(String file) {
    // format
    int mode = 0;
   
    String sheetName = "";
    String spriteName = "";
    BufferedInputStream in = ResourceLoader.getResourceAsStream(file);
    if (in != null) {
      // prop.
      // LineNumberInputStream lin = new LineNumberInputStream(in);
      LineNumberReader lin = new LineNumberReader(new InputStreamReader(
          in));
      try {
        String s;
        while ((s = lin.readLine()) != null) {
          s = s.trim();
          if (s.length() < 2)
            continue;
          if (s.charAt(0) == '#')
            continue;
          if (s.startsWith("[images")) {
            mode = 1;
            continue;
          }
          if (s.startsWith("[sheet")) {
            String v[] = s.split("=");
            sheetName = v[1].substring(0, v[1].indexOf(']')).trim();
            mode = 2;
            continue;
          }
          if (s.startsWith("[sprite")) {
            String v[] = s.split("=");
            spriteName = v[1].substring(0, v[1].indexOf(']'))
                .trim();
            mode = 3;
            continue;
          }

          try {
            if (mode == 1)
              load_images(s);
            if (mode == 2)
              load_sheet(sheetName, s);
            if (mode == 3)
              load_sprite(spriteName, s);
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  private void load_sprite(String spriteName, String s) {
    SpriteGroup g = getGroup(spriteName, true);
    if (s.startsWith("delay")) {
      String v[] = StringUtil.split(s, "=");
      g.setDelay(Integer.parseInt(v[1]));
      System.out.println(spriteName+".setDelay("+v[1]+")");     
      return;
    }
    String data[] = s.split(":");
    SpriteSheet sheet = null;
    int cellno = 0, x = 0, y = 0, delay = -1;
    boolean fh = false, fv = false;

    // parse cell list
    for (String a : data[0].split(",")) {
      // sheet.index
      // System.out.println("   ("+a+")");
      String scell[] = StringUtil.split(a, '.');
      sheet = getSheet(scell[0]);
      cellno = Integer.parseInt(scell[1]);
    }
    // parse option
    if (data.length >= 2) {
      for (String a : data[1].split(",")) {
        String v[] = StringUtil.split(a, "=");
        if (v[0].equalsIgnoreCase("h"))
          fh = true;
        else if (v[0].equalsIgnoreCase("v"))
          fh = true;
        else if (v[0].equalsIgnoreCase("x")) {
          x = Integer.parseInt(v[1]);
        } else if (v[0].equalsIgnoreCase("y")) {
          y = Integer.parseInt(v[1]);
        } else if (v[0].equalsIgnoreCase("delay")) {
          delay = Integer.parseInt(v[1]);
        }
      }
    }
    if (sheet != null) {
      SpriteCell cell = sheet.getCell(cellno);
      if (cell != null) {
        g.add(cell, x, y, fh, fv, delay);
      }
    }
  }

  private void load_sheet(String sheetName, String s) {
    String v[] = StringUtil.split(s, '(', ',', ')');
    SpriteSheet st = getSheet(sheetName);
    if (st == null) {
      st = new SpriteSheet();
      sheetMap.put(sheetName, st);
    }
    int p1 = s.indexOf('(');
    int p2 = s.indexOf(')');
    if (p1 == 0 || p2 == 0)
      return;
    int n[] = new int[5];
    for (int i = 2; i < v.length; i++) {
      if(v[i].length()==0)continue;
      n[i - 2] = Integer.parseInt(v[i]);
    }
    if (v[0].equalsIgnoreCase("addcells")) {
      Image g = getImage(v[1]);
      st.addSheet(g, n[0], n[1], n[2]);
    } else if (v[0].equalsIgnoreCase("addcell")) {
      Image g = getImage(v[1]);
      if (v.length >= 4) {
        st.add(g, n[0], n[1], n[2], n[3]);
      } else {
        st.add(g);
      }
    }
  }

  private void load_images(String s) {
//    System.out.println("load_images("+s+")");
    String v[] = StringUtil.split(s,'=',',');
    if (v.length >= 2) {
      try {
        Color c=null;
        if(v.length>2){
          c=new Color(v[2]);
        }
//        System.out.println(" img="+v[0]+" src="+v[1]);
        Image img = new Image(v[1],c);
        imagesMap.put(v[0], img);
      } catch (SlickException e) {
        e.printStackTrace();
      }

    }
  }

  public Image getImage(String img) {
    if (imagesMap.containsKey(img)) {
      return imagesMap.get(img);
    }
    return null;
  }

}
TOP

Related Classes of kku.cs.fgl.SpriteManager

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.