Computer löst Irrgarten

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • also sry hab den Code noch falsch eingetippt im Programm war er aber richtig xD

      also prinzip dieser Abfrage:
      Es gibt einen Charakter, welcher in direction 0 geht mit speed 6

      dabei wenn dieser Charakter auf eine Wand trifft mit direction 0, sollte er eigentlich nach rechts gehen (Lösen eines Irrgartens "Rechte_Hand_Regel"). Jedoch kann es auch sein, dass es rechts eine Mauer hat, deshalb sollte der Charakter das also merken und schliesslich nach links abbiegen. Sackgassen mal ausgeschlossen.

      GML-Quellcode

      1. if (direction = 0)
      2. {
      3. if (place_free(x,y-lengthdir_y(32,direction)))
      4. {
      5. direction = 90
      6. speed = 6
      7. }
      8. exit;
      9. }
      10. else
      11. {
      12. direction = 270
      13. speed = 6;
      14. }​
      Alles anzeigen
    • ich würde den Code ungefähr so schreiben(ungetestet):

      GML-Quellcode

      1. if(!place_free(x+lengthdir_x(speed,direction),y+lengthdir_y(speed,direction))){
      2. var dir;
      3. dir = direction+90; //rechts
      4. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir))){
      5. dir=direction-90; //links
      6. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir))){
      7. dir=direction-180; //nach hinten, Sackgassen eingeschlossen
      8. }
      9. }
      10. direction = dir;
      11. }
      Alles anzeigen
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • ich habe jetzt ja auf collisionen geckeckt, jedoch kann ich den oben genannten Code auch zu place empty umwandeln? so dass wenn die Figur (direction = 0) in y richtung kein Objekt vorhanden ist nach rechts abbiegt?

      GML-Quellcode

      1. if (direction=0)
      2. {
      3. if (place_empty(x,y+6))
      4. {
      5. var dir;
      6. dir= direction - 90;
      7. }
      8. direction = dir;
      9. }

    • Oh den Code hatte ich noch nicht gesehen ^^
      Ich würde jetzt sagen, dass es zu wenig Pixel sind. Sonst sehe ich keinen Fehler.
      hier musst du aber nicht die Variable dir deklarieren und kannst einfach direction -= 90; oder direction = 270; machen. Es sollte zudem noch if(direction==0) statt =0 heißen. ;)
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • GML-Quellcode

      1. if(!place_free(x+lengthdir_x(speed,direction),y+lengthdir_y(speed,direction))){
      2. var dir;
      3. dir = direction+90; //rechts
      4. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir))){
      5. dir=direction-90; //links
      6. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir))){
      7. dir=direction-180; //nach hinten, Sackgassen eingeschlossen
      8. }
      9. }
      10. direction = dir;
      11. }
      Alles anzeigen


      dieser Code steht bei mir im Step- Event, den ich verzweifelt versuch umzuschreiben, da dieser nicht genau den Zweck erfüllt, dies zu lösen, was ich möchte.
      Wenn der Charakter z.B. in Richtung 180 läuft, vor ihm ist jedoch nichts, dennoch könnte der Charakter nach rechts abbiegen. Gäbe es da eine besser Lösung, dass der Charakter die ganze Zeit testet, ob rechts ein Weg frei ist? Ich denke es wäre eben schlussendlich nützlicher, wenn der Charakter nach einem Freien weg strebt, der nach Rechts geht, dabei aber immer noch darauf reagiert, wenn er auf eine Wand gerät, dass er dann rechts und links checkt(wie im Code).... Habe da schon jede Menge versucht, jedoch ohne erfolg. Ich denke das Problem liegt nicht daran, dass ich nicht weiss was ich verwenden soll, sondern dass ich nooch immer mühe habe, den Code richtig darzustellen, ohne dass er dabei vom Computer falsch verstanden wird-.- Wäre froh wenn jemand eine Verbesserung oder eine Totale erneuerung für den Code, diese Idee an mich weiterleiten könnte oder gar schnell abändern, ich denke je mehr ich sehe, desto mehr kann ich diese auch bei den anderen Projekten anwenden und dabei Erfahrung sammeln. Diese habe ich noch nicht wirklich und entschuldige mich für die dauernden immer gleichbleibenden Fragen...:/

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Freakkong ()

    • Schau mal, direction-90 ist rechts. Frag einfach jeden Step ab, ob man nach rechts kann und dreh dich wenn möglich.
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • Das Step Event wird jedes Frame/jeden Step aufgerufen.
      Du musst also einfach nur deinen Code vor oder hinter deinen Packen.
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • GML-Quellcode

      1. /// nach rechts schauend
      2. if (direction==0)
      3. {
      4. if (place_free(x,y+lengthdir_y(speed,direction)))
      5. {
      6. var dir;
      7. dir= direction-90; /// rechts
      8. if(!place_free(x+lengthdir_x(speed,direction),y+lengthdir_y(speed,direction)))
      9. {
      10. dir = direction-90; //rechts
      11. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir)))
      12. {
      13. dir=direction+90; //links
      14. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir)))
      15. {
      16. dir=direction-180; //nach hinten, Sackgassen eingeschlossen
      17. }
      18. }
      19. direction = dir;
      20. }
      21. }
      22. }
      Alles anzeigen


      habe es mal versucht... jedoch ohne erfolg
    • gehe mal den Code genau durch.

      GML-Quellcode

      1. ​if (place_free(x,y+lengthdir_y(speed,direction)))

      ist nicht ganz richtig.
      Ich übersetze mal kurz den Code in unsere Sprache:
      ​?Wenn es nach rechts schaut
      und kein solides Objekt berührt
      ->setze Variable dir auf -90
      ->?wenn rechts (speed) Pixel weiter ein solides Objekt ist
      ->->setze Variable dir auf -90
      ->->?Wenn unter ihm (speed) Pixel weiter ein solides Obj ist
      ->->->Setze dir auf +90
      ->->->?Wenn über ihm ein solides Objekt ist
      ->->->->setze dir auf -180
      ->->setze direction auf dir

      ​und kein solides Objekt berührt
      bezieht sich darauf, dass lengthdir_y(speed,0) einfach auch 0 zurück gibt. lengthdir_y sieht so aus: dsin(dir)*len; und da kommt 0 heraus :)

      Hört sich ganz schön konfus an. Manche Abfragen sind etwas falsch gestellt und manche nicht genau an Ort und Stelle ;)

      Ich kann das jetzt nicht beurteilen, wie einfach es ist, den Code so, wie ich es gemacht habe, zu lesen, aber es ist manchmal hilfreich das zu versuchen um dann die Fehler herauszuarbeiten ;)
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • hmm dann ist place free wohl keine gute Idee, da ich ja nach einem ^^ habe es mal mit position_empty ersucht. dabei hab eich auch noch das Gefühl, dass die ganz bewegung nicht zusammenpasst.
      Also wenn der Charakter nach rechts schaut und am Punkt x,y+60 kein Object vorhanden ist,soll der Charakter nach rechts abbiegen. Dabei habe ich diesen in einen eigenen Event getan, da er meiner Meinung nach nicht in die gleiche Action gehört, also:

      GML-Quellcode

      1. if (direction==0)
      2. if (position_empty(x,y+60))
      3. {
      4. direction = 270
      5. }
      6. if(direction==0)
      7. {
      8. dir= direction-90
      9. if(!place_free(x+lengthdir_x(speed,direction),y+lengthdir_y(speed,direction)))
      10. {
      11. var dir;
      12. dir = direction-90; //rechts
      13. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir)))
      14. {
      15. dir=direction+90; //links
      16. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir)))
      17. {
      18. dir=direction-180; //nach hinten, Sackgassen eingeschlossen
      19. }
      20. }
      21. direction = dir;
      22. }
      23. }
      Alles anzeigen


      und hier die Situation noch in Bild:
      Es hat Wände unten, jedoch auf einmal nicht mehr und dieser sollte dort abbiegen. Vielleicht begreife ich auch dies mit den Koordinaten nicht=> Charakter x=30 y=30 und die Wände x=32 y=32
      Bilder
      • MA bild.PNG

        10,84 kB, 555×396, 178 mal angesehen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Freakkong ()

    • Ich frage mich, warum die direction unbedingt auf 0 sein muss ^^

      Oben hast du zwei die selben abfragen, die Fragen ob es nach links geht.

      place_empty oder place_free macht hier kein Unterschied. Ein position davor aber mehr. Schau dir die Unterschiede mal in der Hilfe an.

      Ich wollte im eigentlichen nur darauf hinaus, dass es laufen würde, wenn du zB. vor dem Code von mir schreibst, wenn rechts frei ist, dreh dich nach rechts
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • es hat zwar geklappt, jedoch habe ich mich zu früh gefreut:/ nun geht er zwar nach unten, wennes frei ist, jedoch wenn er auf eine Ecke stösst, gerät es mit dem anderen Code mit der Kollsion in Konflikt... wo sollte ich den Code denn am Besten hinschreiben, damit dies nicht passiert?

      die Direction muss auchumbedingt 0 sein, denn wenn er z.b nach links geht und dort ist der Weg frei geht der °Charakter nicht mehr nach rechts und das ist dann nicht mehr die Logik seines Verhaltens.

      GML-Quellcode

      1. if (direction==0)
      2. {
      3. if (place_empty(x,y+40))
      4. {
      5. direction = 270;
      6. }
      7. if(!place_free(x+lengthdir_x(speed,direction),y+lengthdir_y(speed,direction)))
      8. {
      9. var dir;
      10. dir = direction-90; //rechts
      11. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir)))
      12. {
      13. dir=direction+90; //links
      14. if(!place_free(x+lengthdir_x(speed,dir),y+lengthdir_y(speed,dir)))
      15. {
      16. dir=direction-180; //nach hinten, Sackgassen eingeschlossen
      17. }
      18. }
      19. direction = dir;
      20. }
      21. }
      Alles anzeigen


      meiner Meinung nach ist hier das problem, dass es die direction-90 aufsummiert, da wenn er in eine Ecke kommt in der er nur nach rechts abbiegen kann, geht er zurück, jedoch weiss ich nicht wie ich ihn umstellen sollte....

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Freakkong ()

    • Warum meinst du, dass der mit dem Code ohne direction == 0 nicht nach rechts laufen würde?
      direction-90 ist vom Objekt aus immer rechts
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • da hast du wohl recht xDD mein Gott an das habe ich ja gar nicht gedacht das macht ja einiges einfacher:D Jedoch weiss ich jetzt nicht, wie ich das mit dem anderen Code machen soll:/ er funktioniert zwar, jedoch muss ich ja in jede Richtung etweder inx oder y testen(-+40 pixel) und er gerät dem anderen Code immer noch dazwischen:/