Große Welt bewegen?

  1. #1
    Helgon


    Große Welt bewegen?
    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

  2. #2
    Cola_Colin


    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.

  3. #3
    Helgon


    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!

  4. #4
    Marco13


    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...) !?

  5. #5
    Helgon


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

  6. #6
    vanny

    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

  7. #7
    Marco13


    Zitat Zitat von Helgon Beitrag anzeigen
    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
    Java Code:
    1.  
    2. interface World
    3. {
    4. Tile getTile(int x, int y);
    5. }

    oder einen Viewport, wie vanny angedeutet hat? Zielt die Frage darauf ab, dass du nicht 100000 Tiles im Speicher halten willst?

  8. #8
    Cola_Colin


    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.

  9. #9
    Helgon


    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

  10. #10
    Cola_Colin


    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.

  11. #11
    Helgon


    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.

  12. #12
    vanny

    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

  13. #13
    Helgon


    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"

  14. #14
    Marco13


    Zitat Zitat von Helgon Beitrag anzeigen
    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.


    Zitat Zitat von Helgon Beitrag anzeigen
    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 ....

  15. #15
    Gossi


    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.

  16. #16
    vanny

    Zitat Zitat von Helgon Beitrag anzeigen
    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.



Keine Antwort auf Deine Suche gefunden? Registriere Dich kostenlos und stelle Deine eigene Frage zu Java!

Jetzt kostenlos registrieren