minicrispie: Wie kann ich Menschen bewegen?

Hallo an alle,

und ich hab schon wieder mal ein größeres Problem...
und diesmal gehts auch nicht um ne Seitenbewertung ;)

in meinem Spiel, was ich(versuche) zu programmieren, steh ich jetzt vor dem Problem, das ich nicht weis, wie ich die Menschen dazu bringe, sich von A nach B zu bewegen.
Ich suche nach einem Algorythmus oder so, der berücksichtigt, ob der Mensch abbiegen muss, weil ein Gegenstand oder so in der Nähe ist, oder ob er einfach gerade aus läuft.
Bisher hab ich da noch nicht so richtig eine Lösung gefunden und in dem Suchmaschinchen weis ich nicht so recht, was ich eingeben soll.
Könnt ihr mir Helfen?
Kann man das überhaupt so machen, da ich die Menschen und den Rest in zwei Divs unterteilt habe(Die Divs werden per JS und DOM dynamisch gefüllt.).

Achso, hier noch die Adresse: Das Dörfchen

MfG. Christoph

P.S.: Regt euch nicht über die grafiken auf oder irgendwie um "Aussehen" ... das muss ich eh noch alles überdenken...
P.P.S.: Bei der Wiese kann das Laden ein bisschen länger dauern, aber ich arbeite dran ...

--
Wo die Sprache aufhört, fängt die Musik an...
Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
Go to this
  1. Hallo Christoph,

    Ich suche nach einem Algorythmus oder so, der berücksichtigt, ob der Mensch abbiegen muss, weil ein Gegenstand oder so in der Nähe ist, oder ob er einfach gerade aus läuft.

    dieser Archivthread könnte Dich interessieren.

    Freundliche Grüße

    Vinzenz

  2. Hi,

    Wie man die Positio eines Elementes veraendert, weisst Du?

    Das waere Schritt 1. Ein Funktion, die je nach Parameter ein Element bewegt, waere Schritt 2.

    Am einfachsten sind Spielfelder in Matritzen aufzuteilen. Dazu bieten sich quadratische Felder oder Hexfelder an. Pac-Man z.b. ist ein typischer Vertrteter der mit nur 4 Richtungen auf Quadratischen Spielfeldern arbeitet. Du brauchst also links, rechts, hoch, runter. (+1, -1, -Breite, +Breite)

    Dann kaeme eine Hexfeldloesung, bekannt aus vielen Strategiespielen. Die funktioniert ungefaehr genauso. Nur dass es ploetzlich 6 Seiten pro Feld gibt. Hier haben hoch und runter meist je 2 werte (fuer links und rechts). Hier waeren, je nach Matrix hoch und runter Werte von Breite-1 bis Breite+1.

    Als letztes kann man noch das Feld aus quadratischen Feldern anfuehren, die aber ueber 8 Seiten verfuegen. hier ist jeder der Ecken benfalls gueltiger Eintritts- und Austrittspunkt. Ein Beispiel hierfuer waere das gute alte Jagged Alliance.

    Eigentlich basieren alle heutigen Berechnungen, auch wenn man das Spielfeld nict mehr unbedingt in Felder aufteilen kann, auf diesen Grundprinzipien.

    Bleibt noch eine Kollisionsabfrage: Bei vielen Spielen bewegt man sich in solchen Spielbloecken. Es gibt selten etwas, das nicht in so einem Block untergebracht ist. Also stellt man schlicht und einfach fest, ob im naechsten Block, in den man moechte, etwas ist, das den Eintritt verhindert. Das kann eine Wand sein oder eine andere Spielfigur. Bei Spielen wie Jagged Alliance ist fuer jeden Block noch ein Rand definiert fuer den wiederum verschiedene Attribute gelten. durchsichtig aber nicht passierbar, von einer seite passierbar, gar nicht passierbar,...

    Deine Bewegungsroutine wuerde also vor jedem Schritt pruefen ob es geradeaus weitergehen kann, indem sie das naechste Feld in Schrittrichtung prueft. Das ist relativ einfach und schnell realisierbar.

    Nerviger wird eine echte Kollisionsabfrage die nicht ueber eine Matrix sondern ueber die Bildschirmposition funktioniert. Als man frueher noch Sprites ala Super Mario ueber den Schirm geschoben hat, bekam einfach jedes Sprite einen Kasten verpasst und es wurde bei jedem Interrupt (bei jedem Bewegungsschritt) nachgerechnet ob Sprites sich innerhalb des selben Bildschirmbereichs befinden. Das ist auch mit JS machbar, aber erfordert natuerlich einiges mehr an Berechnungen.

    Ich konnte dein Spiel nicht testen, weil es hier nicht geladen wird. Aber ich denke die erste Variante sollte fuer dich am Prakikabelsten sein. Du wirst ja wohl eine Spielfeldmatrix im Speicher haben, auf der Du dann einfach die Bewegungen durchfuehrst um bei Erfolg die Grafikausgabe durchzufuehren. Bewaehrt haben sich dabei fuer mich immer mehrdimensionale Arrays. Eine Dimension fuer das eigentliche Spielfeld und weitere fuer moegliche andere Elemente.

    Weil ich auch nicht weiss, wie Komplex deine Bewegungen sein muessen kann ich leider nicht mehr dazu sagen. Eine Figur allein durch ein Labyrinth zu fuehren ist wesentlich schwieriger und komplexer als eine simple Pac-Man KI.

    --
    Trau Dich!
     
    1. Hallo,

      Hi,

      Wie man die Positio eines Elementes veraendert, weisst Du?

      Goldrichtig ... das ist nun wirklich nicht das problem :)

      Am einfachsten sind Spielfelder in Matritzen aufzuteilen. Dazu bieten sich quadratische Felder oder Hexfelder an. Pac-Man z.b. ist ein typischer Vertrteter der mit nur 4 Richtungen auf Quadratischen Spielfeldern arbeitet. Du brauchst also links, rechts, hoch, runter. (+1, -1, -Breite, +Breite)
      Dann kaeme eine Hexfeldloesung, bekannt aus vielen Strategiespielen. Die funktioniert ungefaehr genauso. Nur dass es ploetzlich 6 Seiten pro Feld gibt. Hier haben hoch und runter meist je 2 werte (fuer links und rechts). Hier waeren, je nach Matrix hoch und runter Werte von Breite-1 bis Breite+1.

      Nagut ... diese Variante werde ich wohl nicht nehmen...

      Als letztes kann man noch das Feld aus quadratischen Feldern anfuehren, die aber ueber 8 Seiten verfuegen. hier ist jeder der Ecken benfalls gueltiger Eintritts- und Austrittspunkt. Ein Beispiel hierfuer waere das gute alte Jagged Alliance.

      Nur mal so zwischendurch ... ein Quadrat hat IMMER 4 Kanten ... was du meinst ist ein Vieleck ;)

      Bleibt noch eine Kollisionsabfrage: Bei vielen Spielen bewegt man sich in solchen Spielbloecken. Es gibt selten etwas, das nicht in so einem Block untergebracht ist. Also stellt man schlicht und einfach fest, ob im naechsten Block, in den man moechte, etwas ist, das den Eintritt verhindert. Das kann eine Wand sein oder eine andere Spielfigur. Bei Spielen wie Jagged Alliance ist fuer jeden Block noch ein Rand definiert fuer den wiederum verschiedene Attribute gelten. durchsichtig aber nicht passierbar, von einer seite passierbar, gar nicht passierbar,...

      Ich denke, etwas in der Art werde ich machen ...

      Deine Bewegungsroutine wuerde also vor jedem Schritt pruefen ob es geradeaus weitergehen kann, indem sie das naechste Feld in Schrittrichtung prueft. Das ist relativ einfach und schnell realisierbar.

      Naja ... sooo viel Ahnung hab ich nun auch wieder nicht, das ich in 5 Minuten ein Skript habe aber es würde gehen ^^

      Nerviger wird eine echte Kollisionsabfrage die nicht ueber eine Matrix sondern ueber die Bildschirmposition funktioniert. Als man frueher noch Sprites ala Super Mario ueber den Schirm geschoben hat, bekam einfach jedes Sprite einen Kasten verpasst und es wurde bei jedem Interrupt (bei jedem Bewegungsschritt) nachgerechnet ob Sprites sich innerhalb des selben Bildschirmbereichs befinden. Das ist auch mit JS machbar, aber erfordert natuerlich einiges mehr an Berechnungen.

      Ok ... ich werde also meine Spielfläche in blöcke aufteilen und die "Block-Überprüfung" machen.

      Ich konnte dein Spiel nicht testen, weil es hier nicht geladen wird. Aber ich denke die erste Variante sollte fuer dich am Prakikabelsten sein.

      Wieso nicht geladen?

      Du wirst ja wohl eine Spielfeldmatrix im Speicher haben, auf der Du dann einfach die Bewegungen durchfuehrst um bei Erfolg die Grafikausgabe durchzufuehren.

      Leider nicht. Aber ich werde es nachholen ^^

      Bewaehrt haben sich dabei fuer mich immer mehrdimensionale Arrays. Eine Dimension fuer das eigentliche Spielfeld und weitere fuer moegliche andere Elemente.

      Ok, da stimme ich dir zu...

      Also als Zusammenfassung muss ich sagen:
      Ich muss mein ganzes Zeug noch einmal "umcodieren", damit ich blöcke besitze, die ich in Arrays speichern kann(und werde). Danach prüfe ich bei jedem noch so dämlichen schritt eines Menschen, ob er in die richtung gehen kann oder ob er ausweichen soll und wenn ja wie und wie es nachher weitergeht ...

      Puhh ... da kommt noch ne menge auf mich zu ^^

      MfG. Christoph

      --
      Wo die Sprache aufhört, fängt die Musik an...
      Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
      Go to this
      1. Hallo Christoph,

        Als letztes kann man noch das Feld aus quadratischen Feldern anfuehren, die aber ueber 8 Seiten verfuegen. hier ist jeder der Ecken benfalls gueltiger Eintritts- und Austrittspunkt. Ein Beispiel hierfuer waere das gute alte Jagged Alliance.

        Nur mal so zwischendurch ... ein Quadrat hat IMMER 4 Kanten ... was du meinst ist ein Vieleck ;)

        nein, Steel meint, dass in diesem Fall ein Feld 8 Nachbarfelder hat:

        -------------
           | 1 | 2 | 3 |
           -------------
           | 8 | X | 4 |
           -------------
           | 7 | 6 | 5 |
           -------------

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          Nur mal so zwischendurch ... ein Quadrat hat IMMER 4 Kanten ... was du meinst ist ein Vieleck ;)

          nein, Steel meint, dass in diesem Fall ein Feld 8 Nachbarfelder hat:

          -------------
             | 1 | 2 | 3 |
             -------------
             | 8 | X | 4 |
             -------------
             | 7 | 6 | 5 |
             -------------

          Achso ... nagut ... mein Fehler :)

          MfG. Christoph

          --
          Wo die Sprache aufhört, fängt die Musik an...
          Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
          Go to this
          1. nein, Steel meint, dass in diesem Fall ein Feld 8 Nachbarfelder hat:
            Achso ... nagut ... mein Fehler :)

            Nein, Steel hat ja tatsächlich von "Seiten" geschrieben. Gemeint waren aber die Verbindungen zwischen den Feldern.

            --
            Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
            Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
            1. Hallo,

              nein, Steel meint, dass in diesem Fall ein Feld 8 Nachbarfelder hat:
              Achso ... nagut ... mein Fehler :)
              Nein, Steel hat ja tatsächlich von "Seiten" geschrieben. Gemeint waren aber die Verbindungen zwischen den Feldern.

              ok ... jetz versteh ich gar nix mehr ... :(

              MfG. Christoph

              --
              Wo die Sprache aufhört, fängt die Musik an...
              Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
              Go to this