Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Exception in thread "EventHandler (Server)" java.lang.NullPointerException
at de.limdul.cassiopeia.control.tcpip.commands.TCPCommand.validString(TCPCommand.java:289)
at de.limdul.cassiopeia.control.tcpip.commands.AddSet.<init>(AddSet.java:30)
at de.limdul.cassiopeia.control.servermodus.ServerConnecting.parseRegisterPlayer(ServerConnecting.java:161)
at de.limdul.cassiopeia.control.servermodus.ServerConnecting.parseTCPCommand(ServerConnecting.java:68)
at de.limdul.cassiopeia.control.EventHandler.realDistributeCommand(EventHandler.java:288)
at de.limdul.cassiopeia.control.EventHandler.run(EventHandler.java:254)
at java.lang.Thread.run(Thread.java:595)
Ich auch. Ist einfach kommunikativer. Aber man hat ja nicht immer Zeit dafür und so kann ich abends auch mal eine Runde über das Netz mit meinen Freunden spielen
Ich hab es mir erst kurz angeguckt und auch nur mit den Grundregeln. Aber ich finde es sehr gut! Zwei Dinge interessieren mich besonders:
Wie lange haste daran gesessen?
Wie hast du das mit dem Spielfeld gemacht? Das ist doch wohl ein 2D-Array, oder? Mich interessiert, wie du den Zoom gemacht hast, da ich sowas in meinem Spiel auch machen will.
Eine sinnvolle Ergänzung für das Spiel wäre, dass man das laufende Spiel beenden kann. So eine Funktion habe ich nicht gefunden. Wenn es eine gibt, besser platzieren!
Gibt es noch noch. Das ganze fehlt mit unter die Behandlung von Netzwerkfehlern, die noch nicht sauber implementiert sind.
Zum Thema Spielfeld:
Die Karten-Daten werden in einer Hash-Map gespeichert, der Schlüssel ist dabei die Position der Karte auf dem Spielfeld. (x/y)
Die Darstellung des Spielfeldes erfolgt auf einem Panel, dass ein null-Layout hat. Die Karten werden dabei von dem Spielfeld-Panel absolut positioniert.
Sollte dann gezoomt werden, so geschieht folgendes:
a) Die Karten werden vom Spielfeld entfernt.
b) Die Darstellung jeder einzelnen Karte wird angepasst (Die Bilder werden skaliert, die Figuren etc. neu positioniert)
c) Die Karten werden auf den neuen Positionen eingefügt
d) Die Größe des Panels wird neu gesetzt.
Das geht über die Klasse CassiopeiaLogger bei mir.
Die hat eine statische Methode names log(int level, Categorie categorie, String message)
Die Klasse hält die verschiedenen Logger in einem statischen Vector vor und geht die dann alle durch. Jede Klasse hat ein Level, ab dem sie logt. Wie sie logt, hängt dann von der Klasse ab.
Um das ganze vielleicht noch was weiter zu erklären, hier mal etwas gekürzter Source Code:
Code:
protected static final void log(Categorie cat, int level, String message,) {
boolean willLog = false;
for (int i=0;i<loggers.size();i++) {
if (loggers.get(i).willLog(level)) {
willLog = true;
break;
}
}
if (!willLog) return;
// Lese weitere Status Infos aus, die eventuell Kostenintensiv sind
for (int i=0;i<loggers.size();i++) {
if (loggers.get(i).willLog(level)) {
loggers.get(i).saveLog(cat, level, message);
}
}
}
Und jeder Logger muss halt die Funktion saveLog implementieren.
Ich habe bei mir dann als Logger definiert:
ScreenLogger: Der gibt die LogMeldungen auf dem Bildschirm aus
FileLogger: Loggt in die Datei cassiopeia.log
ExceptionLogger: Schmeisst eine Exception, wenn er was loggt
WindowLogger: Loggt in ein TableModell, dass über Tools/Log Window angesehen werden kann.
Der FileLogger und der WindowLogger loggen standardmässig alles. Die Datei ist dazu da, um hinterher Debug Infos zu haben, während der WindowLogger meiner Bequemlichkeit dient.
Der ScreenLogger logt normalerweise nur Meldungen, die das Level WARNING oder höher habe. Also alles, was auf nicht korrekten Ablauf hindeutet. Dadurch sieht man auf der Konsole, wenn irgendwas schiefgeht.
Der ExceptionLogger loggt normalerweise nur Meldungen des Levels CRITICAL. Dieses Level bedeutet, dass irgendwas schiefgelaufen ist, was mit der Programmlogik zu tun hat. Das Programm würde weiterlaufen (Also kein NPE oder ähnliches werfen), aber nur noch Müll machen. Da will ich dann mit dem Logger einen "kontrollierten" Absturz erzeugen.
Weiterhin wird der ExceptionLogger temporär während der JUnit-Tests auf WARNING gesetzt, so dass ein Unit-Test auch dann fehltschlägt, wenn es LogMeldung des Levels WARNING oder höher gibt.
Jetzt bleibt noch die Frage zu klären, warum ich ein eigenes Logging-Framework genommen habe, und kein vorhandes.
Zum einen macht es mir Spaß sowas zu programmieren, zum andern mag ich fremde Frameworks nicht so sehr.
Die Logging Funktionen von java.util.Logger gefallen mir nicht wirklich, die fand ich für meine Zwecke zu kompliziert zu nutzen. log4j kenne ich bis heute nicht, dass scheint aber besser zu sein. Aber wenn man es selber schreibt, dann macht die Klasse genau das, was man will und nicht mehr.
Hi,
jetzt da ich den Screenshot sehe wollt ich mal fragen, sind das eingescannte Teile von Carcassone? Hab nämlich auch nen Brettspiel umgesetzt und direkt Brettspielvorlagen eingescannt... Darf man das Spiel veröffentlichen und verbreiten, vor allem wenn es Freeware ist bzw. man keine kommerziellen Absichten verfolgt? Wer kennt sich da genau aus? (Hoffe, es ist nicht zu Off-Topic...)
Darf man das Spiel veröffentlichen und verbreiten, vor allem wenn es Freeware ist bzw. man keine kommerziellen Absichten verfolgt? Wer kennt sich da genau aus? (Hoffe, es ist nicht zu Off-Topic...)
Jepp, darfst du nicht.
Das ist der Grund, warum in der Versionen in den Posts vorher auch andere Graphiken sind.
Das Spiel kann zwar die Orginalgraphiken nutzen, wie man auch an dem Screenshot sieht, aber ich werden einen Teufel tun und diese herausgeben.
So, nun gibt es eine neue Version, eine neue URL und viele Verbesserungen. Der Umfang des Codes ist gegenüber der letzten Version um fast 60% gewachsen.