Geschütz_Ziel

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

  • Geschütz_Ziel

    Hab ein problem und leider nicht die zeit es selber zu lösen den ich arbeite gerade an einem sehr großen projekt
    also zum problem

    ich habe ein geschütz das sich nur betsimmt drehen kann (z.b. von 0 - 90 grad).
    nun soll das geschütz inerhalb einer bestimmten distanz einen gegner angreiffen (Wenn dieser zwischen 0 und 90 grad ist),wie mache ich das.

    ps: alle gegner werden in einem array gespeicher also könnte mann alle gegner durchlaufen bis einer gefunden wird. doch wenn ich 20 geschütz und 20 gegner hätte wären das 400 durchläufe pro step und ich galube das der pc dann recht schnell den geist aufgibt.
    PI 0%(IN PROGRESS)
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]

    Engine : 0.0 %
    KI : 0.0 %
    Grafik : 0.0%
    Sounds: 0.0 %
    Multiplayer: 0.0%

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

  • Hy,
    kann bitte jemand fuer mich die Loesung hinschreiben... ich hab zwar die Loesung, aber weil ich ein zu arrogantes Arschloch bin, lasse ich lieber euch meine Loesung schreiben, da ich zu wenig Zeit hab... sucht dafuer einfach jemanden auf, der Gedanken lesen kann und lasst ihn den Gedanken von mir lesen... macht euch keine andere Muehen selbst eine Loesung zu finden... weil ich ein Profi bin und ihr nur noobs, werdet ihr im Leben auf keine bessere Loesung kommen, also waer es am effizientesten, wenn ihr lieber all eure Ersparnisse fuer eine Suche nach einem Gedankenleser opferen wuerdet... ihr wollt doch fuer bigmeks hammergeiles Game (ein Profi macht ja nur solche) nur die beste Loesung, oder?
    Zwei kleine Fabeln zum Thema Copyright und Patente:
    Das Schwein und die Kiste und Die Krähe die fliegen konnte

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

  • wie ich sehe hast du verstanden was ich will
    achja wenn wir schon dabei sind brauche ich auch noch deine Kontonummer

    übrigens danke für deine lösung hat mir wirklich weitergeholfen ich wünschte es gebe mehr menschen wie dich

    edit: ach übrigens ich will zwar dein weltbild nicht zerstören aber ich muss es dir sagen:
    ach so super mega geile profis wie ich wissen nicht alles (an alle normalen menschen das ist ironie)
    PI 0%(IN PROGRESS)
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]

    Engine : 0.0 %
    KI : 0.0 %
    Grafik : 0.0%
    Sounds: 0.0 %
    Multiplayer: 0.0%

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

  • @Bigmek: Schon mal was von der Hilfe oder der SuFu gehört?
    Da du ja ein Profi bist wird dir wohl der Lösungsansatz genügen.
    ich will schließlich nicht deine Zeit mit unnützen Details verschwenden.
    1. distance_to_object
    2. Das kann sich auf das Objekt direkt beziehen, dazu brauchst du kein Array.
    3. If-Abfragen wollten dich hier weiterbringen.
    4. Das ist keine komplexe Technikfrage, daher: *schieb*

    @Ledif: Auch wenn dein Post inhaltlich richtig ist, möchte ich dich doch auf
    den -Button aufmerksam machen. Das war nämlich leider Spam.
    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
  • wass ist eigenlich hier loss

    1. Ich habe KEINE LÖSUNG für das Problem
    2. Ich habe momentan keine zeit eine Lösung zu suchen (weil ich momentan keine zeit habe)
    es gibt auch menschen die Arbeiten müssen.

    3. Dachte mir vieleicht gibt es einen netten menschen der vieleicht ein lösung weis und sie mir scheiben möchte.


    um wieder zum eigentlichen thema zurückzukommen
    2. Das kann sich auf das Objekt direkt beziehen, dazu brauchst du kein Array.
    Das array habe ich sowieso schon, außerdem wie soll ich ohne array das nahegelegenste ziel finden das im bereich 0 - 90 inerhalb einer bestimmten distanc liegt;

    4. Das ist keine komplexe Technikfrage, daher: *schieb*
    Würde eigentlich schon sagen das das etawas komplexes ist aber wie du meinst

    INFO: Wollte das spiel eigenlich in c++ schreiben habe mich aber dann doch für den gamemaker entschieden weil ich dachte hier gibt es ein Forum mit hilfsbereiten mitspieleentwicklern
    ich muss ehrlich sagen das ich das besser in erinerung hatte.

    ps: was soll ich mit diesm melden button
    PI 0%(IN PROGRESS)
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]

    Engine : 0.0 %
    KI : 0.0 %
    Grafik : 0.0%
    Sounds: 0.0 %
    Multiplayer: 0.0%

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

  • Ich werde man nicht auf der 'Profi' sache herumreiten.
    Aber da du zur Zeit keine Zeit hast um eine Lösung zu suchen (weil du keine Zeit hast), werde ich dir mal helfen.

    Du brauchst keinen array.
    Das macht schon die with() operation für dich.
    Als code sähe das dann so aus.

    GML-Quellcode

    1. gegnerid=-100;
    2. with(gegner)
    3. {
    4. var dir;
    5. dir=point_direction(other.x,other.y,x,y);
    6. if(dir>0&&dir<90&&point_distance(x,y,other.x,other.y)<=maximale_distanz)
    7. {
    8. if(other.gegnerid==-100)
    9. other.gegnerid=id;
    10. else
    11. {
    12. if(point_distance(other.x,other.y,x,y)<point_distance(other.x,other.y,other.gegnerid.x,other.gegnerid.y))
    13. {
    14. other.gegnerid=id;
    15. }
    16. }
    17. }
    18. }
    19. if(instance_exists(gegnerid))
    20. {
    21. turmrichtung=point_direction(x,y,gegnerid.x,gegnerid.y);
    22. //schiessen
    23. }
    Alles anzeigen


    Hab's noch nicht ausprobiert aber das Prinzip solltest du ja begreifen.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Verwurster ()

  • Ich frag mich wie du das mit nem Array machen willst...
    ich würde es so machen:

    GML-Quellcode

    1. gegner=instance_nearest(x,y,obj_gegner)
    2. if distance_to_object(gegner)<=maxdistanz && point_direction(x,y,gegner.x,gegner.y)>=0 && point_direction(x,y,gegner.x,gegner.y)<=90
    3. //schießen
  • Hilfsbereit sicherlich, wenn du ernsthafte Schwierigkeiten hast. Aber nicht so hilfsbereit, dass man dir Arbeit abnimmt, für die du schlicht und ergreifend keine Zeit hast - wir sind schließlich nicht deine Bimbos! (Auch wenn du es nicht glauben magst, aber so ziemlich jeder hier muss entweder auch lernen, arbeiten und/oder sich um sein RL kümmern)
    Wenn 20 Objekte gegen 20 andere Objekte geprüft werden sollen, dann müssen halt 20*20 = 400 Prüfungen vorgenommen werden (probiers mal aus, vieleicht ist die Rechenlast ja doch nicht sooo schlimm wie du befürchtest) - du könntest allerdings die zeitliche Auflösung heruntersetzen und z.B. nur alle 5 Steps prüfen, damit wäre die Rechenlast schon um 80% vermindert.
    Kiliks Hinweis auf den Meldenbutton bezog sich nicht auf dich, sondern auf Ledif.
    www.glowingorb.de
    „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

    (Schachweltmeister Emanuel Lasker)
  • Original von TrunX
    Ich frag mich wie du das mit nem Array machen willst...
    ich würde es so machen:

    GML-Quellcode

    1. gegner=instance_nearest(x,y,obj_gegner)
    2. if distance_to_object(gegner)<=maxdistanz && point_direction(x,y,gegner.x,gegner.y)>=0 && point_direction(x,y,gegner.x,gegner.y)<=90
    3. //schießen


    Das würde nicht funktionieren, wenn der nächste Gegner in einem Winkel von 91 grad zum Turm steht.
    Dann würde der Turm nämlich gar kein ziel haben.
    Nicht vergessen, das Ziel ist es, den nächsten Gegner in einem Winkel von 0-90 Grad zu ermitteln, das ist nicht immer der Allernächste Gegner.
  • Ja danke das kommt schon nahe ran aber mein problem ist was ist wenn der instance_nearest(x,y,obj_gegner)
    nicht zwischen 0 - 90 ist sondern zb 99 grad dann müsste er mit dem nächstgelegenen weiermachen und überprüfen ob der in reichweite ist

    Verwurster: habe garnicht mehr gewusst das es im gamemaker with gibt

    Glowing Orb:
    ich wollte auch nicht das mir irgend jemand arbeit abnimmt sondern nur hilfrei vorschläge wie das zu machen ist

    das mit der rechenleistung werde ich mal testen.
    wenn das funktioniert komm ich mir aber ziemlich blöd vor den dann hätte ich mir die ganzen probleme schenken können
    PI 0%(IN PROGRESS)
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]

    Engine : 0.0 %
    KI : 0.0 %
    Grafik : 0.0%
    Sounds: 0.0 %
    Multiplayer: 0.0%

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

  • damit war nicht dein code gemeint,
    hab so einen kleinen tick ich beantworte immer zuerst die letzte nachricht und arbeite mich dan nach oben durch

    das dein funkioniert glaube ich dir
    aber bei meinem spiel wird es mehrere gegner objekte geben
    obwohl ich mir schon überleft habe ein objekt für alle gegner zu nehmen

    zur info mache einen multiplayer action/strategie mix
    das spiel spielt im weltraum und da können schon mal ein par raumschiffe gleichzeitig ihre runden drehen.
    darum habe ich mir gedacht bevor ich es so mache frage ich mal ob nicht jemand eine bessere idee hat.
    PI 0%(IN PROGRESS)
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]

    Engine : 0.0 %
    KI : 0.0 %
    Grafik : 0.0%
    Sounds: 0.0 %
    Multiplayer: 0.0%
  • Verwursters Idee kommt schon nahe dran, mit einer kleinen Änderung dürfte es funktionieren

    GML-Quellcode

    1. var check, gegner;
    2. do {
    3. gegner = instance_nearest(x,y,obj_gegner);
    4. check = distance_to_object(gegner)<=maxdistanz && point_direction(x,y,gegner.x,gegner.y)>=0 && point_direction(x,y,gegner.x,gegner.y)<=90;
    5. if (check)
    6. // schießen
    7. else
    8. instance_deactivate_object(gegner);
    9. } until (check);
    10. instance_activate_object(obj_gegner);
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bl@ckSp@rk ()

  • Original von bigmek
    aber bei meinem spiel wird es mehrere gegner objekte geben


    Das ist kein Problem.
    mach ein Gegner-parent-objekt, setz das bei all deinen Gegnerobjekten als parent und such dann nach dem Parentobjekt.
    Dann werden alle Gegner gesucht, egal wie viele Versionen du von denen hast.

    @Bl@ckSp@rk: Deaktivierungen sollte eigentlich nicht leichtfertig für solche Zewcke missbraucht werden.
    Wenn er deinen Code benutzt, kann er keine Gegner mehr deaktivieren weil ja immer alle aktiviert werden.
    Ausserdem sollte sich in deinem Fall das Spiel aufhängen/ eine Fehlermeldung ausspucken, wenn es entweder gar keine- oder keine Gegner im entsprechenden Bereich gibt.

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

  • @Verwurster
    Ich glaube bigmek meinte eher, dass dein code nur funktioniert, wenn das nächstgelegen gegnerobjekt auch im Schussfeld liegt. Es soll aber eher so funktionieren, dass das nächstgelegen gegnerobjekt gefunden wird, welches auch im Schussfeld liegt. Deshalb bei meiner version die Schleife und Deaktivierung. Mit dem Auhängen könntest du recht haben. Damit das nicht passiert müsste der code so aussehen

    GML-Quellcode

    1. var check, gegner, dist;
    2. do {
    3. gegner = instance_nearest(x,y,obj_gegner);
    4. if (gegner <= 0)
    5. dist = false;
    6. else {
    7. dist = (distance_to_object(gegner)<=maxdistanz);
    8. check = (dist && point_direction(x,y,gegner.x,gegner.y)>=0 && point_direction(x,y,gegner.x,gegner.y)<=90);
    9. if (check)
    10. // schießen
    11. else
    12. instance_deactivate_object(gegner);
    13. }
    14. } until (check || !dist);
    15. instance_activate_object(obj_gegner);
    Alles anzeigen


    Falls die Deaktivierung anderweitig benötigt wird, würde ich einfach alle deaktivierten objekte in einer liste speichern und danach wieder aktivieren.
  • Oh mann bin ich blöde hab deine code die ganze zeit gelesen und nicht verstanden
    habe irgendwie nicht bemerk das da ein instance_deactivate_object ist

    Die Idee ist super darauf wäre ich nie gekommen
    Somit werden nur alle nötigen objekte durchlaufen

    ps: das Deaktivierung ist kein problem da es ja ein multiplayerspiel wird kann ich sowieso keine objekte deaktiviern, allso sind am anfang alle aktiv

    Danke dir du hast mein problem gelöst :D.
    PI 0%(IN PROGRESS)
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]

    Engine : 0.0 %
    KI : 0.0 %
    Grafik : 0.0%
    Sounds: 0.0 %
    Multiplayer: 0.0%
  • Original von Bl@ckSp@rk
    Ich glaube bigmek meinte eher, dass dein code nur funktioniert, wenn das nächstgelegen gegnerobjekt auch im Schussfeld liegt. Es soll aber eher so funktionieren, dass das nächstgelegen gegnerobjekt gefunden wird, welches auch im Schussfeld liegt.


    Genau das macht er doch :P
    Wenn kein Gegnerobjekt da ist, funktioniert er, wenn mal kein Gegner im Schussfeld ist funktioniert er und auch wenn ein Gegner im Schussfeld ist funktioniert er.
    Entweder du hast meinen Code falsch gelesen/ nicht ausprobiert oder ich kann den versteckten Sinn dieser 2 sich scheinbar widersprechenden Sätze nicht ganz folgen.
    In dem Fall bitte ich um Erläuterung.

    Ich glaube aber nicht, das -wie im obigen post angenommen- bei deinem Code nur alle nötigen Objekte durchlaufen werden.
    Die Funktion instance_nearest() alleine durchläuft doch schon alle Objekte, um das Nächste zu ermitteln!
    Wenn es nicht gleich der Erste Treffer ist, werden also immer und immer wieder alle nicht deaktivierten Gegnerobjekte durchlaufen, bis mal eins im Zielbereich ist.

    Wenn keins im Zielbereich ist, werden gar alle Objekte so oft durchlaufen, wie es aktive Objekte gibt!
    Ich habe die Geschwindigkeit von deiner Methode noch nicht getestet, vieleicht ist sie ja gar nicht so langsam, weil die Funktion ja kompiliert ist aber ich stelle sie mir bei so richtig vielen Gegnern sehr Langsam vor.


    edit:
    Ich habe mal ein paar Speedtests gemacht.
    Beide Methoden funktionien einwandfrei.
    Es liegen immer 200 Gegnerobjekte vor.
    Wenn ein Obekt im Zielbereich liegt, und die Funktionen 500 mal aufgerufen werden:
    Bl@ckSp@rks Methode: 0.44s
    Verwursters Methode: 0.80s
    Wenn mehrere objekte im Zielbereich sind, 500 mal:
    Bl@ckSp@rks Methode: 0.59s
    Verwursters Methode: 0.94s
    Wenn gar kein Objekt im Zielbereich ist, wieder 500 mal:
    Bl@ckSp@rks Methode: 7.20s
    Verwursters Methode: 0.81s

    Man sieht also, so lange mindestens ein Objekt im Zielbereich ist ist Bl@ckSp@rks Methode Geschwindigkeitsmässig klar im Vorteil.
    Wenn keins im Zielbereich ist, sieht's düster aus.

    Wer selbst die Werte überprüfen will, hier ist die Speedtest gm6:
    Klick

    Zum Wertetesten rechts klicken.

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

  • stimmt eigentlich, daran habe ich garnicht gedacht das instance_nearest() auch alle objekte durchlaufen muss
    PI 0%(IN PROGRESS)
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]
    [IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII]

    Engine : 0.0 %
    KI : 0.0 %
    Grafik : 0.0%
    Sounds: 0.0 %
    Multiplayer: 0.0%
  • Ohh... Sorry, ich muss alles zurücknehmen. Ich hab die ganze Zeit auf den code von TrunX geschaut und mir eingebildet er wäre von dir, weil du ihn auch nochmal zitiert hast. Hatte ich voll nen Brett vorm Kopf. ;)

    Jetzt glaub ich dir, dass dein code auch funktioniert. Das mit den Speedunterschieden kann ich mir nur so erklären, dass GML interpretiert wird, wogegen alle eingebauten Funktionen wie auch instance_nearest compiliert ist und deshalb schneller läuft oder einen anderen Algotithmus verwendet. Deshalb ist meine Methode wahrscheinlich teilweise schneller. Der letzte Speedtest mit den 7 Sekunden dürfte allerdings nur der Fall sein, wenn sich zwar sehr viele Gegnerobjekte in Reichweite aber nicht im Winkelbereich befinden. Denn wenn sie außerhalb der Reichweite sind wird die Schleife schon vorher abgebrochen.
  • Stimmt.
    Wenn sich 7 Objekte im Radius, aber nicht im Winkel Befinden, dauert das bei deiner Methode 1.12s, bei 14 Objekten 2.14s, bei 31 Objekten 4.13s und bei 0 Objekten 0.26s.
    Deine Methode hat eine sehr variable Performance während meine immer gleich schnell (oder lahm. Wie man's sieht ^^) bleibt.
    Je kleiner jedoch der Zielwinkel wird, desto ineffizienter wird deine Methode, da viele Objekte zwar im Radius aber nicht im Winkel sind.
    Bei einem Grossen Radius und einem kleinen Winkel sollte das besonders schlimm sein, während das bei meinem System aufgrund der konstanten Geschwindigkeit egal ist.