"Jump to Position" mit Speed vereinen

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

  • "Jump to Position" mit Speed vereinen

    Hallo,

    ich erstelle gerade ein Ping Pong - ähnliches Game, jetzt versuche ich gerade dem Computergegner ein bisschen KI einzutanken ;)

    Nun möchte ich es gerne so, dass der PC immer auf gleicher Höhe mit dem Ball sein soll (Jump to Position), aber soll sich nur so schnell mit dem Speed '6' auf die Höhe des Balls bewegen...

    Wie kann ich also Jump to Position und Speed vereinen oder gibt es eine andere Möglichkeit?

    Towards to a point oder so hat leider auch nicht funktioniert :(

    Hedgehog

    PS: Ich habe die Suche schon benutzt, aber nix gefunden...
  • entweder du arbeits nur mit speed oder nur mit jump to a position...
    also entweder:

    GML-Quellcode

    1. if y>ball.y
    2. y-=6
    3. else if y<ball.y
    4. y+=6

    oder mit speed:

    GML-Quellcode

    1. if y>ball.y
    2. vspeed=-6
    3. else if y<ball.y
    4. vspeed=6
  • Was hast du denn bisher genau versucht?
    Eine einfache Abfrage sollte genügen.

    In etwa so:

    GML-Quellcode

    1. if (abs(obj_gegner.y-obj_ball.y)<6) // Wenn die Y-Distanz der beiden Objekte weniger als 6 (also der Sped) ist.
    2. obj_gegner.y = obj_ball.y; // bewegt sich der Gegner exakt auf die Höhe des Balls.
    3. else
    4. {
    5. if (obj_gegner.y>obj_ball.y) // Wenn der Ball (mind. 6 Pixel) höher ist, als das Paddle,
    6. obj_gegner.y -= 6; //schließt dieses um 6 Pixel nach oben auf.
    7. else
    8. obj_gegner.y += 6; // Andernfalls, schließt dieses um 6 Pixel nach unten auf.
    9. }

    Dieser Code setzt jetzt voraus, dass das Gegnerische Paddle rechts oder Links im Fenster ist.
    Befindet es sich oben, bzw unten, einfach immer y durch x ersetzen.

    Edit: Mist, Trunx war schneller, aber sein Paddle wird Hampeln, wenn die Y-Distanz kleiner ist, als die Geschwindigkeit.
    Hier werden sie geholfen:
    [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
    [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


    "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
    "Selber denken regt das Gehirn an."
    - Niffel f.k.a. Kilik
  • Vielen Dank, Kilik.

    Dein Skript hat geholfen :)

    Jedoch habe ich noch 2 Fragen:

    1) Was sollte ich in das Event "Collison with Wall" machen, einfach speed=0?

    2) Wie könnte ich verschiedene Schwierigkeitsgrade einbauen? (darum das mit dem vereinen)

    Vielen Dank im Voraus,

    Sonic
  • GML-Quellcode

    1. move_contact_solid(point_direction(xprevious,yprevious,x,y),6);

    Vorausgesetzt dein Wandobjekt ist solid.
    Wenn nicht, das "solid" durch "all" ersetzen, also:

    GML-Quellcode

    1. move_contact_all(point_direction(xprevious,yprevious,x,y),6);


    Ich meine mich aber entsinnen zu können, dass wir ein ähnliches Problem hier schon einmal behandelt haben.
    Bin jetzt nur zu faul zum Suchen.
    Hier werden sie geholfen:
    [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
    [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


    "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
    "Selber denken regt das Gehirn an."
    - Niffel f.k.a. Kilik
  • Original von Kilik

    GML-Quellcode

    1. move_collision_solid(point_direction(xprevious,yprevious,x,y),6,true);

    Vorausgesetzt dein Wandobjekt ist solid.
    Wenn nicht, das "solid" durch "all" ersetzen, also:

    GML-Quellcode

    1. move_collision_all(point_direction(xprevious,yprevious,x,y),6,true);


    Sorry, aber:

    1) Wo muss ich diesen Codeschnippsel einfügen?

    2) Bekomme folgende Fehlermeldung:
    COMPILATION ERROR in code action
    Error in code at line 1:
    move_collision_solid(point_direction(xprevious,yprevious,x,y),6,true);

    at position 1: Unknown function or script: move_collision_solid

    Sonic
  • Ah, sry... ich war wohl etwas in Gedanken.
    Die Funktion heist natürlich "move_contact_solid" bzw "move_contact_all". Und das True am Ende is auch nich ganz richtig (sty hatte da was verwechselt).

    Und das ganze muss ins Collision-Event mit dem Wandobjekt.
    Hier werden sie geholfen:
    [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
    [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


    "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
    "Selber denken regt das Gehirn an."
    - Niffel f.k.a. Kilik
  • Hallo,

    ich hab's nach ein paar Spielereien endlich geschafft.

    Ich habe nämlich im Sprite festgellegt, dass der "Fixierpunt" (wo das Spriten den "Origin"-Punkt hat) genau im Center des Schlägers ist, somit bewegt sich die Mitte des Schlägers immer genau auf Höhe des Balls und nicht die obere Kante (was auch besser aussieht).

    Statt dem Code habe ich jetzt auch "Move towards to a point" genommen, das super für meine Zwecke ist (x, y, speed, stop by collision with solid objects).

    Trotzdem vielen Dank und einen schönen Tag noch!

    Sonic