Wenn man auf Gegner klickt, wird dieser angegriffen

  • GM 7
  • Wenn man auf Gegner klickt, wird dieser angegriffen

    Hallo, ihr kennt doch sicher Strategiespiele wie Age of Empire oder Empire Earth oder etwas in der Art.
    Hab schon selber versucht mein Problem zu lösen, aber ich weiß nicht wie.
    Und zwar möchte ich, dass wenn mein eigener Panzer selektiert ist und ich auf ein Gegnerobjekt rechtsklicke, soll dieser angegriffen werden.

    Das mit dem selektieren klappt schon, auch dass der Panzer sich bewegt, nur ich weiß nicht wie ich den Code erstelle, dass er bei rechtsklick auf einen Gegner, diesen angreift.
    Die Variable selected gibts schon.

    Und bitte den Code erklären, wenns geht oder mir erklären wie ich den Code erstelle. :thumbsup:

    PS: Wie lass ich einen zufälligen Sound abspielen?


    Danke.
    Gruß Stefan
    Gruß Gamer

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

  • das mit den zufälligen sound machst du so
    beispiel:
    ins create event

    GML-Quellcode

    1. musik=choose(1,2)
    2. if musik=1 {sound_play(sound1)}
    3. if musik=2 {sound_play(sound2)}
    Meine Spiele:
    - Mission A
    - Mission B
    - The Virus 1, 2, 3
    - The Virus 4: The Excision
    - Blur melts Snow
    - Blur melts Snow: 2nd Version
    - Cave Jumper

    Hauptrojekt: Party Mania(Arbeitstitel) - große Multiplayer-Minispielsammlung
    In Planung: Planet Jumper(Nachfolger von Cave Jumper)
  • sebastian733 schrieb:

    das mit den zufälligen sound machst du so
    beispiel:
    ins create event

    GML-Quellcode

    1. musik=choose(1,2)
    2. if musik=1 {sound_play(sound1)}
    3. if musik=2 {sound_play(sound2)}
    Ich würde hier ein Switch-Statement benutzen ;)
    Ausserdem kannst du im choose() direkt die Soundnamen angeben, da sie in Zahlen (Integer) umgewandelt werden.
    z.B. sound_play(choose(sound1,sound2,sound3));

    Zum Thema "Panzer soll angreifen" würde ich empfehlen ein Attack-State zu machen.
    Vielleicht kannst du allgemein eine Variable benutzen, die besagt in welchem Zustand sich der Panzer befindet, das spart ungemein viele Variablen.
    Eine Idee wäre da z.B. state="stand"; state="move"; stand="attack"; etc. Vorteil hier ist, dass du direkt davon die Animation abhängig machen kannst und dementsprechend die Aktionen planen kannst.
    Eine weitere Möglichkeit ist es, den Zustand am sprite_index auszumachen. Das ist allerdings weniger übersichtlich, jedoch spart es dann noch eine weitere Variable... fraglich ob das nötig ist, tu was dir besser gefällt.

    Zum Angreifen in dem Fall würde ich sagen, du machst etwas wie >>WENN<< "rechte maustaste gedrückt">>UND<<"ausgewählt">>UND<<"entfernung<reichweite" >>DANN<< "zustand zu angreifen wechseln"
    Ich hoffe du verstehst mich, ich wollt dir keinen Code vorkauen und ich denke es ist verständlich.

    Du solltest im step oder end-step immer statusbezogen prüfen, wie die Konditionen derzeit sind, um bei Bedarf den Zustand zu wechseln.
    z.B. könnte das so aussehen:
    >>Wenn<< "zustand=angriff">>UND<<"entfernung>reichweite"" >>DANN<< "zustand zu bewegung wechseln"

    Um automatisches Angreifen zu benutzen, könntest du beispielsweise im Step die Entfernung prüfen lassen. Wenn er in Reichweite oder fast in Reichweite ist, greift er an.
    Hierfür empfielt sich evtl. noch eine Variable, die dem Befehl entspricht, damit er nur angreift, wenn er soll.

    Ich hoffe, ich hab nicht zu viel gelabert und du kommst damit in etwa klar. Bei weiteren Fragen, meld dich einfach ;)
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • ok schonmal danke euch beiden, aber hab das mit den Codes schon verstanden.
    Aber das selected gehört ja nur zu dem einen Panzer und er soll aber angreifen, wenn rechts auf den Gegner geklickt wird.
    Was mir fehlt, ist wie ich es einstell auf was rechtsgeklickt werden soll, dann würde ich deinen Code noch in GML umschreiben und ins Step-event vom eigenen Panzer
    aber wenn ich da dann schreib

    GML-Quellcode

    1. if mouse_check_button_pressed(mb_right) ...

    dann bedeutet das ja, dass wenn ich auf meinen eigenen klicke
    er soll aber angreifen wenn ich auf den gegner klicke

    wenn ich diesen Code jetzt aber ins Step event vom Gegner mache, dann hab ich das Problem mit der Maus zwar nicht mehr, aber das Problem mit dem selected, da diese Variable ja nur für meinen eigenen Panzer gilt.

    Am besten wäre es wenn ich irgendwie definieren kann auf was ich mit dem rechten mousebutton klicke
    geht das irgendwie?

    Danke.
    Gruß Stefan.
    Gruß Gamer
  • "if(mouse_check_button_pressed(mb_right))" ist nicht bezogen auf dein Objekt.
    Du könntest z.B. in allen Objekten das hier reinschreiben:

    GML-Quellcode

    1. if(selected)&&(mouse_check_button_pressed(mb_right))
    2. {
    3. movex=mouse_x;
    4. movey=mouse_y;
    5. state="move";
    6. }
    7. if(state="move")&&(movex)&&(movey)
    8. {
    9. direction=point_direction(x,y,movex,movey);
    10. speed=4;
    11. }
    Alles anzeigen


    Die movex und movey frage ich ab, damit er nicht Fehler ausspuckt, wenn die variablen nicht initiiert sind.
    Anstelle von direction und speed kannst du natürlich auch die PotentialStep Funktionen benutzen, dazu liess einfach die Hilfe, die sind ganz gut beschrieben.

    Wenn du direkt prüfen willst, was du anklickst, dann mach es mit z.B. target=instance_nearest(mouse_x,mouse_y,obj_irgendwas); nachdem du den rechtsklick abgefragt hast. Du könntes auch collision_circle benutzen, dann sucht er wenigstens nicht zwangsweise ein Ziel (falls keins in der Nähe ist), ist wohl sinnvoller.

    Das wäre dann:

    GML-Quellcode

    1. if(mouse_check_button_pressed(mb_right))
    2. {
    3. target=collision_circle(mouse_x,mouse_y,obj_irgendwas);
    4. if(target)
    5. {
    6. tu dies und das;
    7. }
    8. }
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Danke, aber ich dachte mouse check button ist darauf bezogen wo man es reinschreibt,...

    aber ich will ja dass es auf das gegnerobjekt bezogen ist, also er soll nur auf den Gegner schiessen, wenn ich den Gegner anklicke und zwar soll er dann nur auf den angeklickten Gegner schiessen.
    Wie mache ich das, dass es auf das Gegnerobjekt bezogen ist, obwohl es im StepEvent vom freundlichen Objekt steht.

    Und ich dachte das mit global mouse ist auf kein objekt bezogen und wenn es auf keines bezogen wäre, dann wär ja egal wo ich hinklicke, schiesst er auf den Gegner??

    Hoffe ihr könnt mir auch noch damit helfen.

    Danke,
    Gruß Stefan.
    Gruß Gamer
  • ich bin mir nicht sicher aber versuche es mit

    GML-Quellcode

    1. obj_gegner.mouse_check_button_pressed(mb_right)


    edit:ist schwachsinn was ich gesagt habe...klappt leider nicht :pinch:
    vielleicht wäre es ja möglich es ins gegner objekt zu schreiben ?( ^^
    Meine Spiele:
    - Mission A
    - Mission B
    - The Virus 1, 2, 3
    - The Virus 4: The Excision
    - Blur melts Snow
    - Blur melts Snow: 2nd Version
    - Cave Jumper

    Hauptrojekt: Party Mania(Arbeitstitel) - große Multiplayer-Minispielsammlung
    In Planung: Planet Jumper(Nachfolger von Cave Jumper)

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

  • ok danke und obj_blub ist dann mein Gegnerobjekt???!!!??


    edit: also wenn obj_blub das Gegnerobjekt ist und /*blub*/ der befehl was er dann tun soll, bei mir die Variable can_shoot auf 1 zu stellen, dann funktioniert das nicht.
    Hab im Debug Mode gestartet und die Variable can_shoot ändert sich nicht, habs öfters probiert und auch den Code ein paar Mal nachgeschaut ob er richtig ist, aber des funktioniert nicht.

    Gruß
    Gruß Gamer

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

  • The Gamer schrieb:

    ok danke und obj_blub ist dann mein Gegnerobjekt???!!!??


    edit: also wenn obj_blub das Gegnerobjekt ist und /*blub*/ der befehl was er dann tun soll, bei mir die Variable can_shoot auf 1 zu stellen, dann funktioniert das nicht.
    Hab im Debug Mode gestartet und die Variable can_shoot ändert sich nicht, habs öfters probiert und auch den Code ein paar Mal nachgeschaut ob er richtig ist, aber des funktioniert nicht.

    Gruß
    Ich will mich nicht beschweren, aber "mouse_button_check_pressed" fragt global ab... das sagte ich bereits, bzw. habs versucht euch klar zu machen.
    Wenn du fragen willst, wen du anklickst, musst du die ID auf Umwegen rausfinden.
    Mit collision_point für direktes Klicken oder halt evtl. collision_circle, dann hast du ne gewisse Tolleranz.

    Du machst z.B. ein obj_cursor und schreibst in den step-event sowas:

    GML-Quellcode

    1. target=collision_point(mouse_x,mouse_y,obj_irgendwas);
    2. if(target)&&(mouse_check_button_pressed(mb_right))
    3. {
    4. with(target)
    5. {ichwurdeangeklickt;}
    6. }


    Das mit rechte Maustaste im D&D is was anderes. In GML ist die Funktion das selbe wie "If Global Mouse Right Button Pressed"
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Ok danke, aber gibt es auch ne Möglichkeit das ins Step-Event vom eigenen Objekt zu schreiben, da dort die ganzen Variablen aufgeführt sind, z.b. auch die can_shoot und die gelten ja nur für den
    und wenn ich das ins cursorobjekt reinschreibe, dann kann das ja gar nicht funktionieren, da die Variablen nur im Panzerobjekt existieren, gibts da ne Möglichkeit, sonst hab ich keine ahnung wie man das machen soll.
    Also nochmal kurz zusammengefasst: Gibt es eine Möglichkeit dass wenn man mit der Maus auf ein bestimmtes Objekt klickt etwas ausgeführt wird.

    Der Code von SDX wäre ja einleuchtend, nur leider funktioniert er nicht.

    Gruß
    Gruß Gamer
  • Mach einfach
    with(panzer)
    {
    if(ausgewaehlt)
    {
    aktion
    }
    }
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Die ganzen Statements (with, if, for, while, do, etc.) solltest du dir mal alle genauer anschauen. Das ist sehr wichtig und man kann interessante Sachen damit machen.

    Helfen dir in vielen Fragen weiter ;)
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Ich hab mal ein Example geschrieben.
    Ich hoffe, ich hab das richtig verstanden.

    Im Anhang kannst du es runterladen. Die Datei ist im Rar als .gmk verpackt.
    Ich habe die Variable vis dafür genommen.

    Mit freundlichem Gruß
    icqgamer
    Dateien
  • Ich mache das immer mit Global Mouse Events. Und (spätestens) da wird abgefragt, welche klickbaren Objekte gerade unter dem Mauszeiger sind und entsprechend reagiert. Naja, die Frage nach dem "Objekt unter der Maus" mach ich oft auch mit einem "Mauszeiger"-Objekt (1x1 Maske). Dann habe ich immer das Kollisions-Event mit Der Maus parat.

    EDIT: Ehem... Naja, was Schattenphoenix sagt halt. ;)
  • Melancor schrieb:

    Ich mache das immer mit Global Mouse Events. Und (spätestens) da wird abgefragt, welche klickbaren Objekte gerade unter dem Mauszeiger sind und entsprechend reagiert. Naja, die Frage nach dem "Objekt unter der Maus" mach ich oft auch mit einem "Mauszeiger"-Objekt (1x1 Maske). Dann habe ich immer das Kollisions-Event mit Der Maus parat.

    EDIT: Ehem... Naja, was Schattenphoenix sagt halt. ;)


    Ein Objekt dafür ist verschwendung von Ressourcen... sinnvoller wäre es mit collision_point, was auch die ID wiedergibt.
    Global Mouse Event benutze ich nur, wenns schnell zum Testen sein soll. Normal benutze ich immer mouse_check_button(_pressed). Deine Methode geht natürlich auch.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Benutzer online 1

    1 Besucher