# Java-Rollenspiel-Graphik



## nomeal (12. Sep 2012)

Hallo Community,

ich bin gerade dabei ein kleines 2D Rollenspiel zu programmieren. Nun habe ich 2 Fragen.

Wie realisiere ich den Hintergrund(Boden) und Wald(Wo Truppen nicht durchlaufen sollten)

Beides auf ein Panel?; Alle Bäume einzeln draufzeichnen?
Und wie mache ich, dass Truppen nicht "über" Bäume laufen können?
Wie realisiere ich, dass ich mit der Maus einzelne Truppen markieren kann und dann wohinklicken kann um dorthinzulaufen/anzugreifen ...

Wie ihr seht stehe ich noch bei der Planung, also bitte keine Antworten wie : Lern erstmal Java oder so...

Danke schonmal im Vorraus 

FG FRISTLOS


----------



## Fu3L (12. Sep 2012)

Grundsätzlich hast du einmal das Modell und den Blick dadrauf.
D.h.: Du hast irgendein Objekt in der Art "Spielfeld" und darauf befinden sich Objekte wie "Baum" oder "Stein". Wenn nun die KI oder der Spieler ein Einheit bewegen will, muss eben berechnet werden, ob die Stelle auf dem Spielfeld betretbar ist oder nicht. (Was nicht gaanz trivial ist bei vielen Objekten und einer großen Karte)
Das ganze wid dann von einem "Renderer" gezeichnet. Der nimmt Informationen des Spielfeldes und zeichnet entsprechend alles was sich dadrauf befindet.
Beide Teile werden kontrolliert von einer übergeordneten Spiellogik, die auch das Neuzeichnen anstoßen sollte. Diese weiß auch, welcher Teil der Map gezeichnet wurde. Das ist wichtig, denn nur so kannst du anhand von Koordinaten eines Mausklicks errechnen, welchen Teil des Spielfeldes ein Spieler mit seiner Maus selektiert hat. (Dann kann die Logik auf dem Spielfeld sowas aufrufen wie getGameObjektAt(worldX, worldY)).

Das ist der grobe Überblick, damit du nicht ganz ratlos dastehst.


----------



## nomeal (12. Sep 2012)

Fu3L hat gesagt.:


> Grundsätzlich hast du einmal das Modell und den Blick dadrauf.
> D.h.: Du hast irgendein Objekt in der Art "Spielfeld" und darauf befinden sich Objekte wie "Baum" oder "Stein". Wenn nun die KI oder der Spieler ein Einheit bewegen will, muss eben berechnet werden, ob die Stelle auf dem Spielfeld betretbar ist oder nicht. (Was nicht gaanz trivial ist bei vielen Objekten und einer großen Karte)
> Das ganze wid dann von einem "Renderer" gezeichnet. Der nimmt Informationen des Spielfeldes und zeichnet entsprechend alles was sich dadrauf befindet.
> Beide Teile werden kontrolliert von einer übergeordneten Spiellogik, die auch das Neuzeichnen anstoßen sollte. Diese weiß auch, welcher Teil der Map gezeichnet wurde. Das ist wichtig, denn nur so kannst du anhand von Koordinaten eines Mausklicks errechnen, welchen Teil des Spielfeldes ein Spieler mit seiner Maus selektiert hat. (Dann kann die Logik auf dem Spielfeld sowas aufrufen wie getGameObjektAt(worldX, worldY)).
> ...




Wie sollte denn eine übergeordnete Spiellogik so aussehen?


----------



## Robokopp (12. Sep 2012)

schau dir quaxlis tutorial an, da hast du eigentlich alles was du brauchst.

Gesendet von meinem GT-I9100 mit Tapatalk 2


----------



## Fu3L (12. Sep 2012)

> schau dir quaxlis tutorial an, da hast du eigentlich alles was du brauchst.



Im Grunde ja und ich würde es nomeal auch empfehlen als Einstieg, aber Quaxlie hat ja durchaus einige Vereinfachungen getroffen. Deshalb hab ich auch als Einstieg, damit MVC mal gehört wurde, das Grundgerüst erläutert 



> Wie sollte denn eine übergeordnete Spiellogik so aussehen?



Also son Thread sollte da schon drinne sein. Siehe Quaxlies Tutorial  Das ist zu viel Stoff und Überlegung, um das hier so einfach zu erläutern.


----------



## Network (12. Sep 2012)

Ich glaube dein Problem ist es, dass du die Spiellandschaft als ein ganzen einzigen Hintergrund siehst. Solche 2D Rollenspiele bestehen jedoch meistens aus ganz vielen kleinen gleichgroßen Tiles, normalerweise so groß wie die Spielfigur selbst, die sich wie ein Puzzle zu einem einzigen riesigen Hintergrund zusammensetzen.

Bevor sich eine Spielfigur dann zum nächsten Tile bewegt, wird erstmal abgefragt ob das Nachbartile überhaupt begehbar ist. Wenn nicht wird die Bewegung stoniert.
So ein Nicht-Begehbares-Tile hat als zugeordnetes Bild dann z.B. eine Kiste.

Bei den meisten 2D-Rollenspielen kann man sich ja meistens auch nur von Tile zu Tile einzeln bewegen per Klick auf eine Pfeiltaste.

Gruß
Net


----------



## BRoll (12. Sep 2012)

Wichtig ist das du die Map in einzelne Tiles aufteilst,
aus denen sie sich zusammensetzt. (Wie schon erwähnt)
Dazu sollte entweder bekannt sein, welche Tile-ID bzw. Bild
nicht betreten werden darf, oder du machst es abhängig von
der Position des Teils und setzt dann dort einen Marker (zb. Boolean)
für nicht passierbar.

Zb, stell dir vor deine Map ist ein 2D Integer Array:

int[][] map=new int[mapbreite][maphoehe]

Und darin sind die Tile-IDs für Bilder usw gespeichert.
(Dies ist nur sinnvoll mit einer Hintergrundähnlichen Map,
wenn es viele Objekte zum interagieren auf der Map gibt,
sollte man Objekte und keine IDs verwenden, die dann einzeln
angesteuert werden können).

Wenn jetzt der Spieler von X=5 und Y=1 einen Schritt nach Rechts
laufen will, musst du vorher abfragen: Ist die Stelle passierbar.
Und das geht auf zwei Weisen:

1.Tile-ID abfragen

die Bewegung nur zulassen wenn   istTileIDBetretbar(map[6][1])
(da in map die IDs gespeichert sind)

2. Zusätzliche Block-Route

Bei dieser Variante legst du ein boolean Array genauso wie die map an:

boolean[][] passierbar =new boolean[mapbreite][maphoehe]

dann darfst du denn spieler nur laufen lassen wenn   passierbar[6][1]==true

Wenn du jedes TIle als Objekt machst, kannst du ja das Objekt ganz einfach selber
fragen ob es betretbar ist.

Wie dein Spiel jetzt genau werden soll, hab ich nicht ganz verstanden.


Schau mal diese beiden Videos von mir an und sag was es eher werden soll,
bzw was genau du davon auch realisieren möchtest;
Eher so:Java RPG Game - "Dungeon Researcher" - YouTube
Oder so:Java Strategy Game Test - YouTube

hoffe du hast es einigermaßen verstanden was ich sagen wollte 

mfg BRoll


----------



## Titanpharao (13. Sep 2012)

Über einen MouseListener kannst du dir die Position wo du in die Spielwelt geklickt hast hohlen und dann "ziehen" und beim loslassen halt ein Rechteck bilden und schauen, ob deine Figur sich in diesem Feld befindet.

AStar (A*) Algorithmus wäre für dein blocken/laufen Problem optimal, gibts 100 Beispiele im Internet.(Glaube da kopiert immer einer vom nächsten hrhr)

Sonst die Map wie schon oft oben beschrieben als ein DoppeltesArray[][] speichern.

Und die Map füllen mit einer "MapTile" Klasse die dann z.b. die Information trägt ob Baum oder Weg 
und natürlich ob "durchgehbar" oder "blockierend".

@BRoll Grafiken sind wohl nicht unsere Stärke


----------



## nomeal (13. Sep 2012)

BRoll hat gesagt.:


> Wichtig ist das du die Map in einzelne Tiles aufteilst,
> aus denen sie sich zusammensetzt. (Wie schon erwähnt)
> Dazu sollte entweder bekannt sein, welche Tile-ID bzw. Bild
> nicht betreten werden darf, oder du machst es abhängig von
> ...






So in der Art wie dein Strategie-Spiel würd ich es auch gerne machen. Vielleicht ist es ja möglich, dass ich dich per PM mal was frage??


----------



## BRoll (13. Sep 2012)

nomeal hat gesagt.:


> So in der Art wie dein Strategie-Spiel würd ich es auch gerne machen. Vielleicht ist es ja möglich, dass ich dich per PM mal was frage??



Klar, wieso nicht? 

Auf konkrete Fragen kann ich dann sowieso mehr sagen,
wenn du willst können wir auch in Skype mal schreiben.


----------



## Bile Demon (14. Sep 2012)

BRoll hat gesagt.:


> Eher so:Java RPG Game - "Dungeon Researcher" - YouTube
> Oder so:Java Strategy Game Test - YouTube



[OT]Bist du nicht der Typ mit dem krassen Snail-Spiel? Ich hab mir deine Videos jetzt aus Spaß einfach auch mal angesehen. Deinen "Strategy Game Test" hast du in einer Woche geschrieben? Ich hoffe, dass du da sehr viel älteren Code wiederverwendet hast, weil sonst würde das mein Weltbild arg ins Wanken bringen 

Sogar wenn ich mich dazu bringen könnte, eine Woche lang konsequent ohne nennenswerte Pausen from scratch an so einem Spiel zu arbeiten, wäre ich nichtmal sicher, ob ich etwas ähnliches in der kurzen Zeit hinbekäme.[/OT]


----------



## BRoll (14. Sep 2012)

Bile Demon hat gesagt.:


> [OT]Bist du nicht der Typ mit dem krassen Snail-Spiel? Ich hab mir deine Videos jetzt aus Spaß einfach auch mal angesehen. Deinen "Strategy Game Test" hast du in einer Woche geschrieben? Ich hoffe, dass du da sehr viel älteren Code wiederverwendet hast, weil sonst würde das mein Weltbild arg ins Wanken bringen
> 
> Sogar wenn ich mich dazu bringen könnte, eine Woche lang konsequent ohne nennenswerte Pausen from scratch an so einem Spiel zu arbeiten, wäre ich nichtmal sicher, ob ich etwas ähnliches in der kurzen Zeit hinbekäme.[/OT]



[OT]
Tut mir wirklich leid dein Weltbild ins wanken zu bringen,
aber es ist nicht gelogen. Ich will auch damit nicht angeben oder sowas,
ich bin halt da irgendwie schnell. Ich weiß nicht woran das genau liegt,
vielleicht weil ich bevor ich was programmier den Quellcode komplett
im Kopf "schreibe" ,und dann nur noch abtippe was ich mir gedacht habe.
Klar kommen dann noch Fehlersuche usw dazu, aber mit der Zeit
und Erfahrung wird auch das weniger.

Das Spiel ist in einer Woche Hausboot Urlaub in den Niederlanden entstanden,
hab einfach immer abends dann den Laptop ausgepackt und ca 2-3 stunden programmiert.

Ist aber auch nicht fertig, Gegner usw fehlt noch, bloß ist die Spieltechnik usw schon fertig.

Aber alten Code benutze ich , auch wenns nicht gerade schlau ist, nicht.
Nur die Main methode mit dem Thread und Frame kopier ich.
Mir machts sozusagen Spaß was neu zu schreiben.

Ja und das "krasse Snail-Spiel" ist auch von mir xD
Da saß ich dann aber auch länger, zumahl alle Sprites noch selber gemacht werden mussten.
[/OT]


----------



## Bile Demon (14. Sep 2012)

[OT]Dann bleibt mir dazu nur noch zu sagen: Good job! 

Mit den Dingern als Referenzarbeiten wirst du es sicher nicht schwer haben, später bei irgendeiner Spielefirma zu landen. Vor allem wenn du noch betonst, dass du mal eben so ein Spiele-Grundgerüst (für ein beliebiges Genre) in nichtmal 20 Nettostunden hinbekommst.

Ich glaub ich muss mir davon mal ne Scheibe abschneiden ^^[/OT]


----------

