# Große Welt bewegen?



## Helgon (27. Dez 2011)

Hey, seit paar Tagen komm ich irgendwie nicht voran. 

Ich hab mich mal mit dem Tutorial von Quaxli auseinander gesetzt und lust bekommen ein wenig rum zu probieren (hab vorher noch nix in die Richtung gemacht)

Ich weis nicht wie ich folgendes umsetzen soll.

Hat man ein Side-Scrolling Game, so kann sich die Figur auf der Welt bewegen oder die Figur bleibt immer an der genau selben Position, aber die Welt verschiebt sich.

Ich möchte von der Idee her etwas wie Terraria umsetzen (ansatzweise ). Wems nix sagt, ist ne art Minecraft in 2D.

Also hab ich sagen wir 100.000 32x32 große BufferedImages die schon gezeichnet werden müssen.

Aufs ein 800x600 Frame passen eben also 25x19 = 475 Bilder.

Also dacht ich mir, das ist ja easy peasy möglich, also hab ich irgendwo eine Datenstruktur die die Welt beinhält und immer nur den teil reinlädt, der grad notwendig ist, aber bei bswp: 100.000 Items irgendwie 25 raus zu suchen oder immer durch zu iterieren geht ja nicht (performance).

Dann könnte man die 100.000 ja auch wieder splitten auf ka wieviele, sagen 100 á 1000 was ja schon recht schnell durchläuft, aber das erscheint mir "unsauber".

Gibts dafür irgendwie ne Lösung die bei solchen spielen meistens verwendet wird, oder habt ihr nen Denkansatz, oder ne Idee?

Grüße


----------



## Cola_Colin (27. Dez 2011)

Denke ein Quadtree würde sich dafür eignen. Gerade wenn die meisten der Objekte statisch sind.
Ist ja im Prinzip eine Art Kollisionserkennung zwischen dem Sichtfeld und den Spielobjekten, die du da brauchst.


----------



## Helgon (27. Dez 2011)

Wow, das sieht sehr nach einer extrem effizienten Lösung aus, jetzt die Frage ob ich das umgesetzt kriege 

Ich werde mir mal paar Beispiele und Implementierungen anschauen und dann nochmal posten.

Auf jeden Fall schon mal vielen Dank!


----------



## Marco13 (27. Dez 2011)

Was der Quadtree da bewirken soll ist mir nicht ganz klar. Wenn man weiß, wo der Spieler sich befindet, dann _kennt_ man doch genau die Tiles, die angezeigt werden müssen? Da muss man doch nichts mehr "rausfinden" (im Sinne einer Kollisionserkennung...) !? ???:L


----------



## Helgon (27. Dez 2011)

Wie würdest du den dieses Problem lösen Marco?


----------



## vanny (28. Dez 2011)

Du hast  ja sowas wie nen ViewPort(); und kannst dann ganz genau bestimmen wo dieser anfängt.

quasi sowas wie: ...viewPort(x, y, width, height); ... beschreibt das Rechteck, welches du siehst und demnach auch zeichnest.

Gruß Vanny


----------



## Marco13 (28. Dez 2011)

Helgon hat gesagt.:


> Also dacht ich mir, das ist ja easy peasy möglich, also hab ich irgendwo eine Datenstruktur die die Welt beinhält und immer nur den teil reinlädt, der grad notwendig ist, aber bei bswp: 100.000 Items irgendwie 25 raus zu suchen oder immer durch zu iterieren geht ja nicht (performance).



Der Teil ist mir nicht ganz klar. Hast du irgendwo irgendwie sowas wie

```
interface World
{
    Tile getTile(int x, int y);
}
```
oder einen Viewport, wie vanny angedeutet hat? Zielt die Frage darauf ab, dass du nicht 100000 Tiles im Speicher halten willst?


----------



## Cola_Colin (28. Dez 2011)

Ich würde sagen, er hat eine Liste mit 100000 Sprites(den Tiles) und will nun nur die bearbeiten/zeichnen/whatever, die sichtbar sind, also die, die sich im Sichtfeld befinden.


----------



## Helgon (28. Dez 2011)

War mein erster Ansatz Colin und so meinte ich es ursprünglich.

Je länger ich über alles nachdenke, desto mehr Kopfschmerzen krieg ich ;(

Hab mich noch nie damit auseinander gesetzt und hatte deswegen paar Brainlaags, alles mögliche probiert und jetzt eben mich drauf festgelegt (auch durch den Denkanstoß), dass ich wohl ein ViewPort haben werde, den man bewegt.

Wie genau ich das Umsetz weis ich noch nicht so genau, mal schaun. Das Problem ist eben, dass ich nicht die ganze Zeit alle Elemente angezeigt lassen kann, weils einfach zu viele sind.



P.S.: Kennt ihr das, man will was fürs Forum formulieren (eine Frage) und hat dabei ne Erleuchtung oder ne Idee, passiert mir hier sau oft 

Edit2: Ich glaub, ich muss mich nochmal in diese ganze verschiebe/Zeichne Logik rein versetzen. Wenn ich dann konkret ne Frage hab, stell ich sie nochmal.

Weitere Anregungen sind aber auch nicht verkehrt


----------



## Cola_Colin (28. Dez 2011)

Ich habe mal was ähnliches umgesetzt, was in etwa nach der Technik arbeitete, die Quaxli glaube ich auch beschreibt. Einen Viewport habe ich da ganz einfach mit dem dem translate von Graphics und setclip von graphics sowie einem simplen Test ob ein Sprite im sichtbaren Rechteck ist gemacht. Zumindest mit einigen hundert bis tausend Tiles lief das durchaus sehr zufriedenstellend. Bei 100k Tiles wäre ein Quadtree definitiv eine Möglichkeit schnell zu bestimmen, welcher Teil der statischen Spielwelt gerade im Blickfeld ist. 



> Kennt ihr das, man will was fürs Forum formulieren (eine Frage) und hat dabei ne Erleuchtung oder ne Idee, passiert mir hier sau oft



Ich glaube ich habe schon häufiger ein Topic eröffnen wollen und am Ende die Seite nach dem Schreiben der Problembeschreibung geschlossen, ohne das Topic zu öffnen als ich eines wirklich eröffnet habe.


----------



## Helgon (28. Dez 2011)

Ja, ich habs auch erst mit der Technik von Quaxli probiert und da gehts tatsächlich sogar bis 25k (ohne große logik) sehr gut, aber sobald da logik und vllt mehrer schichten drüber kommen wäre ende.

Graphics2D kannt ich noch gar nicht, grad in die docs geguckt und sieht nett aus. Muss es mir mal genauer anschauen.

An sowas wie den quadtree hab ich jetzt auch gedacht, zwar nicht ganz, aber etwas in die Richtung.


----------



## vanny (28. Dez 2011)

wenn es darum geht, nicht alle Tiles im Speicher zu halten, dann Puffern, Abarbeiten und Rausschmeissen.
Geht natürlich nur, wenn du deine Welt in eine Art Sektoren aufteilen kannst.

Wenn 25K gut laufen und du im ViewPort um die 500 Darstellst, sollte sich da doch etwas machen lassen oder !?

Gruß Vanny

[EDIT]Schlafengehn hilft aber manchmal auch xD[/EDIT]


----------



## Helgon (28. Dez 2011)

Das Problem ist irgendwie, dass ichs nicht hinkrieg nur die 500 darzustellen die notwending sind.

Ich hab Ferien, ich geh um 6 pennen und steh um 13.00 auf, mein Rhythmus istn bisschen durcheinander, aber bei mir ist es jetzt "früher Abend"


----------



## Marco13 (28. Dez 2011)

Helgon hat gesagt.:


> P.S.: Kennt ihr das, man will was fürs Forum formulieren (eine Frage) und hat dabei ne Erleuchtung oder ne Idee, passiert mir hier sau oft



Das nennt sich Rubber Ducking. 




Helgon hat gesagt.:


> Ich hab Ferien, ich geh um 6 pennen und steh um 13.00 auf, mein Rhythmus istn bisschen durcheinander, aber bei mir ist es jetzt "früher Abend"



Ich bin gerade auf Amerikanischer Westküstenzeit ....


----------



## Gossi (28. Dez 2011)

Nur mal so als kleiner Denkanstoß:

Du hast 100.000 Felder:

Nun nimmst du z.B. 50 Felder für die Höhe (beim Springen oder Klettern) und die Restlichen 2.000 für die Breite.


Dein Charackter hat nun die Koordinate 20:400, nun musst du die Felder von (x-(breite/2))y-(weite/2)) bis (x+(breite/2))y+(weite/2)) laden.

Wenn du nun nen Zweidimensionales Array hast ([50][2000]) kannst du so die passenden Einträge zeichnen.


----------



## vanny (28. Dez 2011)

Helgon hat gesagt.:


> Das Problem ist irgendwie, dass ichs nicht hinkrieg nur die 500 darzustellen die notwending sind....



Dann bastel dir nen ViewPort ähnlich wie bei der JScrollPane.


----------

