Ich habe folgende Enum-Datei "DevelopmentCardType":ExceptionInInitializerError mit Aufzählungen in Libgdx
enum DevelopmentCardType {
KNIGHT (0, new Texture(Gdx.files.internal("knight_card.png")));
VICTORY_POINT (1, new Texture(Gdx.files.internal("victory_point_card.png"))),
private final Texture cardTexture;
private final int type;
private static final List<DevelopmentCardType> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
DevelopmentCardType(int type, Texture cardTexture) {
this.type = type;
this.cardTexture = cardTexture;
}
public Texture getCardTexture() {
return cardTexture;
}
public static List<DevelopmentCardType> getVALUES() {
return VALUES;
}
}
auf einem Sockel Ereignis ein neues DevelopmentCard erstellt
"DevelopmentCard" Klasse:
class DevelopmentCard extends Card {
private float[] vertices = {
0, 0,
512, 0,
512, 512,
0, 512
};
DevelopmentCard (int type) {
super(0, 0, 70, 100);
this.type = type;
createResourceCardSprite(type);
}
private void createResourceCardSprite(int resourceType) {
Texture cardTexture = DevelopmentCardType.getVALUES().get(resourceType).getCardTexture();
TextureRegion textureRegion = new TextureRegion(cardTexture);
PolygonRegion polygonRegion = new PolygonRegion(textureRegion, vertices, new EarClippingTriangulator().computeTriangles(vertices).toArray());
card = new PolygonSprite(polygonRegion);
}
}
Wenn eine neue DevelopmentCard erstellt wird, erstellt sie einen ExceptionInInitializerError "verursacht durch", da kein OpenGL-Kontext vorhanden ist.
Das bedeutet, dass die Texturen, die in der Enumeration verwendet werden, noch nicht erstellt wurden. Deshalb möchte ich das tun, bevor ich die Enumeration bei einem Socket-Ereignis verwende. Ich kann es beheben, indem ich der DevelopmentCardType-Klasse eine init-Methode hinzufüge (ich verstehe, dass das Aufrufen irgendeiner Methode (die wie diese leer sein kann) in der Enumeration noch im OpenGL-Kontext das Problem behebt, ich bin mir nicht sicher, ob das ist das richtige zu tun):
static void init() {}
und diese in der Klasse "Main" wie DevelopmentCardType.init();
aufrufen.
Ist dies der richtige Weg, um dieses Problem zu umgehen? Ich kann das Problem auch beheben, indem ich eine DevelopmentCard noch im OpenGL-Kontext erstelle, danach führt das Erstellen neuer DevelopmentCard-Instanzen nicht zu Fehlern.
Ich werde sehen, wenn ich den AssetManager verstehe, werde ich auf diese Antwort zurückkommen. –
Also muss ich die AssetManager-Instanz durch viele Konstruktoren und alle Instanzen von DevelopmentCard und anderen Klassen übergeben? Ist das nicht langsam? Oder meinst du das? –
Ich habe den AssetManager implementiert, der verwendete RAM wurde halbiert, und ich muss jetzt keine Methode aufrufen, bevor ich sie verwenden kann. Danke :) –