collision_line - Frage an die Experten hier

  • GM 8
  • collision_line - Frage an die Experten hier

    Hallo, ich hab da ein Problem, an dem ich mir nun schon 2 Wochen die Zähne ausbeisse, jedoch ist außer einem Zahnarztbesuch noch nichts bei rausgekommen... :(
    In meinem Spiel (so eine Art 3-Gewinnt-Spiel) sollen alle Spielsteine nach links rücken, wenn eine ganze Spalte frei geworden ist. Das habe ich mit "collision-line" gemacht und das tun sie auch - jedoch nicht immer. Immer wieder kommt es vor, dass sich die "Hauptsteine" (obj_diamond_parent) über die Würfel oder Räder dabei schieben.
    Mein Code:

    GML-Quellcode

    1. var i;
    2. for(i=global.breite; i>=60; i-=40)
    3. {
    4. if collision_line(i,0,i,global.hoehe,obj_diamond_parent,0,0) == noone
    5. {
    6. with(all){
    7. if ((object_get_parent(object_index)=obj_diamond_parent) || (object_get_parent(object_index)=obj_wuerfel_parent) || (object_index=obj_rad)) && !place_meeting(x-40,y,obj_wall_parent)
    8. if (x > i && x <= global.breite) x -= 40;
    9. }
    10. }
    11. }
    Alles anzeigen


    Ich finde einfach den Fehler nicht. Vielleicht kann sich ja einer der Experten hier mal den Code anschauen. Irgendwas muss daran nicht stimmen, denn immer, wenn die Objekte aufrücken, klappt das in ca. 95% der Fälle - und der Rest schiebt sich irgendwie aufeinander. Das darf aber nicht sein. Ach ja: alle Objekte sind vom Typ "solid"!

    Kann mir jemand bitte einen Tipp geben, wo ich noch nach dem Fehler suchen kann? Vielleicht liegt er ja auch ganz woanders, ich denke nur, hier, weil es immer beim Aufrücken passiert.
    Danke schon mal im voraus,
    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Also ich würd generell mal versuchen, diese Zeile

    GML-Quellcode

    1. if collision_line(i,0,i,global.hoehe,obj_diamond_parent,0,0) == noone

    gegen

    GML-Quellcode

    1. if !collision_line(i,0,i,global.hoehe,obj_diamond_parent,0,0)

    auszutauschen. Grund: noone ist für den GM nur ein Keywort, hinter dem ein negativer Wert (-4) steckt. Ich nehme an, dass der GM für collision_line nicht immer .4 zurück gibt, wenn es keinen Treffer gibt, also deckts du mit der ! mehr Fälle ab, nämlich alle Fälle, in denen die Funktion einen Wert <= 0 zurückgibt.

    © 2008 by Teamgrill Productions
  • Ah ja, danke Dir, MasterXY, für diesen Tipp, werde ich gleich mal ausprobieren! :)
    Generell erwiesen ja Deine Tipps immer als besondere Volltreffer, vielleicht ist es auch diesmal so... :P
    Gruß Archie

    Edit, etwas später:
    Ähm: hast Du vielleicht noch einen Tipp für mich? Die Objekte rutschen teilweise immer noch übereinander... :(
    Gruß Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Dann kann es eigentlich nur mehr sein, dass die Collisionsline evtl nicht trifft (Sprite-Masks), oder du vergessen hast einige Blocks das Parent zuzuweisen. Sonst fällt mir eigentlich nichts ein. Tritt es bei bestimmten auf oder willkürlich?

    © 2008 by Teamgrill Productions
  • MasterXY schrieb:

    Dann kann es eigentlich nur mehr sein, dass die Collisionsline evtl nicht trifft (Sprite-Masks), oder du vergessen hast einige Blocks das Parent zuzuweisen. Sonst fällt mir eigentlich nichts ein. Tritt es bei bestimmten auf oder willkürlich?


    Also beides habe ich bereits mehrfach überprüft: die, die Parents haben, sind auch alle zugewiesen und die Masken habe ich allesamt auf volle Spritegröße von 40x40 Pixeln gesetzt, so dass auch kein Sprite durchfllutschen kann.
    Trotzdem tritt es - ganz willkürlich - auf, dass einige wenige Objekte nicht mitgenommen werden, sondern stehenbleiben und von den Hauptspielsteinen überdeckt werden. Sagen wir, von ca. 10 im Spiel befindlichen Objekte "Würfel" oder "Rad" laufen ca. 9 mit und einer bleibt stehen...:-(
    Nicht immer und nicht in jedem Level, aber von 3 Leveln bestimmt in 2 Fällen.

    Hat vielleicht noch jemand einen Tipp, woran es liegen könnte? Es MUSS ja nicht unbedingt mit der Anweisung zusammenhängen, aber ich fand es naheliegend. Vielleicht steckt aber auch ein anderes kleines "Geheimnis" dahinter, von dem ich nichts weiss...
    Trotzdem erst mal Danke an MasterXY,
    Archie

    ____________________________________________________________________________________

    Ich bin's noch mal. Habe soeben festgestellt, dass ich wesentlich bessere Ergebnisse erziele, wenn ich die if-Abfrage schon dahin ändere, dass alles abgefragt wird:

    GML-Quellcode

    1. if !collision_line(i,0,i,global.hoehe,obj_diamond_parent,0,0) && !collision_line(i,0,i,global.hoehe,obj_wuerfel_parent,0,0) && !collision_line(i,0,i,global.hoehe,obj_rad,0,0)

    Allerdings fragt sich, da es im Step-Event liegt, wie lange die Abfrage wohl dauern wird, wenn noch 10 weitere Objekte hinzukommen...
    Kann mir irgendwer erklären, wieso das jetzt besser ist? Verstehe das nicht ganz, ehrlich gesagt. Möglich auch, dass das nur zufällig jetzt so ist, ich werde das im Auge behalten.
    Gruß Archie

    Noch etwas später:
    Habe nach weiteren intensiven Nächten den Fehler jetzt gefunden - ganz woanders als vermutet. Also bleibt es dabei, wie MasterXY schon sagte, die Anweisung oben ist so korrekt.
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Archie ()