Gegner soll bestimmt feuern.

  • Gegner soll bestimmt feuern.

    Also ich hab folgendes Problem, ich hab einen Gegner - und einen Spielerturm. Wenn mann mit die linke maustaste drückt, wird ein Pfeil erstellt. Mir dem folgenden code.
    Code für's erstellen des Pfeiles und seinen restlichen Code:
    Spoiler anzeigen

    obj_Pfeil
    [Creat-event]

    GML-Quellcode

    1. gravity=0.5
    2. gravity_direction=270

    [step-event]

    GML-Quellcode

    1. image_angle=direction

    obj_player
    [creat-event]

    GML-Quellcode

    1. kraft=0
    2. stop=0

    [step-event]

    GML-Quellcode

    1. if (stop=1)&&(kraft>0)
    2. {kraft-=1}
    3. if (kraft=0)
    4. {stop=0}

    [global-left-button]

    GML-Quellcode

    1. if (kraft<20)&&(stop=0)
    2. {kraft+=1}
    3. else
    4. {exit;}

    [global-left-button-released]

    GML-Quellcode

    1. stop=1
    2. c=instance_create(x+0,y+0,obj_8_pfeil)
    3. c.direction=point_direction(x,y,mouse_x,mouse_y)
    4. c.speed=kraft


    Es funktioniert genau wie ich es will. Je länger mann drückt, desto weiter fliegt er. Jetzt aber zur eigentlichen Fragen, wie schaffe ich es, dass sich mein Gegner, also der Computer, ausrechnet, wie stark, und in welche richtung er schießen muss, damit er mich drift? Ich hoffe ich hab mich verständlich ausgedrückt und ihr wisst was ich meine.

    Lg Afroman
  • Bitte mal testen:

    GML-Quellcode

    1. var n, hspd, vspd;
    2. n = point_distance(x1,0,x2,0)/4;
    3. hspd = n/(x2-x1);
    4. vspd = (y2-y1)/n-gravity*n;
    5. direction = point_direction(0,0,hspd,vspd);
    6. speed = point_distance(0,0,hspd,vspd);

    Hab ich grad total bei den Haaren herbeigezogen... Erklärungen dazu nur, wenns funktioniert. ^^
  • Ins Feuer-Event des Computers (nimm einfach ein Alarm Event das sich selbst neu startet):

    GML-Quellcode

    1. var c, n, hspd, vspd;
    2. c = instance_create(x,y,obj_8_pfeil);
    3. n = (x-obj_player.x)/4;
    4. hspd = n/(obj_player.x-x);
    5. vspd = (obj_playery-y)/n-c.gravity*n;
    6. c.direction = point_direction(0,0,hspd,vspd);
    7. c.speed = point_distance(0,0,hspd,vspd);


    edit: Wenns funzt erkläre ich es auch, ich kanns grad nur nciht testen...
  • Irgendwie funzt es nicht...
    Sobald er das Object created fliegt es in die höhe und verschwindet...
    Hier einmal die info von obj_turm:
    Spoiler anzeigen
    Information about object: obj_8_gegner_turm1

    Sprite: spr_8_gegner_turm1
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent: <no parent>
    Mask: <same as sprite>

    Create Event:
    execute code:

    live=5
    ok=true
    bauen=60

    Destroy Event:
    execute code:

    global.geld+=100
    global.nextlevel+=1
    room_goto(room_lvl_1_3)

    Step Event:
    execute code:

    if (bauen=0)
    {instance_create(x+0,y+0,obj_8_gegner_spieler1); bauen=200; exit;}
    else
    {bauen-=2}
    if (live=0)
    {instance_destroy()}
    execute code:

    if (bauen=0)
    {
    var c, n, hspd, vspd;
    c = instance_create(x,y,obj_8_pfeil);
    n = (x-obj_8_player.x)/4;
    hspd = n/(obj_8_player.x-x);
    vspd = (obj_8_player.y-y)/n-c.gravity*n;
    c.direction = point_direction(0,0,hspd,vspd);
    c.speed = point_distance(0,0,hspd,vspd);
    }

    Collision Event with object obj_8_pfeil:
    execute code:

    with other instance_destroy()
    live-=1

    Draw Event:
    execute code:

    draw_set_alpha(1)
    draw_sprite(spr_8_gegner_turm1,image_number,x,y)
    draw_healthbar(self.x-16,self.y-25,self.x+20,self.y-30,live*20,c_white,c_red,c_green,0,false,true)

  • Es wäre nicht schlecht wenn du eine einfache gmk Datei vorbereiten würdest - ich hätte Spaß daran mich mit diesem Problem auseinanderzusetzen, allerdings fehlt mir die Zeit und Lust, ebenso wie vielen anderen vermutlich auch, sich selbst eine gmk aus Codefetzen zusammenzusuchen.

    Eine Sache aber noch zum eigentlichen Thema:
    Du hast 2 Parameter, die die Flugbahn der Kugel beeinflussen und die durch den Spieler/Computer bestimmtbar sind (speed und direction). Es wird in vielen Fällen mehr als eine Möglichkeit geben - vor allem, wenn der Computer im Gegensatz zum Spieler auch noch Kommaangaben sich zu Nutze machen kann.

    Wie auch immer:
    Das Ergebnis wäre ein Gegner der einmal schießt und gewonnen hat. Überlege daher, wie dein Computer sich verhalten soll - entsprechend unterschiedlich kann sich die Lösung gestalten.
  • Ok ich werde einmal die Game maker datei anhängen. Sie ist ein bisschen gekürzt. Es handelt sich um einen Tower shooter, also wo beide Objekte fest sind nicht beweglich.

    EDIT: So hochgeladen. :thumbsup:
    Dateien
    • Test1.zip

      (2,48 kB, 83 mal heruntergeladen, zuletzt: )

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

  • (n*n+n)/2 sei Dank!

    Wenn sich die Türme auf gleicher Höhe befinden:

    GML-Quellcode

    1. if (schuss=0)
    2. {
    3. var c,hspd,vspd,n;
    4. c = instance_create(x,y,obj_kugel);
    5. for (i=20;i>0;i-=1)
    6. {
    7. hspd = sign(obj_player.x-x)*i;
    8. n = (obj_player.x-x)/hspd;
    9. //vspd = -((c.gravity)*(n*n+n)/2)/n;
    10. vspd = -(c.gravity)*(n/2+0.5);
    11. c.direction = point_direction(0,0,hspd,vspd);
    12. c.speed = point_distance(0,0,hspd,vspd);
    13. if c.speed > 20 then c.speed = 0 else break;
    14. }
    15. if c.speed = 0 then with(c)instance_destroy();
    16. schuss=60;
    17. }
    18. else
    19. {schuss-=1}
    Alles anzeigen

    Wenn sie sonstwo stehen:

    GML-Quellcode

    1. if (schuss=0)
    2. {
    3. var c,hspd,vspd,n;
    4. c = instance_create(x,y,obj_kugel);
    5. for (i=20;i>0;i-=1)
    6. {
    7. hspd = sign(obj_player.x-x)*i;
    8. n = (obj_player.x-x)/hspd;
    9. vspd = (obj_player.y-y)/n-c.gravity*(n/2+0.5);
    10. c.direction = point_direction(0,0,hspd,vspd);
    11. c.speed = point_distance(0,0,hspd,vspd);
    12. if c.speed > 20 then c.speed = 0 else {room_caption=string(c.speed)+" "+string(c.direction);break;}
    13. }
    14. if c.speed = 0 then with(c)instance_destroy(); // falls es gar nicht ging, zerstöre die Instanz direkt wieder
    15. schuss=60;
    16. }
    17. else
    18. {schuss-=1}
    Alles anzeigen

    Um das wirklich genießen zu können, sollte man den Playerturm in jedem Step auf die Position der Maus setzen. Wenn man das ganze jetzt noch optimieren will, nimmt man anstelle von player x und y in diesem Script die Ecke vom Spielerturm, die dem Gegner am nächsten liegt. Derzeit feuert der Turm nicht, wenn er die Mitte nicht treffen kann, obwohl eine Ecke noch in Reichweite ist.

    Edit:

    GML-Quellcode

    1. for (i=1;i<21;i+=1)

    bewirkt übrigens, dass der Computer im hohen Bogen schießt statt im flachen.

    Edit2:
    Ich habe im zweiten Script die vspd-Zeile noch etwas gekürzt. und übrigens: Der Turm wird nicht schießen, wenn die x Position identisch ist. Das fix ich jetzt aber nicht. ^^
  • Achja, der ganze Trick besteht darin, einfach einen hspeed festzulegen (geschieht durch for) und dann die Höhendifferenz durch Gravitation vorauszuberechnen.

    Im ersten Step wäre das ja 0.5, im zweiten kommen zu den 0.5 nochmal 0.5 dazu (also haben wir dann 1.5 Pixel schon zurückgelegt). um 1+2+3+4+5+6 etc zu berechnen gibt es die tolle Formel (x^2+x)/2.

    Alles restliche ist Teilen der Distanz durch die jeweilige Geschwindigkeit. n ist dann also die Anzahl der Steps, die der Pfeil braucht um sein Ziel zu erreichen.
  • Benutzer online 1

    1 Besucher