Kleinbonum: auf einer Map wandern (Spieleprogrammierung)

0 56

auf einer Map wandern (Spieleprogrammierung)

Kleinbonum
  • programmiertechnik
  1. 0
    bleicher
    1. 0
      Kleinbonum
      1. 0
        Deus Figendi
        1. 0
          Kleinbonum
          1. 0
            Deus Figendi
            1. 0
              Kleinbonum
              1. 0
                Felix Riesterer
                1. 0
                  Kleinbonum
  2. 0
    Der Martin
    1. 0
      Kleinbonum
      1. 0
        Ratge Bär
  3. 0
    splinter
    1. 0
      Kleinbonum
      1. 0
        splinter
  4. 0
    Felix Riesterer
    1. 0
      Felix Riesterer
      1. 0
        Tom
        1. 0
          Felix Riesterer
          1. 0
            Kleinbonum
          2. 0
            Tom
            1. 0
              Felix Riesterer
              1. 0
                Kleinbonum
                1. 0
                  Felix Riesterer
      2. 0
        Felix Riesterer
        1. 0
          Tom
          1. 0
            Felix Riesterer
            1. 0
              Felix Riesterer
              1. 0
                Felix Riesterer
            2. 0
              O'Brien
              1. 0
                Felix Riesterer
                1. 0
                  Felix Riesterer
                  1. 0
                    O'Brien
                    1. 0
                      Felix Riesterer
                      1. 0
                        Felix Riesterer
    2. 0
      Kleinbonum
      1. 0
        Felix Riesterer
        1. 0
          Kleinbonum
          1. 0
            Havyrl
        2. 0
          Tom
  5. 0
    Tom
  6. 0

    Nachtrag, Kartenausschnitte anzeigen

    Tom
  7. 0
    Felix Riesterer
    1. 0
      Tom
      1. 0
        Tom
        1. 0
          Felix Riesterer
      2. 0
        Felix Riesterer
    2. 0
      O'Brien
      1. 0
        Felix Riesterer
      2. 0
        Felix Riesterer
        1. 0
          O'Brien
          1. 0
            Felix Riesterer
            1. 0
              O'Brien
              1. 0

                wie auf Schienen

                Felix Riesterer
                1. 0
                  Tom
            2. 0
              Tom

Hallo,
für ein Schul-Projekt möchte ich ein kleines Spiel programmieren (Sprache egal). Ich möchte folgendes machen:

Es existiert eine Karte, die die Größe 4000 x 4000 px hat. Zu sehen in dem jeweils dargestellten Ausschnitt auf dem Screen, dem Spieleviewport sozusagen, ist von dieser Karte immer nur 200 x 200 px zu sehen.

In dieser Welt sind nun Gegenstände, z.B. ein Baum verortet, z.B. auf Koordinate 2000/432.

Nun bewegt sich auf dieser Karte  ein Wanderer, der sich immer zentriert in der Kartenmitte befindet, es sei denn, er stößt an den Rand dieser Welt, dann nähert er sich der Kante, bzw. der äußeren Begrenzung. Ein einfaches Open-World-Spiel also, wenn man es so nennen will.

Die Karte muss natürlich nun mitscrollen, wenn sich der Wanderer bewegt, und hier habe ich das Verständnisproblem. Bewegt sich der Wanderer nun in x-Richtung (oder wohin auch immer) immer weiter, bewegt sich dann

a)die Map oder
b)bewegen sich die verorteten Gegenstände?

Ich hoffe, ihr wisst, was ich meine. Vielleicht hat jemand ein Tutorial für mich oder ein paar hilfreiche Tips? Das wäre natürlich wunderbar!

Viele Grüße
Kleinbonum

  1. Grüße,

    a)die Map oder
    b)bewegen sich die verorteten Gegenstände?

    beides sofern boden nicht homogen ist. und dien vo9rhaben ist nicht trivial, bist du sicher? mit flash ist das gerade noch so machbar, wobei du actiosncript lernen müsstest.
    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
    1. Hi

      beides sofern boden nicht homogen ist. und dien vo9rhaben ist nicht trivial, bist du sicher? mit flash ist das gerade noch so machbar, wobei du actiosncript lernen müsstest.
      MFG

      nein, der Boden bleibt sich nicht gleich. Es soll z.B. Wüsten geben oder Gebirge, die man überklettern muss (in übertragenem Sinne, dort ist halt die Fortbewegungsgeschwindigkeit herabgesetzt). Die Map ist eine plane Grafik, die topographischen Gegebenheiten werden als Gegenstände verortet (z.b. Sumpf ist ein Gegenstand).

      Programmieren werde ich das wohl in Python. Denkst du wirklich, dass das so schwierig ist?

      1. Hi

        beides sofern boden nicht homogen ist. und dien vo9rhaben ist nicht trivial, bist du sicher? mit flash ist das gerade noch so machbar, wobei du actiosncript lernen müsstest.
        MFG

        nein, der Boden bleibt sich nicht gleich. Es soll z.B. Wüsten geben oder Gebirge, die man überklettern muss (in übertragenem Sinne, dort ist halt die Fortbewegungsgeschwindigkeit herabgesetzt). Die Map ist eine plane Grafik, die topographischen Gegebenheiten werden als Gegenstände verortet (z.b. Sumpf ist ein Gegenstand).

        Programmieren werde ich das wohl in Python. Denkst du wirklich, dass das so schwierig ist?

        Das ist sicher machbar, ich habe sowas ähnliches kürzlich mit JavaScript und canvas gebastelt.
        "Mitscrollen" hatte ich noch nicht gemacht, dafür aber Zoom. Ob man nun einen Layer hat (Gegenstände) oder mehrere (Fußboden und Gegenstände) ist denke ich nicht so wild. Allerdings habe ich "Felder" gemacht, keine freie Positionierung... macht aber auch keinen großen Unterschied.

        Von Python hab ich gerade extrem wenig Ahnung, aber wolltest du das im Browser machen oder auf dem Desktop? Muss es denn überhaupt grafisch sein oder reicht für die Schule auch ein ASCII-Modus (so wie Rogue)?

        Zur Konkreten Frage: Natürlich müssen sich Karte und Gegenstände mit verschieben. Wenn die Gegenstände relativ zur Karte immer die gleiche Position haben kannst du sie rein grafisch auch direkt auf die Karte malen (soweit Python dafür Module bietet, wovon ich aber ausgehe).

        Im Grunde machst du folgendes:
        Position der Karte := Position des Spielers auf der Karte - halber Kartenausschnitt;
        Wenn Position des Spielers < Kartenausschnitt/2 dann Position der Karte = 0 und Position der Spielfigut auf dem Kartenausschnitt (nicht auf der Karte) = Position auf der Karte
        Wenn Position des Spielers > Karte-Kartenausschnitt/2 dann Position der Kart = max und Position der Spielfigur auf dem Kartenausschnitt = max-Position auf der Karte;

        Das ganze einzeln für beide Koordinaten.

        Kollisionsabfragen sind wenig trivial außer du hast ein klares Raster. Also Kollisionen von Rechtecken sind doch reicht leicht zu berechnen, Kreise, Hexagone etc. ist aufwendig aber kriegt man auch hin, aber wenn es um unförmige Dinge geht... bäh!

        Aber wie gesagt: Mach doch ASCII-Grafik, dann erledigt sich das Kollision-Problem wie von selbst "Wenn Spielerposition = Gegenstandsposition dann Kollision"

        --
        sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
        1. Hallo

          Das ist sicher machbar, ich habe sowas ähnliches kürzlich mit JavaScript und canvas gebastelt.
          "Mitscrollen" hatte ich noch nicht gemacht, dafür aber Zoom. Ob man nun »»einen Layer hat (Gegenstände) oder mehrere (Fußboden und Gegenstände) ist »»denke ich nicht so wild. Allerdings habe ich "Felder" gemacht, keine »»freie Positionierung... macht aber auch keinen großen Unterschied.

          Von Python hab ich gerade extrem wenig Ahnung, aber wolltest du das im Browser machen oder auf dem Desktop?

          Nein, nein, das soll schon eine Desktop-Angelegenheit werden, als Browserspiel wäre Python nicht machbar AFAIK. (Es sei denn im Einsatz als serverseitige Skiptsprache, was mir in diesem Fall nichts bringen würde)

          Muss es denn überhaupt grafisch sein oder reicht für die Schule auch ein »» ASCII-Modus (so wie Rogue)?

          Hmm, ASCII-Mode würde mir vielleicht sogar ausreichen, du meinst sowas wie DWARF FORTRESS? Geniales Spiel übrigens... Allerdings hätte ich trotzdem gerne eine Karte (im Sinne von Fantasy-Karte wie aus dem Herrn-der-Ringe-Buch oder sowas). Und diese Karte müsste ja logischerweise mitscrollen, klar.

          Zur Konkreten Frage: Natürlich müssen sich Karte und Gegenstände mit verschieben. Wenn die Gegenstände relativ zur Karte immer die gleiche Position haben kannst du sie rein grafisch auch direkt auf die Karte malen (soweit Python dafür Module bietet, wovon ich aber ausgehe).

          Ja, klar, mit Python kannst du via OpenGL Grafikprogrammierung betreiben. Falls es dich interessiert, OpenGL unter Python

          Im Grunde machst du folgendes:
          Position der Karte := Position des Spielers auf der Karte - halber Kartenausschnitt;
          Wenn Position des Spielers < Kartenausschnitt/2 dann Position der Karte = 0 und Position der Spielfigut auf dem Kartenausschnitt (nicht auf der Karte) = Position auf der Karte
          Wenn Position des Spielers > Karte-Kartenausschnitt/2 dann Position der Kart = max und Position der Spielfigur auf dem Kartenausschnitt = max-Position auf der Karte;

          Ah, ok. Nehmen wir mal an, ich nutze ein festes Raster. Die Gegenstände befänden sich dann in mehrdimensionalen Arrays oder sowas?

          Das Spiel in einer statischen Map (ohne Scrolling) wäre kein Problem für mich, nur das Scrollen eben macht mir ein paar Sorgen.

          Nehmen wir mal folgendes an:

          ich habe eine Welt, die in diesem Array gespeichert ist:

          hash[0][0] = "x";
          hash[0][1] = "x";
          hash[0][2] = "x";
          hash[1][0] = "x";
          hash[1][1] = "x";
          hash[1][2] = "x";
          hash[2][0] = "x";
          hash[2][1] = "x";
          hash[2][2] = "t";

          wobei x = normaler Boden, t = Gegenstand. Wir haben also eine Welt bestehend aus 3 x 3 Rasterpunkten. nehmen wir weiter an, mein Kartenausschnitt ist 2 Rasterpunkte groß, ich sehe also nur von hash[0][0] bis hash[0][1] und hash[0][0] bis hash[1][0]. Bewege ich mich dann um ein Raster nach Rechts, lasse ich nur den Inhalt des Arrays zeichnen, der mit meiner Position korrespondiert, oder? ist das nicht etwas zu trivial?

          Aber wie gesagt: Mach doch ASCII-Grafik, dann erledigt sich das »»Kollision-Problem wie von selbst "Wenn Spielerposition = »»Gegenstandsposition dann Kollision"

          Mit Kollisonsabfragen habe ich mich schon beschäftigt, allerdings nur Kugelkollisionen. Komplexere Gegenstände gibt es in meiner Welt nicht. Wie du schon gesagt hast:

          "Wenn Spielerposition = Gegenstandsposition dann Kollision"

          Kleinbonum

          1. Nein, nein, das soll schon eine Desktop-Angelegenheit werden, als Browserspiel wäre Python nicht machbar AFAIK. (Es sei denn im Einsatz als serverseitige Skiptsprache, was mir in diesem Fall nichts bringen würde)

            Äh ja, ich meinte serverseitig. Also der Client setzt einen Request ab über seine Wunschbewegungs-Richtung, der Server errechnet ob die Bewegung möglich ist, welche Folgen sie hat etc. generiert daraus eine Bild-Ressource und schickt die zurück... oder so.

            Muss es denn überhaupt grafisch sein oder reicht für die Schule auch ein »» ASCII-Modus (so wie Rogue)?
            Hmm, ASCII-Mode würde mir vielleicht sogar ausreichen, du meinst sowas wie DWARF FORTRESS?

            ja

            Zur Konkreten Frage: Natürlich müssen sich Karte und Gegenstände mit verschieben. Wenn die Gegenstände relativ zur Karte immer die gleiche Position haben kannst du sie rein grafisch auch direkt auf die Karte malen (soweit Python dafür Module bietet, wovon ich aber ausgehe).
            Ja, klar, mit Python kannst du via OpenGL Grafikprogrammierung betreiben. Falls es dich interessiert, OpenGL unter Python

            Wie oben erwähnt meinte ich halt Grafik-Ressourcen zu erzeugen.

            Im Grunde machst du folgendes:
            Position der Karte := Position des Spielers auf der Karte - halber Kartenausschnitt;
            Wenn Position des Spielers < Kartenausschnitt/2 dann Position der Karte = 0 und Position der Spielfigut auf dem Kartenausschnitt (nicht auf der Karte) = Position auf der Karte
            Wenn Position des Spielers > Karte-Kartenausschnitt/2 dann Position der Kart = max und Position der Spielfigur auf dem Kartenausschnitt = max-Position auf der Karte;

            Ah, ok. Nehmen wir mal an, ich nutze ein festes Raster. Die Gegenstände befänden sich dann in mehrdimensionalen Arrays oder sowas?

            Das Spiel in einer statischen Map (ohne Scrolling) wäre kein Problem für mich, nur das Scrollen eben macht mir ein paar Sorgen.

            Nehmen wir mal folgendes an:

            ich habe eine Welt, die in diesem Array gespeichert ist:

            hash[0][0] = "x";
            hash[0][1] = "x";
            hash[0][2] = "x";
            hash[1][0] = "x";
            hash[1][1] = "x";
            hash[1][2] = "x";
            hash[2][0] = "x";
            hash[2][1] = "x";
            hash[2][2] = "t";

            wobei x = normaler Boden, t = Gegenstand. Wir haben also eine Welt bestehend aus 3 x 3 Rasterpunkten. nehmen wir weiter an, mein Kartenausschnitt ist 2 Rasterpunkte groß, ich sehe also nur von hash[0][0] bis hash[0][1] und hash[0][0] bis hash[1][0]. Bewege ich mich dann um ein Raster nach Rechts, lasse ich nur den Inhalt des Arrays zeichnen, der mit meiner Position korrespondiert, oder? ist das nicht etwas zu trivial?

            Jain.
            Also erstmal ja natürlich ist es sotrivial ^^
            Zweitens, die Array-Lösung tuts nur bei einem einigermaßen groben Raster. Ein Array von 4000x4000 Feldern ist recht groß, vor allem wenn du jedes Feld belegst. Wenn du das einigermaßen grob rasterst ist das aber imho eine brauchbare Lösung.
            Andernfalls würd' ich die Daten vielleicht auslagern. In Dateien oder eine Datenbank oder so, jedenfalls irgendein System, in dem du konkret die Dinge abfragen kannst, die du gerade brauchst "SELECT objects , ground FROM Zeug WHERE x_pos >50 AND x_pos < 100 AND y_pos >20 AND y_pos <70;"
            Genauso täten es aber auch Dateien, die entsprechend benannt sind, und die man folglich gezielt öffnen kann.

            --
            sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
            1. Nein, nein, das soll schon eine Desktop-Angelegenheit werden, als Browserspiel wäre Python nicht machbar AFAIK. (Es sei denn im Einsatz als serverseitige Skiptsprache, was mir in diesem Fall nichts bringen würde)
              Äh ja, ich meinte serverseitig. Also der Client setzt einen Request ab über seine Wunschbewegungs-Richtung, der Server errechnet ob die Bewegung möglich ist, welche Folgen sie hat etc. generiert daraus eine Bild-Ressource und schickt die zurück... oder so.

              Ok, das ist nicht schlecht. Dann könnte man es eventuell doch als Browsergame machen... wenn man Ajax einsetzen würde, könnte man sogar ein MMORPG umsetzen! Da würde sich mein Provider (all-inkl.) aber freuen... vermutlich sogar nicht mal gestatten.

              »»Bewege ich mich dann um ein Raster nach Rechts, lasse ich nur den Inhalt »»des Arrays zeichnen, der mit meiner Position korrespondiert, oder? ist »»das nicht etwas zu trivial?

              Jain.
              Also erstmal ja natürlich ist es sotrivial ^^
              Zweitens, die Array-Lösung tuts nur bei einem einigermaßen groben Raster. Ein Array von 4000x4000 Feldern ist recht groß, vor allem wenn du jedes Feld belegst. Wenn du das einigermaßen grob rasterst ist das aber imho eine brauchbare Lösung.

              Hm, stimmt. Schlechte Idee.

              Andernfalls würd' ich die Daten vielleicht auslagern. In Dateien oder eine Datenbank oder so, jedenfalls irgendein System, in dem du konkret die Dinge abfragen kannst, die du gerade brauchst "SELECT objects , ground FROM Zeug WHERE x_pos >50 AND x_pos < 100 AND y_pos >20 AND y_pos <70;"
              Genauso täten es aber auch Dateien, die entsprechend benannt sind, und die man folglich gezielt öffnen kann.

              Wenn ich es als Browsergame machen würde, wäre das wohl das beste. Über Ajax ziehe ich mir immer die entsprechenden Werte und zeichne die Gegenbheiten ins DOM. Leider kenne ich mit JavaScript nicht so gut aus, die Vorgehensweise ist mir noch nicht so klar. Deshalb hatte ich auch Python gewählt, weil ich mit dem Zeichnen schon Erfahrung habe (bzw. mit Canvas von Java und diversen anderen Sprachen). Aber da es ja jetzt in HTML5 auch das Canvas-Element gibt, tue ich mir vielleicht gar nicht so schwer.

              Darüber muss ich jetzt erstmal nachdenken.

              Danke dir!
              Kleinbonum

              1. Lieber Kleinbonum,

                Aber da es ja jetzt in HTML5 auch das Canvas-Element gibt, tue ich mir vielleicht gar nicht so schwer.

                das bräuchte es nicht einmal. Wie Du bei meinem Ansatz gesehen hast, kann man mit Grafiken schon einiges erreichen. Dabei spart man sich dann das ewige Neuzeichnen der Canvas-Grafik.

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                1. Hallo Felix,

                  das bräuchte es nicht einmal. Wie Du bei meinem Ansatz gesehen hast, kann man mit Grafiken schon einiges erreichen. Dabei spart man sich dann das ewige Neuzeichnen der Canvas-Grafik.

                  Das Konzept mit dem Neuzeichnen des Canvas verstehe ich. Wie verhält sich das eigentlich in deiner Variante*? Technisch gesehen (auf höherer Ebene) wird das doch auch (implizit) ständig neugezeichnet, oder?

                  Gibt es dazu Benchmark-Tests oder Vergleiche? Wäre mal interesssant....

                  *das Verschieben und Positionieren einzelner Elemente im DOM

  2. Hi,

    Es existiert eine Karte, die die Größe 4000 x 4000 px hat. Zu sehen in dem jeweils dargestellten Ausschnitt auf dem Screen, dem Spieleviewport sozusagen, ist von dieser Karte immer nur 200 x 200 px zu sehen.
    In dieser Welt sind nun Gegenstände, z.B. ein Baum verortet, z.B. auf Koordinate 2000/432.
    Nun bewegt sich auf dieser Karte  ein Wanderer, der sich immer zentriert in der Kartenmitte befindet, es sei denn, er stößt an den Rand dieser Welt, dann nähert er sich der Kante, bzw. der äußeren Begrenzung. Ein einfaches Open-World-Spiel also, wenn man es so nennen will.

    ja, von der Beschreibung her recht einfach, aber in der Realisierung sicher nicht trivial.

    Bewegt sich der Wanderer nun in x-Richtung (oder wohin auch immer) immer weiter, bewegt sich dann

    a)die Map oder
    b)bewegen sich die verorteten Gegenstände?

    Alles ist relativ. ;-)
    Ich würde sagen: Nur die Karte bewegt sich. Aber da die darauf angehefteten Gegenstände mit ihren Koordinaten ja bestimmt relativ zum Kartenursprung festgelegt sind, bewegen sie sich natürlich mit. Insofern folgt eins aus dem anderen.

    Wie gesagt, das Prinzip erscheint einfach, aber es bedeutet viel Fleißarbeit und viele Details, die man beachten muss.

    So long,
     Martin

    --
    Die letzten Worte des Polizisten:
    Ich hab mitgezählt, Leute: Sechs Schuss, jetzt hat er keine Munition mehr!
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo Martin,

      Nun bewegt sich auf dieser Karte  ein Wanderer, der sich immer zentriert in der Kartenmitte befindet, es sei denn, er stößt an den Rand dieser Welt, dann nähert er sich der Kante, bzw. der äußeren Begrenzung. Ein einfaches Open-World-Spiel also, wenn man es so nennen will.

      ja, von der Beschreibung her recht einfach, aber in der Realisierung sicher nicht trivial.

      Ja, leider. Je mehr ich darüber nachdenke, desto mehr Probleme fallen mir ein. Obwohl das doch nicht so schwer sein kann, denke ich mir immer...

      Bewegt sich der Wanderer nun in x-Richtung (oder wohin auch immer) immer weiter, bewegt sich dann

      a)die Map oder
      b)bewegen sich die verorteten Gegenstände?

      Alles ist relativ. ;-)

      He, he... in diesem Fall kommt es klar zum Ausdruck. Ach, ich werde mir wohl noch ne Menge Gedanken machen müssen darüber.

      Ich würde sagen: Nur die Karte bewegt sich. Aber da die darauf angehefteten Gegenstände mit ihren Koordinaten ja bestimmt relativ zum »»Kartenursprung festgelegt sind, bewegen sie sich natürlich mit. Insofern »»folgt eins aus dem anderen.

      Wenn sich die Karte aber nicht mehr bewegen kann, weil ich an einem Rand angekommen bin, und ich (der Wanderer) sich diesem Rand nähert, die Bildmitte also verlässt, müssen sich doch nur noch die Gegenstände verändern..... ne, der Wanderer nur noch, oder?

      Wie gesagt, das Prinzip erscheint einfach, aber es bedeutet viel Fleißarbeit und viele Details, die man beachten muss.

      Oh ja, ohne Fleiß, kein Preis. Jetzt kommt der Winter, da habe ich viel Zeit.. :)

      Kleinbonum

      1. Wenn sich die Karte aber nicht mehr bewegen kann, weil ich an einem Rand angekommen bin, und ich (der Wanderer) sich diesem Rand nähert, die Bildmitte also verlässt, müssen sich doch nur noch die Gegenstände verändern..... ne, der Wanderer nur noch, oder?

        Vereinfachung: Lass den Wanderer in der Mitte. Was spricht dagegen, dass der Rand der Karte bis zur Mitte des Sichtfensters scrollt?

        Gruß, Ratge Bär

  3. Moin

    a)die Map oder
    b)bewegen sich die verorteten Gegenstände?

    Ich mach dazu mal nen Vorschlag den ich selbst auch schon umgesetzt habe.

    Map ist statisch (inkl. statische Gegenstände wie Bäume).
    Spieler bewegt sich
    Viewport bewegt sich (in deinem Fall fix zu Spieler mit Ausnahmen am Rand).

    Mit dieser Architektur kannst du nachher deine Map beliebig erweitern, den Viewport verändern und auch dessen Verhalten.

    Gruss
    Splinter

    1. Hallo Splinter,

      Ich mach dazu mal nen Vorschlag den ich selbst auch schon umgesetzt habe.

      Map ist statisch (inkl. statische Gegenstände wie Bäume).
      Spieler bewegt sich
      Viewport bewegt sich (in deinem Fall fix zu Spieler mit Ausnahmen am Rand).

      Mit dieser Architektur kannst du nachher deine Map beliebig erweitern, den Viewport verändern und auch dessen Verhalten.

      das hört sich gut an! Und wie handelst du das mit den Gegenständen? Die haben ja im Prinzip immer die gleichen Koordinaten, oder? Legst du diese in Feldern (Arrays) ab?

      Grüße
      Kleinbonum

      1. Guten Abend

        das hört sich gut an! Und wie handelst du das mit den Gegenständen? Die haben ja im Prinzip immer die gleichen Koordinaten, oder? Legst du diese in Feldern (Arrays) ab?

        Würd ich eher unterlassen. Wenn du ein Spielfeld von 4000x4000 Feldern hast wird das ein ganz schön grosses Array und die meisten Felder davon werden sowieso leer sein (kommt halt drauf an wieviele Objekte du hast).

        Dazu kommt dass somit ein Gegenstand nur genau ein Feld einnehmen kann und nicht grösser ist.

        Gib deinen Objekten Koordinaten und filtere diese anhang des Viewports beim rendern aus.

        Gruss
        Splinter

  4. Liebe(r) Kleinbonum,

    ich denke da an ein Element (id="world"), das Du relativ positionierst, und dessen Elternelement (id="worldview") Du mittels overflow:hidden ohne Scrollbalken und mittels width und height auf den festen Ausschnitt von 200x200px festlegst. Das Element "world" selbst enthält absolut positionierte Elemente, die in Abhängigkeit zu ihm natürlich mitscrollen, wenn Du mittels JavaScript die top und left Werte dynamisch anpasst.

    Der Avatar des Spielers ist ebenso absolut in "world" positioniert. Sollte das Scrolling in den Randbereich kommen, dann gibt es eben Minimal- (0,0) und Maximalwerte (3800,3800), die nicht unter- bzw. überschritten werden können. Da der Avatar aber synchron mitbewegt wird, wandert er eben an den Randstellen bis zum Rand der Map.

    Ist Dir meine Denkweise klar geworden?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo Ingrid,

      ich denke da an ein Element (id="world"), das Du relativ positionierst, und dessen Elternelement (id="worldview") Du mittels overflow:hidden ohne Scrollbalken und mittels width und height auf den festen Ausschnitt von 200x200px festlegst.

      hier habe ich etwas gebastelt, das Dir vielleicht weiterhilft: Game Map

      Das Beispiel benutzt eine Map von "nur" 500x500px in einem 200x200px großen Ausschnitt, aber es würde auch mit einer Map mit beliebigen Maßen in einem Ausschnitt mit ebenso beliebigen Maßen (kleiner Map-Maße!) funktionieren.

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hello Felix,

        dass DU überhaupt Zeit hast zum Bastlen im Moment ... :-)))))

        hier habe ich etwas gebastelt, das Dir vielleicht weiterhilft: Game Map

        Und was soll passieren, wenn der Smiley am Rand angekommen ist? Gibt es dann einen Sprung?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Lieber Tom,

          dass DU überhaupt Zeit hast zum Bastlen im Moment ... :-)))))

          wenn's gerade etwas ruhiger ist, und die Nacht hereingebrochen, dann habe ich tatsächlich Zeit, für eine Stunde etwas zu basteln.

          hier habe ich etwas gebastelt, das Dir vielleicht weiterhilft: Game Map

          Und was soll passieren, wenn der Smiley am Rand angekommen ist? Gibt es dann einen Sprung?

          Nein, wieso? Wenn Du Dich in einem Zimmer auf die Wand zu bewegst, und diese dann auch erreichst, machst Du dann einen Sprung?

          Mal sehen, ob Kleinbonum diesen Thread überhaupt noch liest.

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. Hallo Tom und Felix,

            Mal sehen, ob Kleinbonum diesen Thread überhaupt noch liest.

            ja, ich lese noch bzw. gerade wieder. Ich muss erstmal alles durcharbeiten, d.h. eure beiden Varianten, dann melde ich mich nochmal. Danke schonmal für die wertvollen Tips und Hilfestellungen.

            vielen Dank!
            Kleinbonum

          2. Hello,

            Und was soll passieren, wenn der Smiley am Rand angekommen ist? Gibt es dann einen Sprung?

            Nein, wieso? Wenn Du Dich in einem Zimmer auf die Wand zu bewegst, und diese dann auch erreichst, machst Du dann einen Sprung?

            Das Gebiet ist ja größer, als der gezeigte Ausschnitt. Was passiert, wenn man auf den nächsten Ausschnitte wechseln möchte? Es geht mir dabei um die dynamische Erweiterung des Gebietes.

            Wobei das Maximum der Erweiterungen dann die gesamte Erde wäre :-)

            Mal sehen, ob Kleinbonum diesen Thread überhaupt noch liest.

            Und wenn nicht, dann interessiert der Thread mich auch noch, weil ich für unseren Schrotthändler eine Abholunterstützung bauen will...
            Die Tourenplanung soll interaktiv zwischen Kunden und Abholer in einem Gebiet ablaufen.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Lieber Tom,

              Und was soll passieren, wenn der Smiley am Rand angekommen ist?
              Das Gebiet ist ja größer, als der gezeigte Ausschnitt. Was passiert, wenn man auf den nächsten Ausschnitte wechseln möchte? Es geht mir dabei um die dynamische Erweiterung des Gebietes.

              das "Gebiet" ist begrenzt, und es ist abgeschlossen. Es gibt nur das, was als "Gebiet" definiert ist, und sonst nichts. Stößt man an den Rand, dann ist das eben der Rand des Gebiets. Warum sollte es ein weiteres geben? In einem Spiel gibt es eben nur die "Welt", was sollte da sonst noch sein?

              Wenn Du erweitern willst, dann erweitere die Welt/die Karte/das Gebiet. Wo ist da das Problem? Einen "Sprung" in eine neue Welt fände ich nicht intuitiv, zumindest nicht, wenn es einen "nahtlosen" Übergang bedeuten soll. Eine zusätzliche Interaktion (eine Form der Bestätigung wie Portal benutzen oder Türklinke betätigen) sollte da schon sein.

              interessiert der Thread mich auch noch, weil ich für unseren Schrotthändler eine Abholunterstützung bauen will...
              Die Tourenplanung soll interaktiv zwischen Kunden und Abholer in einem Gebiet ablaufen.

              Ob dieser Mechanismus dafür so unbedingt geeignet ist, bezweifle ich. Dein Schrott(*g*)[1] ist eine Real-World-Geschichte, warum also nicht innerhalb einer Google-Maps- (oder OpenStreetMap-)Umgebung bauen?

              Liebe Grüße,

              Felix Riesterer.

              [1] "Dein Schrott" ist nicht despektierlich gemeint! Aber dieses "Wortspiel" bot sich einfach an...

              --
              ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Hallo Felix,

                Und was soll passieren, wenn der Smiley am Rand angekommen ist?
                Das Gebiet ist ja größer, als der gezeigte Ausschnitt. Was passiert, wenn man auf den nächsten Ausschnitte wechseln möchte? Es geht mir dabei um die dynamische Erweiterung des Gebietes.

                das "Gebiet" ist begrenzt, und es ist abgeschlossen. Es gibt nur das, was als "Gebiet" definiert ist, und sonst nichts. Stößt man an den Rand, dann ist das eben der Rand des Gebiets. Warum sollte es ein weiteres geben? In einem Spiel gibt es eben nur die "Welt", was sollte da sonst noch sein?

                Wenn Du erweitern willst, dann erweitere die Welt/die Karte/das Gebiet. »»Wo ist da das Problem? Einen "Sprung" in eine neue Welt fände ich nicht »»intuitiv, zumindest nicht, wenn es einen "nahtlosen" Übergang bedeuten »»soll. Eine zusätzliche Interaktion (eine Form der Bestätigung wie Portal »»benutzen oder Türklinke betätigen) sollte da schon sein.

                Bei meinen ersten Versuchen ist mir aufgefallen, dass Toms Einwand durchaus Sinn macht. Und zwar bei einer sehr großen Welt. Warum sollte man alle Teile der Welt immer im Speicher belassen, wenn es unmöglich ist, sie zu erreichen? Und wenn es keine "in sich abgeschlossenen" Level gibt, eine offene Steppenregion zum Beispiel, macht auch eine Tür oder ein Portal keinen Sinn. Der Wanderer sollte gar nicht mitbekommen, dass jetzt eine neue Region beginnt - im internen Sinne, nicht im Sinne der Weltgeographie.

                Ich verstehe auch nicht, warum man immer alle Objekte auf der Karte zeichnen muss, auch wenn diese in unerreichbarer Entfernung liegen. Das kostet doch nur Performance...

                Grüße
                Kleinbonum

                1. Lieber Kleinbonum,

                  Warum sollte man alle Teile der Welt immer im Speicher belassen, wenn es unmöglich ist, sie zu erreichen? [...] Ich verstehe auch nicht, warum man immer alle Objekte auf der Karte zeichnen muss, auch wenn diese in unerreichbarer Entfernung liegen. Das kostet doch nur Performance...

                  bei einem Browsergame überlasse ich es dem Browser hier zu optimieren. Bei meinem Ansatz blieben zwar alle Objekte im Speicher, welche davon aber "gezeichnet werden", überlasse ich der Rendering Funktion des Browsers. So ist zumindest mein Bastelversuch gestrickt. Ob das wesentlich an der Performance rüttelt, kann ich momentan unmöglich testen.

                  Liebe Grüße,

                  Felix Riesterer.

                  --
                  ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      2. Hallo Ingrid,

        ebenfalls...

        Game Map

        Ich hatte noch etwas Spaß daran, den Ansatz etwas weiter zu verfolgen: Game-Entwurf

        Die Infrastruktur für Kollisionserkennung ist schon angelegt (leider noch nicht kreisförmig, sondern rechteckig), nur muss ich mir noch überlegen, wie ich dann mit den Events umgehe, und wie eine Game-Engine diese dann am sinnvollsten handhabt, damit man relativ einfach ein Spiel konzipieren kann.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hello Felix,

          Game Map

          Ich hatte noch etwas Spaß daran, den Ansatz etwas weiter zu verfolgen: Game-Entwurf

          Das sollte ich auf jeden Fall in meine Sammlung aufnehmen. Was brauchte ich doch gleich alles dafür, um es zu reproduzieren?

          Heute mal etwas faule Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Lieber Tom,

            Game-Entwurf

            wenn Du ihn jetzt ausprobierst, dann wirst Du wesentlich mehr interaktive Funktionalität finden. Ich habe zum ersten Mal mit eigenen Events experimentiert. Im Prinzip ist das ja nix besonderes, aber bevor man es selbst ausprobiert hat, haben sie einen mystischen Hauch des Unerreichbaren um sich. Jetzt ist das für mich ziemlich kalter Kaffee.

            Fast wäre es wert, dass ich meinen Artikel über das Fader-Framework mit einem zweiten Artikel über dieses "Game-Framework" ergänze... aber erstens fehlt mir dazu absolut die Zeit, und zweitens ist mir das Spielchen noch längst nicht genügend ausgereift - vor allem konzeptionell.

            Das sollte ich auf jeden Fall in meine Sammlung aufnehmen. Was brauchte ich doch gleich alles dafür, um es zu reproduzieren?

            ./index.html
            ./game/game.js
            ./game/css/game.css
            ./game/images/overlay.png
            ./game/images/dwarf.gif
            ./game/images/spring.gif
            ./game/images/fly.gif
            ./game/images/popcorn.gif

            Im IE (6+7) klappt die Tastaturabfrage nicht. Daher konnte ich den Rest der Funktionalitäten in dieser Krücke auch nicht überprüfen. Gleiches gilt für meinen alten Opera (9.5). Im FF und im Safari klappt dagegen alles wie gewünscht.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. ./index.html
              ./game/game.js
              ./game/css/game.css
              ./game/images/overlay.png
              ./game/images/dwarf.gif
              ./game/images/spring.gif
              ./game/images/fly.gif
              ./game/images/popcorn.gif

              ./game/images/dance.gif
              ./game/images/rain.gif
              ./game/images/violin.gif

              Liebe Grüße,

              Felix Riesterer.

              --
              ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Und wieder geändert...

                ./index.html
                ./game/game.js

                ./game/game.css

                ./game/images/overlay.png
                ./game/images/dwarf.gif
                ./game/images/spring.gif
                ./game/images/fly.gif
                ./game/images/popcorn.gif
                ./game/images/dance.gif
                ./game/images/rain.gif
                ./game/images/violin.gif

                ./game/images/sleep.gif
                ./game/images/sleepy.gif

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            2. Hi.

              Im IE (6+7) klappt die Tastaturabfrage nicht. Daher konnte ich den Rest der Funktionalitäten in dieser Krücke auch nicht überprüfen. Gleiches gilt für meinen alten Opera (9.5). Im FF und im Safari klappt dagegen alles wie gewünscht.

              In Opera 10.63 funktioniert es auch nicht, da die Tastaturbefehle von Opera genutzt werden. (Und ich habe leider keine Ahnung, wie man das abschalten kann.)

              In meinem FF geht es. Ist es aber richtig, das mit „x“ die ganze Karte aufgeklappt wird?

              Schönen Sonntag noch!
              O'Brien

              --
              Frank und Buster: "Heya, wir sind hier um zu helfen!"
              1. Lieber O'Brien,

                In Opera 10.63 funktioniert es auch nicht, da die Tastaturbefehle von Opera genutzt werden. (Und ich habe leider keine Ahnung, wie man das abschalten kann.)

                die Sache mit den Tastaturbefehlen ist nur ein Provisorium. In einem "echten" Spiel klickt man mit der Maus in die Karte und der Avatar soll sich dann auf einem Wege-Netz an die passende Stelle bewegen. Am besten mit einer netten Lauf-Animation...

                In meinem FF geht es. Ist es aber richtig, das mit „x“ die ganze Karte aufgeklappt wird?

                Das ist ein Debug-Mechanismus, der natürlich nicht für ein endgültiges Spiel geeignet ist.

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                1. Hallo Ingrid,

                  In Opera 10.63 funktioniert es auch nicht, da die Tastaturbefehle von Opera genutzt werden. (Und ich habe leider keine Ahnung, wie man das abschalten kann.)

                  mit dem Umstieg von document.onkeypress auf document.onkeydown ist nun auch der IE mit von der Partie, und ich vermute Opera auch.

                  Liebe Grüße,

                  Felix Riesterer.

                  --
                  ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                  1. Hi.

                    In Opera 10.63 funktioniert es auch nicht, da die Tastaturbefehle von Opera genutzt werden. (Und ich habe leider keine Ahnung, wie man das abschalten kann.)

                    mit dem Umstieg von document.onkeypress auf document.onkeydown ist nun auch der IE mit von der Partie, und ich vermute Opera auch.

                    Jain. Jetzt überlagert sich die Auswertung durch dein Skript mit der Auswertung durch Opera. Das führt sogar dazu, dass der Avatar sich außerhalb des angezeigten Kartenausschnitts befindet.

                    Nach dem „x“ hatte ich übrigens gefragt, weil in der Beschreibung steht:
                    „Use 'x' to let your avatar perform an interaction.“

                    Schönen Sonntag noch!
                    O'Brien

                    --
                    Frank und Buster: "Heya, wir sind hier um zu helfen!"
                    1. Lieber O'Brien,

                      mit dem Umstieg von document.onkeypress auf document.onkeydown ist nun auch der IE mit von der Partie, und ich vermute Opera auch.

                      Jain. Jetzt überlagert sich die Auswertung durch dein Skript mit der Auswertung durch Opera. Das führt sogar dazu, dass der Avatar sich außerhalb des angezeigten Kartenausschnitts befindet.

                      ich habe nun komplett auf Maussteuerung umgestellt. Dahinter steckt die Idee, ein Wegpunkt-System zu implementieren... aber soweit bin ich noch nicht.

                      Nach dem „x“ hatte ich übrigens gefragt, weil in der Beschreibung steht:
                      „Use 'x' to let your avatar perform an interaction.“

                      Das habe ich nun komplett entfernt. Interaktion entsteht automatisch, wenn der Avatar mit anderen Figuren kollidiert.

                      Liebe Grüße,

                      Felix Riesterer.

                      --
                      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                      1. Hallo Ingrid,

                        ich habe nun komplett auf Maussteuerung umgestellt.

                        die Bewegung des Avatars ist nun "schöner", da er die Koordinaten proportional anpasst.

                        Dahinter steckt die Idee, ein Wegpunkt-System zu implementieren... aber soweit bin ich noch nicht.

                        Mit einer beliebigen Taste kann man den Avatar die Liste der Wegpunkte "abfahren" lassen. Aber wie ich die Intelligenz bauen muss, um den kürzesten Weg von WegpunktA nach WegpunktB zu finden, weiß ich noch nicht. Außerdem fehlt mir noch eine Idee, wie ich einen Klick irgendwo in der Welt einem "Haltepunkt" auf einer Wegstrecke zwischen zwei Wegpunkten zuordnen kann.

                        Wo kann ich mich denn in Sachen Wegpunkte-Logik schlau machen?

                        Liebe Grüße,

                        Felix Riesterer.

                        --
                        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    2. Hallo Felix,

      ich denke da an ein Element (id="world"), das Du relativ positionierst, und dessen Elternelement (id="worldview") Du mittels overflow:hidden ohne Scrollbalken und mittels width und height auf den festen Ausschnitt von 200x200px festlegst. Das Element "world" selbst enthält absolut positionierte Elemente, die in Abhängigkeit zu ihm natürlich mitscrollen, wenn Du mittels JavaScript die top und left Werte dynamisch anpasst.

      jetzt ist mir das klar geworden. Bei jedem Schritt muss ich auch die Position (sprich Koordinaten) der Elemente anpassen, alles klar. Damit hatte ich Verständnisprobleme. In diesem Zusammenhang noch eine Frage: Es wäre vermutlich sehr sinnvoll, zuerst die Koordinaten eines jeden Objektes abzufragen, um zu Testen, ob das Element überhaupt im Viewport liegt, bevor man es auf den Canvas zeichnet, oder? Sonst müsste man ja immer alle Objekte der Welt bewegen, obwohl diese gar nicht sichtbar sind?

      Der Avatar des Spielers ist ebenso absolut in "world" positioniert. Sollte das Scrolling in den Randbereich kommen, dann gibt es eben Minimal- (0,0) und Maximalwerte (3800,3800), die nicht unter- bzw. überschritten werden können. Da der Avatar aber synchron mitbewegt wird, wandert er eben an den Randstellen bis zum Rand der Map.

      Ist Dir meine Denkweise klar geworden?

      Absolut. Ich glaube, ich habe es begriffen. Ich werde mich mal an die Arbeit machen, und versuchen, dein Beispiel nachzubauen, bzw. in Python nachzuprogrammieren. Der Ablauf ist mir nun klar, auch Splinters Tip mit der Verwaltung der Gegenstände ist mir hier sehr hilfreich.

      Den Ascii-Modus, den DeusFingendi erwähnte, und der mich auch sehr interessiert, werde ich erstmal aussen vor lassen, das ist eine andere Geschichte. Da wollte ich ursprünglich auch nicht hin.

      Vielen Dank euch allen! Ein großes Problem hat sich in kleinere, überschaubarere Unterprobleme gewandelt. Das dürfte machbar sein. Sicher werde ich noch eine Fragen haben, vielleicht auch, wenn dieser Thread schon im Archiv ist. Dann müsste ich einen neuen Thread eröffnen...?

      Kleinbonum

      1. Lieber Kleinbonum,

        jetzt ist mir das klar geworden. Bei jedem Schritt muss ich auch die Position (sprich Koordinaten) der Elemente anpassen, alles klar.

        ähm... nein. Nur die Koordinaten der Elemente, die sich selbst innerhalb der Welt bewegen (wie z.B. der Avatar). Alle anderen Elemente verbleiben "an Ort und Stelle" und werden automatisch mitgescrollt.

        Es wäre vermutlich sehr sinnvoll, zuerst die Koordinaten eines jeden Objektes abzufragen, um zu Testen, ob das Element überhaupt im Viewport liegt, bevor man es auf den Canvas zeichnet, oder?

        Nein! Alle Elemente werden in die Welt gesetzt, und dort sind sie dann. Der Viewport "fährt" über die Karte und zeigt den passenden Ausschnitt. Je nachdem welches Element wo in der Welt gerade ist, kann man es dann im Ausschnitt sehen, oder eben nicht.

        Sonst müsste man ja immer alle Objekte der Welt bewegen, obwohl diese gar nicht sichtbar sind?

        Bewegen muss man nur, was sich von seiner Stelle weg bewegt. Und wenn Deine Gegenstände in Deiner Welt "stehen", dann bewegt sich nur der Ausschnitt über sie hinweg, falls man den Avatar bewegt.

        Sollten sich aber "Bewohner" in der Welt bewegen, dann musst Du sie tatsächlich bewegen, aber völlig unabhängig vom gegenwärtigen Ausschnitt der Karte!

        Ich werde mich mal an die Arbeit machen, und versuchen, dein Beispiel nachzubauen, bzw. in Python nachzuprogrammieren. Der Ablauf ist mir nun klar, auch Splinters Tip mit der Verwaltung der Gegenstände ist mir hier sehr hilfreich.

        Für die Interaktion des Avatars mit seiner Umwelt musst Du tatsächlich noch eine "Kollisionserkennung" basteln. Das geht mit den Koordinaten der jeweiligen Objekte (in meinem Beispiel bekommt das <img>-Elementobjekt eine Eigenschaft "pos", in der die X- und Y-Koordinaten innerhalb der Welt gespeichert sind) und ihren Abmessungen (offsetWidth/offsetHeight). Du wirst sicherlich Bilder verwenden, um die Dinge in Deiner Welt darzustellen. Dazu benötigst Du sicherlich <img>-Elemente, und die haben Abmessungen, die man zusammen mit den (natürlich selbst gespeicherten) Koordinaten verrechnen kann.

        Wozu willst Du Python verwenden, wenn das Ganze im Browser ablaufen soll?

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. hallo Felix,

          jetzt ist mir das klar geworden. Bei jedem Schritt muss ich auch die Position (sprich Koordinaten) der Elemente anpassen, alles klar.

          ähm... nein. Nur die Koordinaten der Elemente, die sich selbst innerhalb der Welt bewegen (wie z.B. der Avatar). Alle anderen Elemente verbleiben "an Ort und Stelle" und werden automatisch mitgescrollt.

          Hmmm, moment. Du gehts ja davon aus, dass es ein Browsergame wird. Ich möchte aber doch eine Desktop-Anwendung mit Python und OpenGL machen (zumindest hatte ich das bis gerade eben kurz vor der Antwort an Deus F. noch vor). Das Konzept mit dem Scrollen und dem Layer (Maske) wird es da so nicht geben...

          Es wäre vermutlich sehr sinnvoll, zuerst die Koordinaten eines jeden Objektes abzufragen, um zu Testen, ob das Element überhaupt im Viewport liegt, bevor man es auf den Canvas zeichnet, oder?

          Nein! Alle Elemente werden in die Welt gesetzt, und dort sind sie dann. Der Viewport "fährt" über die Karte und zeigt den passenden Ausschnitt. Je nachdem welches Element wo in der Welt gerade ist, kann man es dann im Ausschnitt sehen, oder eben nicht.

          Hm, wie gesagt, dieser Ansatz scheint mir für JavaScript bzw. HTML gültig zu sein. Allerdings bin ich mir jetzt nicht mehr sicher.

          » »» Sonst müsste man ja immer alle Objekte der Welt bewegen, obwohl diese gar nicht sichtbar sind?

          Bewegen muss man nur, was sich von seiner Stelle weg bewegt. Und wenn Deine Gegenstände in Deiner Welt "stehen", dann bewegt sich nur der Ausschnitt über sie hinweg, falls man den Avatar bewegt.

          Klar.

          Sollten sich aber "Bewohner" in der Welt bewegen, dann musst Du sie tatsächlich bewegen, aber völlig unabhängig vom gegenwärtigen Ausschnitt der Karte!

          Ok, ja, na ja, Wesen wird es erstmal nicht geben vermutlich :)

          Ich werde mich mal an die Arbeit machen, und versuchen, dein Beispiel nachzubauen, bzw. in Python nachzuprogrammieren. Der Ablauf ist mir nun klar, auch Splinters Tip mit der Verwaltung der Gegenstände ist mir hier sehr hilfreich.

          Für die Interaktion des Avatars mit seiner Umwelt musst Du tatsächlich noch eine "Kollisionserkennung" basteln. Das geht mit den Koordinaten der jeweiligen Objekte (in meinem Beispiel bekommt das <img>-Elementobjekt eine Eigenschaft "pos", in der die X- und Y-Koordinaten innerhalb der Welt gespeichert sind) und ihren Abmessungen (offsetWidth/offsetHeight). Du wirst sicherlich Bilder verwenden, um die Dinge in Deiner Welt darzustellen. Dazu benötigst Du sicherlich <img>-Elemente, und die haben Abmessungen, die man zusammen mit den (natürlich selbst gespeicherten) Koordinaten verrechnen kann.

          Wozu willst Du Python verwenden, wenn das Ganze im Browser ablaufen soll?

          siehe oben

          Grüße
          Kleinbonum

          1. Hmmm, moment. Du gehts ja davon aus, dass es ein Browsergame wird. Ich möchte aber doch eine Desktop-Anwendung mit Python und OpenGL machen (zumindest hatte ich das bis gerade eben kurz vor der Antwort an Deus F. noch vor). Das Konzept mit dem Scrollen und dem Layer (Maske) wird es da so nicht geben...

            Dann bist du ehrlich gesagt hier falsch. Deine Frage bezieht sich auf OpenGL Techniken die mit Web fast gar-nichts zu tun haben.

            Ich würde dir www.delphigl.com empfehlen. Ja da steht Delphi dran, aber die Leute da arbeiten mit vielen verschiedenen Programmiersprachen und können auch sehr gut bei grauer OpenGL Theorie helfen.
            Ich selbst habe dort viele Ideen und Hinweise für mein WebGL gefunden.

        2. Hello,

          Nein! Alle Elemente werden in die Welt gesetzt, und dort sind sie dann. Der Viewport "fährt" über die Karte und zeigt den passenden Ausschnitt. Je nachdem welches Element wo in der Welt gerade ist, kann man es dann im Ausschnitt sehen, oder eben nicht.

          Zum Verständnis, wenn man es serverseitig löst:
          Die Welt muss einmal gezeichnet werden.
          In die Welt muss man einmal alle Elemente hineinzeichnen.
          Bei jeder Änderung muss dieser Schritt wiederholt werden.
          Man kann mit Lebensdauer-Layern arbeiten, um das durch Hierarchisierung etwas zu beschleunigen. Also statische Ebene + besonders langlebige ergibt erste Zwischenstufe.
          1. ZS + langlebige Objekte ergibt 2. ZS

          dann muss man für die besonders kurzlebigen Elemente nur feststellen, ab welcher ZS die Hierarchie "dirty" wird und nur von dort ab neu berechnen lassen.

          Zum Schluss wird aus dem gecachten Bild der Ausschnitt herausgeschnitten und zum Client gesendet. Der Client muss dann noch die letzten ständig beweglichen Elemente überblenden...

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
  5. Hello,

    N, Du hast eine Karte,

    +---------------------------+
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        +---------------------------+

    die Du z.B. verkleinert als Übersicht darstellen lassen kannst oder aus der Du im Normalfall immer einen Ausschnitt darstellst

    +---------------------------+
        |                           |
        |    +----+                 |
        |    |    |                 |
        |    |    |                 |
        |    +----+                 |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        |                           |
        +---------------------------+

    In der Gesamtkarte werden dann die Attribute vermerkt

    • Bäume
    • Häuser
    • Spielfigur

    Die Spielfigur kann sich immer nur innerhalb des Ausschnittes, also relativ dazu bewegen, der Ausschnitt kann z.B. durch 8 Pfeile (URLs) an den Kanten und Ecken durch immer um einen halben Auschnitt weiterbewegen, wenn die Spielfigur im Bereich des Pfeiles steht.

    Du jannst die Grafik in verschiedenen Maßstäben vorberechnen, sodass das nicth bei jedem Request passieren muss. Die Attribute kannst Du dann am Client per Layer (hintergrund-transparente Grafik über die Grundgrafik legen)  auf die Grundgrafik legen lassen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  6. Hello,

    kleiner Nachtrag.
    Ich habe sowas mal angefangen...
    Man konnte auf einer Landkarte nur auf den Strassen laufen oder, wenn man sich bestimmte Eigenschaften gekauft hat, auch auf dem Rasen, oder...

    Das habe ich einfach über die Farben geregelt. Man hat in die Map geklickt, das hat den Request ausgelöst.

    Leider finde ich nur noch das Progrämmchen, mit dem ich die große Karte zerschniten habe. Es wurden daraus immer neun Teile gezeigt, sodass man immer um ein Drittel weiterrollen konnte.

    Das war die Gesamtdarstellung...
    http://www.harzhirt.de/maps/showmap.php#ID8.8

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  7. Lieber Kleinbonum,

    so langsam wird der Thread zu meinem großen Selbstgespräch... und wahrscheinlich liest Du längst nicht mehr mit. Aber auf Deine Frage zu antworten hat mich so inspiriert, und das Ergebnis hat mir so großen Spaß auf mehr gemacht, dass ich einfach nicht aufhören wollte/konnte.

    In meinem Game-Entwurf kann der Avatar jetzt auch durch ein Portal gehen... Was noch fehlt, ist eine intelligente Wegpunkt-Finde-Logik, die den kürzesten Weg zwischen zwei Wegpunkten in einem Wegpunkte-Netz findet.

    Kann mir da jemand Tipps (Linktipps) geben, wie man soetwas anzustellen hat?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hello Felix,

      Deine Leute scheinen dich wohl ziemlich wach zu halten?

      In meinem Game-Entwurf kann der Avatar jetzt auch durch ein Portal gehen... Was noch fehlt, ist eine intelligente Wegpunkt-Finde-Logik, die den kürzesten Weg zwischen zwei Wegpunkten in einem Wegpunkte-Netz findet.

      Das ist eine sehr schöne Lösung...

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hello Felix,

        Das ist eine sehr schöne Lösung...

        Der gute alte IE6 macht allerdings Flimmerstunde daraus.
        Kann aber auch daran liegen, dass bei mir nebenbei gerade IPTV läuft über dieselbe Leitung.
        Allerdings stellt der Firefox alles sehr ordentlich dar...

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Lieber Tom,

          Der gute alte IE6 macht allerdings Flimmerstunde daraus.

          der gute alte darf das auch. Einem sabbernden senilen Tattergreis sieht man so manches gerne nach. ^^

          Allerdings stellt der Firefox alles sehr ordentlich dar...

          Auf dem wurde es ja entwickelt. Was mich stört ist, dass der IE8 die opacity-Eigenschaft nicht umsetzt, obwohl er sie doch nativ unterstützen sollte. Mit der filter:alpha-Geschichte hält die gesamte Gif-Animation aller(!) Grafiken inne, bis der Überblendungsvorgang abgeschlossen ist. Daher hatte ich eigentlich mit Conditional Compilation dafür gesorgt, dass nur IEs vor der 8er Version diesen Krampf machen müssen. *grr*

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      2. Lieber Tom,

        Deine Leute scheinen dich wohl ziemlich wach zu halten?

        oh ja...

        Das ist eine sehr schöne Lösung...

        Mit den animierten Smilies wirkt es gleich irgendwie charmanter, nicht wahr?

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    2. Hi.

      In meinem Game-Entwurf kann der Avatar jetzt auch durch ein Portal gehen... Was noch fehlt, ist eine intelligente Wegpunkt-Finde-Logik, die den kürzesten Weg zwischen zwei Wegpunkten in einem Wegpunkte-Netz findet.

      Kann mir da jemand Tipps (Linktipps) geben, wie man soetwas anzustellen hat?

      Vielleicht kannst du dir bei den Jungs von Widelands was abschauen oder den ein oder anderen Tipp bekommen?

      Schönen Sonntag noch!
      O'Brien

      --
      Frank und Buster: "Heya, wir sind hier um zu helfen!"
      1. Lieber O'Brien,

        Vielleicht kannst du dir bei den Jungs von Widelands was abschauen oder den ein oder anderen Tipp bekommen?

        da werde ich einmal nachschauen. Vielen Dank für den Hinweis!

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      2. Lieber O'Brien,

        Vielleicht kannst du dir bei den Jungs von Widelands was abschauen oder den ein oder anderen Tipp bekommen?

        ich habe die Sourcen heruntergeladen und im Quelltext auch etwas diesbezügliches gefunden. Aber da dort im Spiel so viele Objekte definiert werden, über die ich keinen Überblick habe, und von denen in den jeweiligen Skripten Methoden und Eigenschaften modifiziert werden, steige ich im Moment noch nicht so richtig durch.

        Es scheint aber so zu sein, dass es feste Pfade von Wegpunkten gibt, auf die die Figuren jeweils schrittweise abgebildet werden, anstatt dass einzelne Wegpunkte in weiterer Distanz der Reihe nach "abgewandert" werden. Anscheinend kann man nur so Wege mit Krümmungen sinnvoll realisieren, wenn eine Figur "wie auf Schienen" darauf laufen soll.

        Mal sehen, was ich machen kann, denn diese Unmengen an Wegpunkten (das sind dann ja alle jeweils möglichen Positionen einer Figur!) zu erstellen, widerstrebt mir noch. Und ob ich das vom Script selbst erledigen lassen kann... und wie lange ein Besucher dann warten muss, bis das Spiel spielbar wird, habe ich noch nicht ausreichend überlegt.

        Der Tipp war ansonsten nicht schlecht! Vielen Dank dafür.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hi.

          Vielleicht kannst du dir bei den Jungs von Widelands was abschauen oder den ein oder anderen Tipp bekommen?

          ich habe die Sourcen heruntergeladen und im Quelltext auch etwas diesbezügliches gefunden. Aber da dort im Spiel so viele Objekte definiert werden, über die ich keinen Überblick habe, und von denen in den jeweiligen Skripten Methoden und Eigenschaften modifiziert werden, steige ich im Moment noch nicht so richtig durch.

          Das ist auch nicht so ganz ohne, glaube ich. Die Widelands-Truppe ist da schließlich schon einige Jahre am basteln ...

          Der Tipp war ansonsten nicht schlecht! Vielen Dank dafür.

          Gerne. Mehr als den Tipp konnte ich dir sowieso nicht geben, denn ich selbst habe Null Ahnung von so etwas. Als alter Siedler-II-Spieler hatte ich jedoch mal von Widelands gehört.

          Schönen Sonntag noch!
          O'Brien

          --
          Frank und Buster: "Heya, wir sind hier um zu helfen!"
          1. Lieber O'Brien,

            Widelands
            ich habe die Sourcen heruntergeladen [...] steige ich im Moment noch nicht so richtig durch.

            ich gehe jetzt meinen eigenen Weg. Eine Idee von Tom aufgreifend habe ich mir ein Werkzeug geschrieben, um meine Wegpunkte in der Karte zu verteilen: create-waypoints.html - aber wie ich mit den Wegpunkten dann verfahre, ist noch in Arbeit. Werde natürlich berichten. ;-)

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hi.

              ich gehe jetzt meinen eigenen Weg.

              Ein Ende ist nicht abzusehen. ;)

              Werde natürlich berichten. ;-)

              Bin schon gespannt darauf. :)

              Schönen Sonntag noch!
              O'Brien

              --
              Frank und Buster: "Heya, wir sind hier um zu helfen!"
              1. Lieber O'Brien,

                Ein Ende ist nicht abzusehen. ;)

                Werde natürlich berichten. ;-)

                Bin schon gespannt darauf. :)

                jetzt tut's. Mein Avatar bewegt sich wie auf Schienen: Game-Entwurf

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                1. Hello du toller Felix!

                  jetzt tut's. Mein Avatar bewegt sich wie auf Schienen: Game-Entwurf

                  das ist es doch! Das passt genau zu dem Stadtspiel-Entwurf, den ich mal in grauer Vorzeit gemacht habe.

                  Jetzt muss man noch bestimmte Bedingungen "messen" können und Events steuern können. Aber das mit den Treffern hattest Du ja schon am Anfang. Kannst Du schon feststellen, wie weit dein Avatar gelatscht ist und ihn eventuell unterwegs anhalten, wenn der Sprit ausgeht?

                  Es muss dann auch auf dem Server bekannt sein, was am Client passiert ist, damit man nicht schummeln kann.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
            2. Hello lieber Felix,

              Widelands
              ich habe die Sourcen heruntergeladen [...] steige ich im Moment noch nicht so richtig durch.

              ich gehe jetzt meinen eigenen Weg. Eine Idee von Tom aufgreifend habe ich mir ein Werkzeug geschrieben, um meine Wegpunkte in der Karte zu verteilen: create-waypoints.html - aber wie ich mit den Wegpunkten dann verfahre, ist noch in Arbeit. Werde natürlich berichten. ;-)

              Ich bin jetzt endlich mal dazu gekommen, mir das anzusehen. Das ist wirklich schon superklasse!
              Wenn Du jetzt noch die Karte drittelweise weiterschalten könntest und die Punkte dabei nicht verloren gingen, dann wäre es doch schon perfekt für ein Stadtspiel, bei dem man über einen echten Stadtplan marschieren muss.

              Die Kommunikation mit dem Backend müsste dann per AJAX stattfinden, damit die Punkte auch "manipulationssicher" in die Karte eingetragen werden und festgestellt werden kann, ob man sich noch auf einem Weg befindet, oder in der Botanik.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de