Aus gleichen Objekten eins auswählen und angreifen...

  • GM 8

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

  • Aus gleichen Objekten eins auswählen und angreifen...

    Hallo Zusammen,

    hab vorhin schon Stundenlang die Suchfunktion genutzt und auch über Google und die GM-Hilfe bin ich nicht schlauer geworden.

    Zur Übersicht:
    1. Es gibt 2 Hauptcharaktere (1 Spieler, 1 PC)
    2. Hauptchar wird mit Rechtsklick auf den Boden bewegt und auf den Gegner zum Angriff befehligt (hat alles wunderbar funktioniert bis zum nächsten Stichpunkt)
    3. Es gibt kleine Computergesteuerte Monster (eigenes Team und Gegnerteam) die mit Rechtsklick auch angegriffen werden sollen.
    4. Die Hauptchars und Monster haben Lebensbalken über den köpfen die durch Angriffe sinken bis sie tot sind -> Hauptchar erscheint nach paar sekunden wieder, Monster bleiben tot.
    5. Die Monster erscheinen ca. alle 30sek in Wellen neu.
    (Ja, es wird ein DotA-Abklatsch ;D)

    Mein Problem ist folgendes:
    Ich habe ein Objekt für die Monster, aber sobald mehrere davon im Spiel sind, lassen sich diese zwar noch angreifen, aber die Lebensbalken sinken nicht mehr, und es wird auch nicht der richtige Gegner angegriffen, sondern irgendeiner davon. Außerdem rennt mein Hauptchar verwirrt umher wenn ein Monster tot ist, und ich zum Angriff auf die nächsten befehlige...



    Ich pack den derzeitigen wichtigsten GML mal in die Spoiler...
    Spoiler anzeigen
    obj_spieler - Step event

    GML-Quellcode

    1. if global.player_info[0,5]==1 && obj_gegner.visible==1 // Angriff [0,5] und Anwesenheit vom Gegner checken{
    2. if distance_to_object(obj_gegner) > global.player_info[0,4] //testen ob außer Reichweite
    3. {
    4. if global.gegner_typ == 1
    5. {
    6. if instance_exists(obj_gegner) //falls Gegner vorhanden ist
    7. {
    8. mp_potential_step(obj_gegner.x,obj_gegner.y,6,0) //bewegt sich der Spieler zum Angriffspunkt
    9. }
    10. }
    11. else
    12. if global.gegner_typ == 2
    13. {
    14. if instance_exists(obj_gegner_minion) //falls Gegner vorhanden ist
    15. {
    16. mp_potential_step(obj_gegner_minion.x, obj_gegner_minion.y,6,0)
    17. }
    18. }
    19. }
    20. else // falls der Spieler in Reichweite ist :
    21. {
    22. obj_spieler.speed=0 // wird seine Bewegung gestoppt,
    23. if global.player_info[0,6]==1 // und falls er Schießen kann,
    24. {
    25. instance_create(x,y,obj_schuss) // erstellt er einen Schuss (Bewegung im obj_schuss hinterlegt)
    26. global.player_info[0,6]=0 // [0,6] = 0 heißt er kann nicht mehr schießen bis wieder auf 1
    27. alarm[0]=50 // Timer der [0,6] auf 1 setzt.
    28. }
    29. }
    30. }
    Alles anzeigen


    obj_gegner - Right Pressed

    GML-Quellcode

    1. global.gegner_typ=1



    obj_gegner_minion - Draw

    GML-Quellcode

    1. if distance_to_point(mouse_x, mouse_y) == 0draw_sprite(spr_gegner_minion_visiert,-1,x,y);elsedraw_sprite(spr_gegner_minion,-1,x,y);
    2. draw_set_color(c_green);draw_percentage_bar(x-10,y-20,25,5,global.player_info[global.minion,2],global.player_info[global.minion,3],true);



    obj_gegner_minion - Right Pressed

    GML-Quellcode

    1. global.gegner_typ=2


    Spoiler anzeigen

    contr_verwaltung - Glob Right Pressed (hab ich noch mit Drag&Drop gemacht)

    Mouse Event for Glob Right Pressed:
    if cursor_sprite is equal to spr_maus_angriff
    if number of objects obj_angriff is Equal to 0
    create instance of object obj_angriff at position (mouse_x,mouse_y)
    set variable global.player_info[0,5] to 1
    else
    for all obj_angriff: destroy the instance
    create instance of object obj_angriff at position (mouse_x,mouse_y)
    set variable global.player_info[0,5] to 1
    else
    if cursor_sprite is equal to spr_maus_lauf
    set variable global.gegner_typ to 0
    set variable global.player_info[0,5] to 0
    if number of objects obj_klick is Equal to 0
    create instance of object obj_klick at position (mouse_x,mouse_y)
    else
    for all obj_klick: destroy the instance
    create instance of object obj_klick at position (mouse_x,mouse_y)



    Und dann noch das Script für die Lebensbalken der Monster:
    Spoiler anzeigen

    GML-Quellcode

    1. var x1, y1, x2, y2;
    2. var width, height;
    3. var value, value_max;
    4. var color, backing;
    5. //get arugments
    6. x1 = argument0;
    7. y1 = argument1;
    8. width = argument2;
    9. height = argument3;
    10. value = argument4;
    11. value_max = argument5;
    12. backing = argument6; //boolean
    13. //get set draw color, should be set before calling function
    14. color = draw_get_color();
    15. //draw the backingif (backing)
    16. {
    17. draw_set_color(c_black);
    18. draw_rectangle(x1-1,y1-1,x1+width+1,y1+height+1,false);
    19. }
    20. //set values
    21. x2 = x1 + (value/value_max * width);
    22. y2 = y1 + height;
    23. //main fill color
    24. draw_set_color(color);
    25. draw_rectangle(x1,y1,x2,y2,false);
    Alles anzeigen



    Ich bin echt am Verzweifeln... ich hab schon versucht mit Instanzen-IDs das Problem zu lösen, aber ich glaub da muss ich erst intensiver lesen und vllt nen Tutorial machen :(

    Hoffe ich habe euch nicht erschlagen mit dem ganzen Zeug und es findet sich jemand damit zurecht der mir helfen kann.
    Verbesserungsvorschläge im derzeitigen GML gern gesehen. Bin ja noch neu darin ;D

    Mfg Seri
  • Hi,

    ich bin mir nicht ganz sicher, aber ich glaube dein Problem entsteht dadurch, dass du keine parents benutzt.
    Im Moment, wenn ich das richtig deute, fragst du derzeit alle instance_ids ab von z.b. obj_gegner. Daher wählt er die erste der ids aus, egal welche du auswählst.

    Fazit: Erstelle ein parent object(z.b.obj_parent) und verknüpfe deine Gegner mit diesem. Anschließend änderst du deinen Code von obj_gegner zu obj_parent in den MouseClick-Events.

    Theoretisch sollte das Problem dadurch behoben werden.

    Greetz

    Edit: Möglicherweise liegts aber auch an einer der globalen Variablen (z.b. global.minion).
    Es gibt viel zu tun, packen wir´s an !!!
    Für Rechtschreibfehler sind die verantwortlich, die sie entdecken :P.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Black-Mask ()

  • Uff...

    Danke für die schnelle Antwort :)

    Habe jetzt mal ein wenig mit Parents rumprobiert und auch auf Youtube ein paar Tutorials angeschaut, aber irgendwie komme ich damit nicht weiter. Vielleicht mache ich ja noch was falsch, aber wenn parents benutze, die Klick-Events reinmache und die Gegnerobjekte damit Verknüpfe passiert garnichts mehr.



    Ich kann mir leider nicht genau vorstellen wie ich das bewerkstelligen soll, dass aus einem übergeordneten Objekt (Parent) die "kleinen" Objekte ausgewählt werden sollen. Ich muss mit einem Rechtsklick ja abfragen ob der klick auf den Boden geht oder auf ein Ziel - habe ich ja über den Mauscursor gelöst. Dann kommt noch das Problem das ich zwischen gegnerischem Held und Monstern unterscheiden muss, hatte ich auch durch eine gesetzte Variable gelöst, aber die einzelnen Monster zu differenzieren geht einfach nicht :O



    Zu den globalen Variablen: Ich glaube, wenn ich diese nicht global gemacht hätte, hat irgendwas nicht funktioniert :/



    Kann man die Objekte (Monster) nicht durchnummerieren - bzw. gibt es dafür nicht die ID's? Dann könnte ich die doch einfach im Rechtsklickevent auslesen lassen und an den "Angriffsbefehl" weitergeben?

    Mfg Seri
  • Hi,

    Parents sind ja dazu da, um Sachen zu vereinfachen. Sie "vererben" alle eigenen "Eigenschaften" an alle Childs.

    Du solltest vielleicht einfach mal nen Testaufbau machen um das ganze zu verstehen.
    1.)Erstelle 3 Objekte: obj_held, obj_monster, e_parent
    für obj_held und obj_moster nen Sprite(Kreise oder Vierecke reichen ja dafür) zum unterscheiden
    2.)gib beiden das Parent e_parent

    e_parent hällt alle Informationen die beide haben können.Um zu unterscheiden wer was ist, kannst du z.b. in obj_held (create event)

    GML-Quellcode

    1. //ich bin kein monster
    2. monster = false
    3. //ich bin ein held
    4. held = true

    geben usw.. Beim monster dann genau umgedreht.
    3.)e_parent(Create Event)

    GML-Quellcode

    1. //checken ob unter mouse
    2. can_select = false

    e_parent(Step Event)

    GML-Quellcode

    1. //checken ob unter mouse
    2. if distance_to_point(mouse_x,mouse_y)< 0.1 then can_select = true
    3. else
    4. {can_select = false}

    e_parent(Draw Event)

    GML-Quellcode

    1. //zeichne sprite
    2. draw_sprite(sprite_index,image_index,x,y);
    3. //visuelle ausgabe
    4. if can_select = true
    5. {
    6. draw_circle(x,y,20,true);//zeichne kreis
    7. }

    Nun erstellste nen Room und packst nen paar obj_held und obj_monster rein.
    Wenn du alles richtig gemacht hast, sollte ein Kreis gezeichnet werden, über dem Objekt wo die Maus gerade drüber ist.

    Das ganze kannst du nun weiter ausbauen indem du z.b. noch ein Mausclick mit reinschreibst etc..

    Um deine Frage zu beantworten, du könntest deine Monster in eine ds_list oder in ein array packen und sie somit durchzählen. Aber ob das Sinn macht, weiß ich nicht.

    Greetz
    Es gibt viel zu tun, packen wir´s an !!!
    Für Rechtschreibfehler sind die verantwortlich, die sie entdecken :P.
  • Öhm ja... verstanden habe ich es jedenfalls, aber es kommt folgender Fehler beim kompilieren:

    Quellcode

    1. ERROR in
    2. action number 1
    3. of Draw Event
    4. for object e_parent:
    5. Error in code at line 4:
    6. if can_select = true
    7. ^
    8. at position 5: Unknown variable can_select


    hab alles überprüft und genauso gemacht wie du es geschrieben hast...
  • Leider nein...

    Hier die Informationen des e_parent-Objektes:

    Brainfuck-Quellcode

    1. Create Event:
    2. execute code:
    3. can_select = false
    4. // checken ob unter der maus
    5.  
    6. End Step Event:
    7. execute code:
    8. //checken ob unter mouse
    9. if distance_to_point(mouse_x,mouse_y)< 0.1
    10. {
    11. can_select = true
    12. }
    13. else
    14. {
    15. can_select = false
    16. }
    17.  
    18. Draw Event:
    19. execute code:
    20. //zeichne sprite
    21. draw_sprite(sprite_index,image_index,x,y);
    22. //visuelle ausgabe
    23. //can_select = true <<<---<<<--- Das auskommentiert, dann "läuft" es... also dauerhaft...
    24. if can_select = true
    25. {
    26. draw_circle(x,y,20,true);//zeichne kreis
    27. }
    Alles anzeigen


    Habe das Objekt e_parent in den raum gepackt, habe es ohne das Objekt versucht, die Variable umbenannt, es mit 0 und 1 versucht, aber nichts...
    Wenn ich allerdings im Draw-Event des Objekts can_select auf true oder false setze funktioniert der Code...also zumindest läuft das programm, auch wenn ich nichts Selektieren kann.
  • Hi,

    scheinbar lädt e_parent die Variable(can_select) zu spät. Deklariere Sie mal im Create Event des obj_monster und obj_held und lösche sie aus e_parent. Das sollte das Problem fixen.

    Greetz

    Edit: Hab mal noch nen Beispiel angehängt. Ist in GM6, solltest du aber dennoch öffnen können.
    Dateien
    • mousecheck.zip

      (2,45 kB, 187 mal heruntergeladen, zuletzt: )
    Es gibt viel zu tun, packen wir´s an !!!
    Für Rechtschreibfehler sind die verantwortlich, die sie entdecken :P.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Black-Mask ()