Das vier Seiten Problem

  • GM 8
  • Das vier Seiten Problem

    Hallo zusammen!

    Ich habe ein Objekt, mit dem man durch den Raum fliegen kann, also mit hoch, links und rechts. Lässt man die Taste nach oben los, wird das Objekt per Gravitation angezogen. Wenn das Objekt bestimmte andere Objekte berührt, stirbt es, auf anderen Objekten soll es landen bzw. diese berühren können. Ich habe zwei Probleme, will aber erst mal das erste Problem lösen, vielleicht bekomme ich das zweite dann selber hin.

    Das Objekt zum landen ist rechteckig. Wenn ich von oben lande, funktioniert es mit dem Code:

    GML-Quellcode

    1. move_contact_solid(270,0);
    2. vspeed = 0;


    So kann ich dann noch auf dem Objekt herum fahren. Wenn ich das Objekt aber nicht von oben berühre, springt es an eine undefinierte Position. Das soll aber nicht so sein, sondern so:

    Wenn das Objekt von der Seite kommt, soll es "haften", bis die Taste losgelassen wird. Dann greift die Gravitation und das Objekt fällt herunter, bis man die entsprechende Taste drückt. Von Unten soll es ebenso funktionieren. So lange man nach oben drückt, drückt das Objekt dagegen, lässt man los, fällt es herunter.

    Kann mir jemand dabei helfen?

    Der kleine Code oben ist im Kollisions Event

    Lieben Dank!
  • Das ist schon ziemlich gut. Aus speed muss ich vspeed machen, damit ich horizontal hin und her fahren kann, wenn ich oben oder unten andocke.

    Ein kleines Problem: Manchmal berühre ich nicht direkt das Objekt sondern halte einen Pixel vorher schon an. Woran kann das liegen?
  • Da noch keine Antwort, habe ich die Datei mal angehängt. Ist ein früher Prototyp, also bitte nicht lachen. Will erst mal die Steuerung in den Griff bekommen. Mit der Version habe ich folgende Probleme:
    1. Das Viereck geht manchmal noch leicht nach rechts oder links, wenn es auf der grünen Fläche landet.
    2. Die Kollision, besonders von den Seiten, stimmt nicht ganz. Manchmal hält das Viereck schon einige Pixel vorher an. Es ist also noch genug Platz zwischen Viereck und den grünen Steinen.
    3. Wenn das Viereck seitlich am grünen Stein "andockt", soll es dennoch durch die Gravitation nach Unten gezogen werden. Dies ist momentan nicht der Fall.
    Schon mal lieben Dank für die Hilfe!
    Dateien
    • V2.rar

      (10,78 kB, 146 mal heruntergeladen, zuletzt: )
  • Was ich jetzt nicht verstanden habe ist, inwiefern der "Virus" angezogen werden soll.
    Das einzige was mir aufgefallen ist, dass es nur vom grünen angezogen wird, wenn es das bereits berührt, gehört das nicht ins key-relase event (wenn ich's nicht falsch verstanden habe)?
  • Den Code habe ich jetzt nicht hier (auf der Arbeit) aber mal grob erklärt. Der Virus soll nur von der Gravitation nach Unten gezogen werden, nicht von den grünen Steinen. Der Virus kann aber an alle Seiten "andocken", aber wenn er links oder rechts ist, soll er nach unten rutschen (Gravitation) auch wenn der Spieler die entsprechende seitliche Taste drückt. Wenn er oben landet, soll man, wie es ja schon ist, nach links und rechts rutschen können. Wenn man von unten kommt und die Taste nach oben gedrückt hält, bleibt man "kleben" und wenn man die seitlichen Tasten drückt, kann man hin und her rutschen. Letzteres funktioniert auch schon.
  • Ich hab mal die vom Game Maker genutzten Bewegungsvariablen rausgekickt und es so eingerichtet, dass das Fahrzeug (auch ohne extra Kollisions-Events) an obj_wand_gruen Objekten (oder welchen, die dieses Objekt als parent haben) entlanggleiten kann.

    Weil ich etwas rumprobieren musste, sieht der Code sehr hässlich aus.
    Ich habe im Prinzip überall wo hspeed oder vspeed steht, ein hhspeed und vvspeed draus gemacht und auch sämtliche Gravity-Sachen rausgeschmissen und durch ein vvspeed+=0.5 im Step Event ersetzt.

    Mit diesen Variablen erledige ich die Bewegungsarbeit selbst im End Step Event:

    GML-Quellcode

    1. // ich überprüfe (in 0.1 Pixelschritten) ob die nächste Position frei ist
    2. for (i=0;i<=abs(hhspeed);i+=0.1) // damit ich nicht für positive und negative Werte extra arbeiten muss, nehm ich den absoluten Wert ohne Vorzeichen
    3. if (!place_meeting(x+i*sign(hhspeed),y,obj_wand_gruen)) // hier bastel ich das Vorzeichen wieder rein
    4. hhhspeed=i; // ganz hässliche temporäre Variable
    5. for (i=0;i<=abs(vvspeed);i+=0.1) // das selbe für y
    6. if (!place_meeting(x,y+i*sign(vvspeed),obj_wand_gruen))
    7. vvvspeed=i;
    8. hhspeed=sign(hhspeed)*hhhspeed; // muss ich wieder auf die Variablen umrechnen, da sonst nicht abgebremst wird.
    9. vvspeed=sign(vvspeed)*vvvspeed; // bzw. sich die Tastaturabfragen auch immer auf eine bereits vorhandene Bewegung beziehen
    10. x+=hhspeed; // die eigentliche Bewegung!
    11. y+=vvspeed;
    Alles anzeigen
    Wahrscheinlich geht es auch mit den bestehenden Bewegungsvariablen und viel einfacher und effizienter, aber ich bin jetzt nur über diesen Umweg zum Ziel gekommen.
    Dateien
    Einige meiner Spiele:
  • Wenn man es genau nimmt, muss man wahrscheinlich noch etwas umstellen:

    GML-Quellcode

    1. // ich überprüfe (in 0.1 Pixelschritten) ob die nächste Position frei ist
    2. for (i=0;i<=abs(hhspeed);i+=0.1) // damit ich nicht für positive und negative Werte extra arbeiten muss, nehm ich den absoluten Wert ohne Vorzeichen
    3. if (!place_meeting(x+i*sign(hhspeed),y,obj_wand_gruen)) // hier bastel ich das Vorzeichen wieder rein
    4. hhhspeed=i; // ganz hässliche temporäre Variable
    5. hhspeed=sign(hhspeed)*hhhspeed; // muss ich wieder auf die Variablen umrechnen, da sonst nicht abgebremst wird.
    6. x+=hhspeed; // die eigentliche Bewegung!
    7. for (i=0;i<=abs(vvspeed);i+=0.1) // das selbe für y
    8. if (!place_meeting(x,y+i*sign(vvspeed),obj_wand_gruen))
    9. vvvspeed=i;
    10. vvspeed=sign(vvspeed)*vvvspeed;
    11. y+=vvspeed;
    Alles anzeigen

    Ansonsten kann er sich an Ecken in einen Gegenstand rein bewegen.
    Einige meiner Spiele:
  • Ein Problem habe ich noch. Ich möchte zwei Plattformen einbauen, eine fliegt horizontal, die andere vertikal. Der Würfel (Virus) soll sich auf beide drauf setzen können um transportiert zu werden, wenn der Virus auf die Seite kommt (beim horizontalen) oder unten (vertikal), in welche die Plattform fliegt, soll er in die Richtung geschoben werden.

    Ich habe es mit den mir bekannten, üblichen Mitteln versucht, aber es geht irgendwie nicht. Entweder kann ich weiterhin durch die Objekte fliegen, oder das Objekt bleibt stehen und der Würfel nimmt die Bewegung des Objektes an. Was ich auch mache, entweder es funktioniert nicht oder es kommt was verrücktes dabei heraus.

    Die neue Datei habe ich in den Anhang, die zahlreichen Codeversuche habe ich aber mal gelöscht. Wäre für Hilfe sehr dankbar.
    Dateien
    • V2_b.rar

      (11,62 kB, 143 mal heruntergeladen, zuletzt: )
  • Danke für deine Mühen. Beim horizontalen scheint es, bis auf einen kleinen Fehler, ganz gut zu funktionieren. Der Fehler ist, dass beim seitlichen Anflug der Virus erneut, zumindest manchmal, ein paar Pixel vor dem Objekt stehen bleibt.

    Nun habe ich versucht den Code auf das vertikale Objekt zu übertragen, scheitere aber (mal wieder) sang und klanglos. Mein Hauptproblem ist, dass ich trotz Kommentare einfach nicht nachvollziehen kann, was dein Code da genau macht. ?(
  • Beim vertikalen Block musst du ebenfalls nur solid ausstellen (bewegliche Objekte sollten nie solid sein!) und als parent den grünen Block angeben. Außerdem braucht es halt noch ein Collision-Event, bei dem diesmal eben noch die y-Bewegung angepasst wird.

    Ich weiß, der Code ist total hässlich, wenn du eine bessere Idee hast, fang nochma ganz von vorne an.
    Dateien
    Einige meiner Spiele:
  • Vielen Dank!

    Ich sagte ja auch nicht, dein Code sei hässlich (so etwas würde ich nie sagen) sondern, dass ich ihn nicht verstehe. Funktioniert aber super. Ich habe noch mal nachgesehen, warum meine Version nicht funktioniert hat, schließlich meinte ich es genau so versucht zu haben, wie du beschrieben hast. Dumm, dass ich dabei übersehen habe ein x und y umzuschreiben.

    Noch mal Danke für die Hilfe!
  • Benutzer online 1

    1 Besucher