package chu.engine.anim; import java.io.IOException; import java.util.HashMap; import org.newdawn.slick.opengl.Texture; import org.newdawn.slick.opengl.TextureLoader; import org.newdawn.slick.util.ResourceLoader; public class BitmapFont { private Texture texture; private int glyphHeight; private int spacing; private HashMap<Character, Glyph> glyphs; public BitmapFont(String texName) { try { texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/fonts/"+texName+".png")); } catch (IOException e) { e.printStackTrace(); } glyphs = new HashMap<Character, Glyph>(); } public void setHeight(int height) { glyphHeight = height; } public void setSpacing(int spacing) { this.spacing = spacing; } public void put(char c, int pos, int width) { glyphs.put(c, new Glyph(pos, width)); } public void render(String string, float beginX, float beginY, float depth) { int x = (int)beginX; for(char c : string.toCharArray()) { Glyph g = glyphs.get(c); if(g == null) { System.err.println("I don't have this character: '"+c+"'"); continue; } float tx0 = (float)g.pos/texture.getImageWidth(); float tx1 = (float)(g.pos+g.width)/texture.getImageWidth(); Renderer.render(texture, tx0, 0, tx1, 1, x, beginY, x+g.width, beginY+glyphHeight, depth); x += g.width; x += spacing; } } public void render(String string, float beginX, float beginY, float depth, Transform t) { int x = (int)beginX; for(char c : string.toCharArray()) { Glyph g = glyphs.get(c); float tx0 = (float)g.pos/texture.getImageWidth(); float tx1 = (float)(g.pos+g.width)/texture.getImageWidth(); Renderer.render(texture, tx0, 0, tx1, 1, x, beginY, x+g.width, beginY+glyphHeight, depth, t); x += g.width * (t != null?t.scaleX:1); x += spacing * (t != null?t.scaleX:1); } } public int getStringWidth(String string) { int width = 0; for(char c : string.toCharArray()) { width += glyphs.get(c).width; width += spacing; } return width; } public boolean containsCharacter(char c) { return glyphs.containsKey(c); } private class Glyph { int pos; int width; public Glyph(int pos, int width) { this.pos = pos; this.width = width; } } }