Moin,
nachdem ich Wochenlang meine GUI-API für Slick geschrieben hab, bin ich soweit für meine Zwecke fertig, allerdings crasht mir das Spiel
aus unerfindlichen Gründen immer wieder, wenn die Zelle das Boolean AutoAdjust auf true hat. Dieses Boolean bewirkt, das wenn das Font der Zelle die Zellenmaße
sprengt, die Fontgröße per Dreisatz auf den idealen Grenzwert gebracht wird. Dabei muss, aus welchen Gründen auch immer, ein neues Fontobjekt erstellt werden(Ich
überschreibe das alte einfach!). Dabei kommt eben dieser Fehler:
Thu Sep 26 22:23:27 CEST 2013 ERROR:Invalid font:
org.newdawn.slick.SlickException: Invalid font:
at org.newdawn.slick.UnicodeFont.createFont(UnicodeFont.java:63)
at org.newdawn.slick.UnicodeFont.<init>(UnicodeFont.java:173)
at de.frostbyteger.pong.engine.graphics.FontHelper.newFont(FontHelper.java:18)
at de.frostbyteger.pong.engine.graphics.ui.gui.Cell.drawCell(Cell.java:253)
at de.frostbyteger.pong.core.MainMenu.render(MainMenu.java:75)
at org.newdawn.slick.state.StateBasedGame.render(StateBasedGame.java:199)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:688)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at de.frostbyteger.pong.start.Pong.main(Pong.java:120)
Caused by: java.awt.FontFormatException: java.nio.BufferUnderflowException
at sun.font.TrueTypeFont.init(TrueTypeFont.java:558)
at sun.font.TrueTypeFont.<init>(TrueTypeFont.java:191)
at sun.font.SunFontManager.createFont2D(SunFontManager.java:2460)
at java.awt.Font.<init>(Font.java:614)
at java.awt.Font.createFont0(Font.java:968)
at java.awt.Font.createFont(Font.java:876)
at org.newdawn.slick.UnicodeFont.createFont(UnicodeFont.java:61)
... 9 more
Thu Sep 26 22:23:27 CEST 2013 ERROR:Game.render() failure - check the game code.
org.newdawn.slick.SlickException: Game.render() failure - check the game code.
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:691)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at de.frostbyteger.pong.start.Pong.main(Pong.java:120)
Weiß jemand warum? Ich konnte bisher beobachten, das wenn ich die Fontgröße von vorneherein etwas verkleinere, der Fehler zumindest für diese Zelle nichtmehr auftritt.
Lustigerweise muss ich die Zelle, die danach erstellt wird, noch etwas weiter verkleinern, also die Fontgröße. Irgendwann würden dann negative Werte rauskommen!
Zum besseren Verständnis hier die FontHelper Klasse und das AutoAdjust Segment:
FontHelper:
public class FontHelper {
@SuppressWarnings("unchecked")
public static UnicodeFont newFont(String font,int fontsize, boolean bold, boolean italic) throws SlickException{
UnicodeFont unifont = new UnicodeFont(font,fontsize , bold, italic);
unifont.addAsciiGlyphs();
unifont.getEffects().add(new ColorEffect());
unifont.loadGlyphs();
return unifont;
}
}
AutoAdjust Segment:
if(autoAdjust == true){ //TODO: Add algorithm for increasing fontsize
if(cellFont != null){
if(cellFont.getWidth(cellText) >= cell.getWidth()) {
float i = (float)cellFont.getWidth(cellText) / (float)size;
if(cell.getWidth() > cellDrawOffsetX){
size = (int) ((cell.getWidth() - cellDrawOffsetX) / i);
}else{
size = (int) (cell.getWidth() / i);
}
cellFont = FontHelper.newFont(fontPath, size, bold, italic);
}else if(cellFont.getHeight(cellText) >= cell.getHeight()){ //Im Normalfall wird dieser Abschnitt nicht ausgeführt, da das Font eher die Breite sprengt, als die Höhe!
float i = (float)cellFont.getHeight(cellText) / (float)size;
if(cell.getHeight() > cellDrawOffsetY){
size = (int) ((cell.getHeight() - cellDrawOffsetY) / i);
}else{
size = (int) (cell.getHeight() / i);
}
cellFont = FontHelper.newFont(fontPath, size, bold, italic);
}
}
}