# Java Game - offene Frage(n)



## jGame (11. Juni 2009)

Hallo zusammen,

ich möchte ein Spiel mit Java programmieren. Nach mehrjähriger Erfahrung mit Java möchte ich mal an die Grenzen kommen und über den Tellerrand hinausschauen (wenn's hart auf hart kommt: learning by dooing).

Das Spiel könnt Ihr Euch wie Age of Empire vorstellen: Der User hat eine Karte, auf der er rumnavigieren kann. Das ganze soll 2-Dimensional werden.

Hierzu habe ich folgende Fragen:

* Also die Gebäude, der Boden, und die Landschaft sind Grafiken (was ja bei einem 2-Dim. Spiel durchaus möglich ist - bei AoE sind das ja auch nur 2-Dim. Elemente). Doch wie ist das mit den Menschen? Wie kann ich diese Menschen einbauen und vorallem auf welche Weise? Wie animiere ich die Beinbewegungen?

* Obwohl ich im Moment noch am Anfang der Planungsphase stehe interresiert mich, wie das mit der Karte funktioniert. Es ist klar, dass die Karte wie eine Tabelle aufgebaut ist und jede Zelle einzeln angesprochen werden kann und dass dies ein bisschen komplizierter ist. Aber wie sorge ich dafür, dass man nur einen Ausschnitt sieht und mit der Maus nach links und rechts kann und dann der Sichtbare bereich wechselt?
- Ich vermute mal ziemlich stark, dass dies mit Canvas abläuft. Also habe ich z.B. die Klasse Map, die JPanel extends und in der ich die Methode painComponent überschreibe, oder? Wie kann ich nun mein Raster mit dem Spielfeld zeichnen? z.B. ist das Raster ein Array. Jetzt müsste ja das Raster gezeichnet werden und bei jeder Änderung ein repaint erfolgen. Ist das nicht zu rechenintensiv?
- Wie kann ich "eigene Buttons" (sprich dem Spielszenario angepasste Buttons) erstellen?
- Spieldialoge laufen ja nicht über JDialog, diese werden ja im Spielfeld praktisch angezeigt und haben auch das selbe Aussehen, wie das Spielfeld. Wie ist soetwas möglich?

Fragen, nichts über Fragen ... Ich werde mich da mit meinem Team durchbeißen!

Gruß,
jGame

P.S.: Unser Entschluss für dieses Spiel steht fest! Und wir können nicht mehr "bekehrt" werden.


----------



## hammet (11. Juni 2009)

Also zum 1.
Für die Animation von Units (bewegbare Objekte) werden im 2D-bereich Sprites benutzt. Je nach bewegung wird eben das Erscheinungsbild der Unit angepasst.

Das mit dem Panel ist eine Sache. Allerdings wird dir da die Performance sehr schnell in den keller geraten. Für Spiele wird ja nicht umsonst DirectX oder OpenGL genutzt.
Bei der Gelegenheit solltest du dir vielleicht Slick oder eine Schicht tiefer LWJGL anschauen.
Eigene Button erstellst du einfahc in dem du die Buttonklasse überschriebst oder eben von Grund auf aus einzelnen Bildern eine Button zusammenschusterst.
Wie oben beschrieben läuft es meist (im OpenSource Bereich) über OpenGL und dort werdne solche Dialoge eben einfahc gezeichnet. So ähnlich kann man das auch in Java umsetzen. Einfahc den Dialog über das Spielfeld zeichnen.


----------



## jGame (12. Juni 2009)

Also, man erstellt beispielsweise animierte GIFs, die dann beim Laufen eingeblendet werden, so wie dieses:
>> GIF << und ändert es ja nach Position (wenn die Figur weg läuft, wird ein Gif von Hinten angezeigt etc.

Also, es war mir klar, dass dies mit dem JPanel nicht ausreicht ... Aber wie mache ich das jetzt genau? Und wie muss ich mir das vorstellen? Wichtig ist mir, dass man nichts zusätzlich installieren muss, sprich man alles in eine JAR packen kann und diese dann lauffähig auf Windows, Linux und Mac ist.

Mit googeln ist man nicht so erfolgreich ... es gibt relativ wenig Tutorials/Beschreibungen für soetwas! Kennt Ihr vllt. welche? Kennt Ihr vllt. ein open-source Projekt, dass ein solches Kartenbasiertes Spiel mit Java entwickelt und wo man auch Einblick in den code haben kann?

jGame


----------



## hammet (12. Juni 2009)

Also Gifs sind meiner Meinung nach nicht das richtige. Was machst du denn mit deinem GIF, wenn er nach Nroden läuft?
Wie ich erwähnte solltest du hier Sprites benutzen.
http://de.wikipedia.org/wiki/Sprite_(Computergrafik)

Slick und LWJGL sind OpenSource und in Java umgesetzt. Du lieferst einfach die Libraries des jeweiligen Paketes mit und musst zusätzlich nichts installieren (beide arbeiten mit OpenGL).
Wenn du nach einem von beidem Begriffen suchst wirst du in Google eigentlich recht schnell fündig.
http://slick.cokeandcode.com/
Dort gibt es Informationen und Hilfen zu Slick.


----------



## jGame (12. Juni 2009)

Also das mit den Sprites habe ich noch nicht wirklich verstanden  ich stelle mir das wie ein animiertes GIF vor, das über den Bildschirm bewegt wird und es dann so außsieht, alsob eine Person über den Bildschirm läuft ...

Genau diese Seite (http://slick.cokeandcode.com/) habe ich mitlerweile gefunden und mir mal die Webstart-Demos angeschaut. Hiermit baue ich also die Karte? und den ganzen grafischen Spielkram - wie eine spielinterne GUI? Meine Logik und den ganzen Kram packe ich also dahinter und nutze dieses Framework praktisch als Zwischenebene?

Was benötige ich noch alles?

jGame

EDIT:
Also ich habe das hier gefunden: http://slick.cokeandcode.com/mavenrepo/slick/slick/264/. Einfach die "slick-264.jar" runterladen und in meinen Class-Path packen?


----------



## Xandro (12. Juni 2009)

Moin,

zu Sprite-Animation kann ich diesen Link empfehlen:
http://www.javalobby.org/articles/ultimate-image/#13

Das Beispiel beschreibt genau das Animieren der Figur in N-O-S-W Richtung.

Gruß,
Xan


----------



## jGame (12. Juni 2009)

Also ich habe mir gerade mal Slick und das SlickWiki näher angeschaut und einfach mal ein Beispiel gemacht. Die Slick.jar in den Class-Path gepackt und folgenden Code kopiert:

```
package slick;

import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;

public class SlickBasicGame extends BasicGame{
	 
    Image plane = null;
    Image land = null;
    float x = 400;
    float y = 300;
    float scale = 1;
 
    public SlickBasicGame()
    {
        super("Slick2D Path2Glory - SlickBasicGame");
    }
 
    @Override
    public void init(GameContainer gc)
			throws SlickException {
        plane = new Image("data/plane.png");
        land = new Image("data/land.jpg");
    }
 
    @Override
    public void update(GameContainer gc, int delta)
			throws SlickException
    {
        Input input = gc.getInput();
 
        if(input.isKeyDown(Input.KEY_A))
        {
            plane.rotate(-0.2f * delta);
        }
 
        if(input.isKeyDown(Input.KEY_D))
        {
            plane.rotate(0.2f * delta);
        }
 
        if(input.isKeyDown(Input.KEY_W))
        {
            float hip = 0.4f * delta;
 
            float rotation = plane.getRotation();
 
            x+= hip * java.lang.Math.sin(java.lang.Math.toRadians(rotation));
            y-= hip *java.lang.Math.cos(java.lang.Math.toRadians(rotation));
        }
 
        if(input.isKeyDown(Input.KEY_2))
        {
            scale += (scale >= 5.0f) ? 0 : 0.1f;
            plane.setCenterOfRotation(plane.getWidth()/2.0f*scale, plane.getHeight()/2.0f*scale);
        }
        if(input.isKeyDown(Input.KEY_1))
        {
            scale -= (scale <= 1.0f) ? 0 : 0.1f;
            plane.setCenterOfRotation(plane.getWidth()/2.0f*scale, plane.getHeight()/2.0f*scale);
        }
    }
 
    public void render(GameContainer gc, Graphics g)
			throws SlickException
    {
        land.draw(0, 0);
 
        plane.draw(x, y, scale);
 
    }
 
    public static void main(String[] args)
			throws SlickException
    {
         AppGameContainer app =
			new AppGameContainer( new SlickBasicGame() );
 
         app.setDisplayMode(800, 600, false);
         app.start();
    }
}
```

Doch beim Starten kommt dieser Fehler:

```
Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException
	at slick.SlickBasicGame.main(SlickBasicGame.java:82)
Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	... 1 more
```

Also habe ich mir mal lwjgl heruntergeladen (Slick ist ja keine Engine) und in den Class-Path eingebunden. Aber es gibt keine Datei "org.lwjgl.LWJGLException". Und Außerdem tritt jetzt folgender Fehler auf:

```
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path
	at java.lang.ClassLoader.loadLibrary(Unknown Source)
	at java.lang.Runtime.loadLibrary0(Unknown Source)
	at java.lang.System.loadLibrary(Unknown Source)
	at org.lwjgl.Sys$1.run(Sys.java:72)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.lwjgl.Sys.doLoadLibrary(Sys.java:65)
	at org.lwjgl.Sys.loadLibrary(Sys.java:81)
	at org.lwjgl.Sys.<clinit>(Sys.java:98)
	at org.lwjgl.opengl.Display.<clinit>(Display.java:129)
	at org.newdawn.slick.AppGameContainer$1.run(AppGameContainer.java:39)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.newdawn.slick.AppGameContainer.<clinit>(AppGameContainer.java:36)
	at slick.SlickBasicGame.main(SlickBasicGame.java:82)
```

jGame


----------



## jGame (12. Juni 2009)

Es funktioniert ...  - ich habe einfach mal alle Slick-Dateien in das Projektverzeichnis von Eclipse kopiert ... Was für Archive ich nun benötige oder auch nicht benötige weiß ich nicht ...

Wenn ich aber das Ganze als JAR packe, kommt der gleiche (2. Fehler) ...

*Aber noch eine Frage zum Framework "Slick":*
* Ich bin wahrscheinlich noch zu neu: Ich sehe keine möglichkeit z.B. das Menü meinen Wünschen anzupassen! Es gibt doch nur die Klasse für ein Eingabefeld und ein Ausgabemenü. Beides schon irgendwie vordefiniert ...
* Ist es möglich ein von mir beschriebenes Spiel wie bsp. Age of Empire mit Karte und Personen auf diese Weise - also mit Slick und LWJGL zu entwickeln? 

Grüße,
jGame


----------



## Clash (13. Juni 2009)

Moin,
der erste Fehler kommt, weil sich wohl das LWJGL jar package nicht im classpath befindet,
der zweite Fehler weist auf eine fehlende dll hin, steht ja da. die muss man dann per vm arguments (eclipse)  oder per Systemloader holen.

hattest du nicht was von mehrjähriger Erfahrung mit Java geschrieben


----------



## jGame (13. Juni 2009)

> hattest du nicht was von mehrjähriger Erfahrung mit Java geschrieben



Ja, das hatte ich geschrieben, aber ich habe das mit Classpath noch nie so richtig verstanden! Ich habe mich da eher mit der Theorie - Klassen, Interfaces - und allem anderen (Datenbanken, Netzwerk/Sockets, Swing/GUI, Canvas, Threads, XML, Exceptions, Dateien ...) beschäftigt und den Rest (wie Class-Path) hat immer Eclipse gemanaged. Einfach die Jar-Datei in den Projektordner legen und dann unter Einstellungen hinzufügen, fertig 

Aber trotzdem hier nochmal meine (Haupt-)Frage:
*Ist es möglich ein von mir beschriebenes Spiel wie bsp. Age of Empire mit Karte und Personen auf diese Weise - also mit Slick und LWJGL zu entwickeln? (Also im Klartext: reichen die Werkzeuge: Slick, LWJGL aus?)*

jGame


----------



## Billie (15. Juni 2009)

Evtl. ist auch folgendes für Dich interessant:

http://fivedots.coe.psu.ac.th/~ad/jg/ch064/index.html

Wobei mir stellt sich die Frage, ob Spiele wie Age Of Empires, etc. wirklich mit 2D-Grafiken arbeiten ... kann ich mir fast nicht vorstellen, aber evtl. gibt es da spezielle Techniken etc.


----------



## gigagon (12. April 2010)

Kram, Kram... 
*Thread hochzieh* 
puh...

Hi,

ich habe dieses Thema wieder an die Forenoberfläche gezogen, weil ich mehr Informationen zu dem Thema suche.
Habe zwar auch Java Erfahrung, aber bin mir nicht sicher, welcher der beste Weg ist, eine Map in Java aufzubauen. Am besten aus Bild-Dateien.
So etwas wie in der Art:
klick

Benutzt man dafür JPanels oder andere Techniken?

Hab mir auch den einen recht interessanten Artikel (den Billie gepostet hatte) durchgelesen, aber keine Antwort auf meine Frage gefunden, weil der Autor die Map als komplett fertiges Bild geladen hatte.

@jGame
Falls du das hier lesen solltes, wie hast du das jetzt gelöst?

MfG


----------



## d4rkY89 (17. April 2010)

Hallo jGame
Edit: Hallo Interessierte. Der Thread ist ja schon etwas älter 

da ich vor kurzem auch etwas über 2D Spieleprogrammierung lernen wollte bin nach kurzem Suchen über diese Seite gestolpert:
http://www.cokeandcode.com/node/6

Hier wird die 2D Spieleprogrammierung anhand des Klassikers "Space Invaders" demonstriert.
Ich habe mir einfach den >Sourcecode< heruntergeladen und durchgelsen. Durch die gute Dokumentierung habe ich das ganze innerhalb kurzer Zeit sehr gut verstanden.

Ich kann das Tutorial nur weiterempfehlen um überhaupt Grundkenntnisse zur (sauberen) 2D Spieleprogrammierung zu erlangen.


----------

