Probleme mit repeat(1) in der Pfaderstellung

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

  • Probleme mit repeat(1) in der Pfaderstellung

    Hallo,

    ich übe mich seit einigen Tagen an Pfaden die das Objekt langlaufen soll und habe jetzt einen Code hinbekommen der am wenigsten Fehler macht. Allerdings zerbreche ich mir den Kopf über den Abschnitt der die alte Kollisionsfläche entfernt und die neue wieder hinzufügt auf dem das Objekt nun steht.

    ich möchte das die Fläche nur einmal entfernt oder hinzugefügt wird damit keine Fehler auftreten wenn nun ein anderes Objekt die alte Kollisionsfläche betritt (x_alt und y_alt). Dafür wollte ich repeat(1) verwenden das ich schon ein paar mal erfolgreich eingesetzt habe, allerdings scheint dies in diesem Codeabschnitt nicht zu funktionieren. Der Code in if und in else wird öfter als 1 mal ausgeführt.

    Jetzt ist meine Frage wo ich einen Fehler gemacht habe das es öfter als 1 mal ausgeführt wird.


    Dies ist der Abschnitt mit repeat(1) den ich meine, steht im Step Event des Spielers:

    GML-Quellcode

    1. if path_position > 0.95 // Pfad hat Ziel erreicht, etwas früher als 1 da es sonst ruckelt und erstellt neuen Pfadabschnitt
    2. {
    3. repeat(1)
    4. mp_grid_clear_cell(global.grid, floor(x_alt / global.netz), floor(y_alt / global.netz)) // alte Kollisionsfläche entfernen
    5. test += 1
    6. pfad_erstellen = true // nächsten Pfadabschnitt berechnen
    7. }
    8. else
    9. {
    10. repeat(1)
    11. image_angle = direction
    12. mp_grid_add_cell(global.grid, floor(x / global.netz), floor(y / global.netz)) // aktuelle Kollisionsfläche hinzufügen
    13. }
    Alles anzeigen


    Falls benötigt hier der Rest vom Code der auch im Step Event des Spielers steht, direkt über dem oberen Codeabschnitt und den Pfad erstellt:

    GML-Quellcode

    1. if pfad_erstellen = true and maustaste_aktiv = false and distance_to_point(pfad_ziel_x , pfad_ziel_y) > 0.5
    2. {
    3. x = floor( x / global.netz) * global.netz + ( global.netz / 2 ) // Objekt auf Kollisionsmittelpunkt setzen x
    4. y = floor( y / global.netz) * global.netz + ( global.netz / 2 ) // Objekt auf Kollisionsmittelpunkt setzen y
    5. mp_grid_clear_cell(global.grid, floor(x / global.netz), floor(y / global.netz)) // Kollisionsfläche entfernen um Pfad zu berechnen
    6. mp_grid_path(global.grid,pfad, x, y, pfad_ziel_x , pfad_ziel_y , true) // vollständigen Pfad erstellen
    7. mp_grid_path(global.grid,pfad_abschnitt, x, y, path_get_point_x(pfad, 1) , path_get_point_y(pfad, 1) , true) // Pfadabschnitt bis zum 2. Punkt des Hauptpfades erstellen
    8. mp_grid_add_cell(global.grid, floor(x / global.netz), floor(y / global.netz)) // Kollisionsfläche nach berechnung wieder hinzufügen
    9. path_start(pfad_abschnitt, 3, 0, 0) // Pfad starten
    10. x_alt = x
    11. y_alt = y
    12. pfad_erstellen = false
    13. }
    Alles anzeigen


    Die Aufgabe den Pfad zu erstellen kommt von "Global Right Pressed" Event des Objektes:

    GML-Quellcode

    1. maustaste_aktiv = true
    2. pfad_ziel_x = floor( mouse_x / global.netz) * global.netz + ( global.netz / 2 )
    3. pfad_ziel_y = floor( mouse_y / global.netz) * global.netz + ( global.netz / 2 )
    4. if path_position > 0.95
    5. {
    6. pfad_erstellen = true
    7. }
    8. test = 0


    Vielleicht findet jemand den Fehler und kann mir helfen, ich übe schon seit über 4 Tagen nur an Pfaden und wäre echt glücklich wenn ich diesen endlich zum funktionieren bringe. :)

    Vielen vielen Dank für Hilfe.
  • Hi, so ganz durchblick ich Deine Art, Klammern zu setzen, nicht, aber bei Repeat
    hast Du definitiv keine Klammern, also wird dieser Abschnitt:

    Quellcode

    1. repeat(1)
    2. mp_grid_clear_cell(global.grid, floor(x_alt / global.netz), floor(y_alt / global.netz)) // alte Kollisionsfläche entfernen
    Als ein Block von GM betrachtet und daher, lt. Repeat(1) auch nur einmal ausgeführt,
    aber eben nur diese Zeile. Wenn Du mehr Zeilen einschliessen möchtest, mußt Du das
    über die { } Klammern machen.

    Vielleicht löst das ja bereits Dein Problem.


    Miradur
  • Neu

    Hallo,

    danke für die Antwort, ich habe die Klammern schon an sämtliche Orte gesetzt und getestet aber ändert sich nichts.

    Ich habe mir jetzt einen neuen" Pfad Code" erstellt der meine Ansprüche erfüllt, allerdings hat der das selbe Problem das repeat(1) öfter als 1 mal ausgeführt wird.
    Mir ist dabei aufgefallen das wenn ich repeat(1000) schreibe und danach der Code test +=1 ausgeführt werden soll dieser nicht 1000 mal ausgeführt wird und dann stoppt, sondern er statt test+=1 die ganze zeit test += 1000 rechnet.

    Egal ob ich schreibe:

    repeat(1000) test += 1



    repeat(1000)
    {
    test += 1
    }

    Funktioniert repeat im Step Event nicht?


    Vielen Dank, Hornter :)
  • Neu

    Also, ich habe jetzt einen kleinen Testaufbau gestartet:

    Quellcode

    1. // Mouse Global Left Pressed-Event
    2. repeat (1) {
    3. repvar += 1
    4. }
    Und das Ganze dann im Draw-Event anzeigen lassen und es funktioniert, wie es soll.
    Jedes mal, wenn ich mit der linken Maustaste einen Klick machte, wurde die Variable
    um 1 erhöht.
    Gibt man 60 ein und hat 30 Frames eingestellt, wird immer 60 addiert, was dann aber
    ebenso klar sein dürfte, ist der Umstand, dass wenn Du den Vorgang nicht kontrollierst,
    diese Funktion aus dem Ruder laufen kann.

    Denn ein Step-Event wird nun mal z.B. 60x pro SEKUNDE ausgeführt und wenn Du da
    repeat(1) schreibst, dann wird diese Schleife auch 60x pro Sekunde ausgeführt und
    egal was da drin steht, das wird ebenfalls 60x gemacht.

    Deshalb denke ich, Du mußt Dein Problem anderweitig lösen, eine repeat() Schleife
    scheint sich nicht anzubieten.


    Miradur