/**
*
*/
package com.javaxyq.tools;
import java.awt.Point;
import java.io.InputStream;
import java.util.Scanner;
public class SpriteDescriptorImpl implements SpriteDescriptor {
private int animCount;
private int frameCount;
private int[][] widths;
private int[][] heights;
private Point [][] refPixels;
public SpriteDescriptorImpl(int animCount, int frameCount) {
super();
initialize(animCount, frameCount);
}
public SpriteDescriptorImpl() {
}
private void initialize(int animCount, int frameCount) {
this.animCount = animCount;
this.frameCount = frameCount;
this.widths = new int[animCount][frameCount];
this.heights = new int[animCount][frameCount];
refPixels = new Point[animCount][frameCount];
}
@Override
public int getAnimCount() {
return animCount;
}
@Override
public int getFrameCount() {
return frameCount;
}
public void setFrameWidth(int animIndex, int frameIndex, int width) {
int[] framewidths = this.widths[animIndex];
framewidths[frameIndex] = width;
}
public void setFrameHeight(int animIndex, int frameIndex, int height) {
int[] frameheights = this.heights[animIndex];
frameheights[frameIndex] = height;
}
@Override
public int getFrameHeight(int animIndex, int frameIndex) {
return heights[animIndex][frameIndex];
}
@Override
public int getFrameWidth(int animIndex, int frameIndex) {
return widths[animIndex][frameIndex];
}
@Override
public int getFrameLeft(int animIndex, int frameIndex) {
int xx = 0;
int[] framewidths = widths[animIndex];
for (int i = 0; i< frameIndex && i < framewidths.length; i++) {
xx += framewidths[i];
}
return xx;
}
@Override
public int getFrameTop(int animIndex, int frameIndex) {
int yy = 0;
int[] frameheights = heights[animIndex];
for (int i = 0; i< frameIndex && i < frameheights.length; i++) {
yy += frameheights[i];
}
return yy;
}
@Override
public int getTotalWidth() {
int total = 0;
for (int i = 0; i < animCount; i++) {
total = Math.max(total, getFrameTotalWidth(i));
}
return total;
}
@Override
public int getTotalHeight() {
int total = 0;
for (int i = 0; i < animCount; i++) {
total = Math.max(total, getFrameTotalHeight(i));
}
return total;
}
private int getFrameTotalWidth(int animIndex) {
int sum = 0;
int[] framewidths = widths[animIndex];
for (int i = 0; i < framewidths.length; i++) {
sum += framewidths[i];
}
return sum;
}
private int getFrameTotalHeight(int animIndex) {
int sum = 0;
int[] frameheights = heights[animIndex];
for (int i = 0; i < frameheights.length; i++) {
sum += frameheights[i];
}
return sum;
}
public void setFrameRefPixel(int animIndex, int frameIndex, int refPixelX, int refPixelY) {
refPixels[animIndex][frameIndex] = new Point(refPixelX, refPixelY);
}
@Override
public Point getFrameRefPixel(int animIndex, int frameIndex) {
return refPixels[animIndex][frameIndex];
}
@Override
public void decode(String source) {
Scanner scanner = new Scanner(source);
decode(scanner);
}
public void decode(InputStream source) {
Scanner scanner = new Scanner(source);
decode(scanner);
}
private void decode(Scanner scanner) {
scanner.useDelimiter("[\\s\\,]");
String first = scanner.nextLine();
if(!first.startsWith("sprite_descriptor")) {
// ��ʽ����
return ;
}
//animCount frameCount
animCount = scanner.nextInt();
frameCount = scanner.nextInt();
initialize(animCount, frameCount);
//anim lines
for (int i = 0; i < animCount; i++) {
//frames(refPixelX, refPixelY, width, height)
for (int f = 0; f < frameCount; f++) {
scanner.skip("[\\s\\(]*");
int refPixelX = scanner.nextInt();
int refPixelY = scanner.nextInt();
int width = scanner.nextInt();
int height = scanner.nextInt();
this.setFrameRefPixel(i, f, refPixelX, refPixelY);
this.setFrameWidth(i, f, width);
this.setFrameHeight(i, f, height);
scanner.skip("[\\s\\)]*");
}
}
}
@Override
public String encode() {
StringBuilder sb = new StringBuilder();
sb.append("sprite_descriptor{\r\n");
sb.append(animCount).append(" ").append(frameCount).append("\r\n");
for (int i = 0; i < animCount; i++) {
for(int f=0; f<frameCount; f++) {
Point p = getFrameRefPixel(i, f);
sb.append("( ");
sb.append(p.x).append(",");
sb.append(p.y).append(",");
sb.append(getFrameWidth(i, f)).append(",");
sb.append(getFrameHeight(i, f));
sb.append(" )");
if(f < frameCount-1) {
sb.append(" ");
}
}
sb.append("\r\n");
}
sb.append("}");
return sb.toString();
}
// public static void main(String[] args) throws FileNotFoundException {
// File file = new File("C:\\Documents and Settings\\Administrator\\����\\test3\\des.txt");
// SpriteDescriptorImpl descriptor = new SpriteDescriptorImpl();
// descriptor.decode(new FileInputStream(file));
// System.out.println("decode descriptor: "+descriptor.encode());
// }
}