Cooldown Anzeige [Noch nicht gelöst]

  • GM 8

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

  • Cooldown Anzeige [Noch nicht gelöst]

    Hallo zusammen,

    Hab jetzt nach längerer Pause wieder mit dem GM angefangen und promt taucht auch schon wieder ein 'unlösbares' Problem auf ;)

    Grundinfos: 2D mmorpg

    In meinen Spiel gibt es einen Heiler bei den Gegnern, der die Lebensregeneration von einheiten in der nähe erhöht das klappt so auch schon, jedoch möchte ich diesem Heiler nun eine weitere Funktion geben: Ich möchte das er in regelmäßigen abständen auch einen der Goblins (normale Gegner) heilen kann. Dabei möchte ich, dass dieser unter nahen Goblins den mit wenigsten Leben herausnimmt und diesen um 80% seines Fehlenden Lebens heilt. Meine Frage wie mach ich das der Heiler den niedringste raussucht?

    Falls jemand weiß, wo man gute pixel animationen für skills z.B heilen finden kann könnte er mir vll. den Link schicken ds. :whistling:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Matce ()

  • Ich hab leider gerade keine zeit um dir en Codebeispiel zu geben aber ich würde es in etwa so machen

    ich mach ne for schleife die alle Instancen der näheren Umgebung abfrägt/durchprüft und deren Health mit obj.id in nehm Array/Grid speichert und dann gibst du denn min wert des Arrays/Grid aus und heilst das obj mit der id

    so in etwas würd ich das machen....

    Aber so auf den ersten Blick ist das bissle aufwendig, ich weis halt nicht wie gut deine Programmierkenntnisse sind ^^

    Falls jemand zeit hat dir dafür en Code zu schreiben oder ne bessere Idee hat ^^ nur heraus damit

    Grüßle Blayde

    Ps coole Partikeleffekte kriegst auf dieser Seite ....

    reinerstilesets.de/de/2d-grafiken/

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

  • Vielen Dank erstmal,

    Leider verstehe ich deine Beschreibung nicht. Mit welchem Befehl kann ich denn die ganzen Gegner in der nähe überprüfen und wie kann ich dann auf die hp der Goblins zugreifen jeder von denen hat ja eine eigene hp Variable?
  • Mom ich versuch mal en exampel zu machen , falls ichs hinbekomm ^^

    EDIT:

    So habs hinbekommen war einfacher als gedacht, in der Doku gabs sogar genau für soetwas in der Art en Beispielcode, hat das ganze ziemlich erleichtert :P

    Du musst nur dafür sorgen das die Forschleife nach gewünschter Heilung nicht nochmal ausgeführt wird, sonst heilt er alle Einheiten hoch, da er immer die niedrigste nimmt....

    Hab ihn auch getestet, funktioniert einwandfrei

    GML-Quellcode

    1. {
    2. minhp_id = -1; // dieser Wert gibt die id wieder
    3. min_hp = 100; // kleinster gefundener hp wert, anfangs 100
    4. for (i=0; i<instance_count; i+=1) // Schleife zum überprüfen aller Instancen im Raum
    5. {
    6. iii = instance_id[i];
    7. if (iii.object_index == Goblin and distance_to_object(iii) < 200 ) // Den gewünschten Gegner der geheilt werden soll und sich im Abstand von 200 vom Heiler befindet
    8. {
    9. if (iii.own_health < min_hp) // abfrage ob der gefundene Hp wert kleiner als der kleinste bekannte wert ist
    10. {minhp_id = iii; min_hp = iii.own_health;} // falls ja, wird der Wert gespeichert und auch die ID
    11. }
    12. }
    13. minhp_id.own_health=80 // gewünschter Wert
    14. }
    Alles anzeigen



    Viel spass damit

    Grüßle Blayde

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Blayde ()

  • Vielen dank :)

    Was es alles gibt im GM. Da fühl ich mich ja wie ein richtiger anfänger ;)

    Vielen dank das du dir so viel mühe gegeben hast! (Probiers jez mal aus)

    EDIT:

    Jez ist mir doch noch was aufgefallen: Bei deiner Version werden ja alle instancen im Raum überprüft ein ganzer Raum ist bei mir aber relativ Groß er könnte also irgenwelche Endgegner am anderen ende des Raums heilen Lässt sich das irgenwie beheben?
    und noch ne frage: was soll ich jez wo einsetzen? Schick dir anbei mal den code meiner Goblins im Create event:

    GML-Quellcode

    1. hspeed = 3
    2. {
    3. bronze = 0
    4. silber = 0
    5. // Erstelle eine Variable, "hp"
    6. // Diese Variable gibt die HP des Gegners an
    7. hp = 100;
    8. // hp_max gibt die Maximale HP der Einheit an,
    9. // dies ist f�r die Prozentuale Rechnung wichtig!
    10. hp_max = 100;
    11. // "size" stellt die Gr��e der Healthbar dar
    12. // Ich habe die "size" auf "sprite_get_width" gestellt,
    13. // was die Breite des Sprites wieder gibt, und somit genau da endet,
    14. // wo das Sprite endet!
    15. // Durch "sprite_index" als Variable, brauch man hier nichts mehr machen
    16. // egal welchen Sprite man bentutz!
    17. size = sprite_get_width(sprite_index);
    18. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Matce ()

  • Naja eigenlich ganz einfach, ich hab den Code nochmal bissle abgeändert
    jetzt werden nur die Instancen geheilt die 200 Pixel vom Heiler entfernt sind... Wert kannst ja noch ändern

    Der Code kommt ins Step Event deines Heilers oder ins Timer Event falls du damit arbeitest
    allerdings brauchst du noch ne bedingung wann dieser Code abgearbeitet wird.... damit er nicht alle Goblins dauerhaft hochheilt sondern nur zu bestimmten Zeitpunkten....
    z.b if timer[1]= 0 {

    GML-Quellcode

    1. {
    2. minhp_id = -1; // dieser Wert gibt die id wieder
    3. min_hp = 100; // kleinster gefundener hp wert, anfangs 100
    4. for (i=0; i<instance_count; i+=1) // Schleife zum überprüfen aller Instancen im Raum
    5. {
    6. iii = instance_find(Goblin,i) ;
    7. if (distance_to_object(iii) < 200) // Den gewünschten Gegner der geheilt werden soll und sich im Abstand von 200 vom Heiler befindet
    8. {
    9. if (iii.hp< min_hp) // abfrage ob der gefundene Hp wert kleiner als der kleinste bekannte wert ist
    10. {minhp_id = iii; min_hp = iii.hp;} // falls ja, wird der Wert gespeichert und auch die ID
    11. }
    12. }
    13. minhp_id.hp=80 // gewünschter Wert
    14. }
    Alles anzeigen


    }
    timer[1] = 500

    So sollte es eigentlich relativ gut funktionieren

    Grüßle Blayde

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

  • also jez funktioniert es. Leider bleibt das spiel nur total hängen wenn der Timer gestartet wird. ganz kurz für circa 1 sek bleibt alles wie eingefroren stehn. Weist du woran das Liegt? Ausserdem werden nur goblins geheilt mit weniger als die hälfte der leben

    EDIT:

    Ich glaube das liegt daran das anfangs alle Instancen im Raum durchgegangen werden. Doch wie lässt sich das vermeiden?
  • hmm das ich nicht weis wieviele obj du in deinem Raum hast ist das schwer zu sagen, aber wenn du alles damit vollgekleistert hast kann es schon passieren das sich das Spiel kurz aufhängt, vielleicht musst mehr mit Tiles arbeiten wenn des möglich ist....

    oder du musst dir ne bessere Lösung ausdenken, wie nur instancen in unmittelbarer nähe abgefragt werden :p

    EDIT:

    GML-Quellcode

    1. probiers mal mit instance_find(Goblin,i)
    2. statt instance_id[i]
    3. müsste dann so aussehen
    4. iii = instance_find(Goblin,i) ;
    5. if (distance_to_object(iii) < 200 )

    damit dürfte er nur instancen die Goblins sind abfragen

    Warum nur Goblins geheilt werden die weniger als die Hälfte der Leben haben, kann ich so spontan jetzt nicht sagen,
    eigentlich sollte er einfach den Goblin mit dem niedrigsten HP wert heilen....

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

  • Hab mein Spiel jez nochmal kurz umgeändert das es jez nurnoch einen Goblin und einen Heiler gibt. Das Spiel hängt sich trotzdem noch auf. Und das die Goblins nur mit 50 % des LEbens geheilt werden is ja eigentlich egal hat ja auch was ;) Wenn es hilft könnte ich dir auch ma das Spiel schicken wenn du jez aber genug hast dann kannste das ruhig sagen ;)
  • Mach mal ne Zip datei aus der GMK datei

    wenn net weißt wie des geht hier die erklärung
    GMK datei anwählen --> rechtsklick --> senden an --> Zip komprimierter Ordner
    und diese Datei dann einfach anhängen...

    wenn du externe Datein lädst musst mir den ganzen Ordner gezippt schiken, aber davon geh ich jetz ma nicht aus
  • So, da ich deine Datei nicht öffnen konnte (neuere GM version und so -.-)

    hab ich dir hier mal ein Exampel gemacht,... ich hab alles kommentiert und noch paar verbesserungen eingeführt damit man es besser sieht, sind für dich aber nicht relevant

    also ich hab konstant 30 fps und hab auch keine lags ... bemerkt...

    Schau dir am besten mein exampel an und wende es auf deins an.... sachen die du nicht beachten musst hab ich dazugeschrieben....

    Wichtig ist eigentlich nur das Healer obj

    Hoffe jetzt klappts

    Grüßle Blayde

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    EDIT:

    ich hab jetzt mal deine Datei abgeändert und es lief bei mir eigentlich ganz flüssig....
    also wenn du den oberen Code einfügst sollte es klappen,....
    jetzt werden auch nurnoch die Goblin objekte abgefragt!!!


    Aber du sollstes dringend alle obj wie z.b die Landschaften in Tiles umändern und nur steine die der Spieler berühren kann... als obj haben... das würde deine Performence extrem steigern... weil jetzt hast du viel zu viele Objekte drin...
    deswegen auch der Lag nehme ich an....
    Dateien

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Blayde ()

  • Naja immer dann wenn man obj benutzt wo man keine bräuchte.... Er hat hàlt auch den hintergrund mit objekten gemacht.... Und da dieser aus lauter kleinen blöcken besteht würde ich ihm vorschlagen diesen mit tiles zu machen weil das einfach die performance extrem steigert....

    Ein tile wird nur gezeichnet wärend bei einem objekt alle events überprüft werden egal ob etwas drinsteht oder nicht

    Mann könnte auch noch alle obj ausserhalb des view deaktivieren ...
  • Seitdem ich einmal beim Android-Export Probleme mit Tiles hatte (abstände zwischen den Tiles welche im Windows-Export nicht waren) bin ich darauf umgestiegen Sprites zu zu zeichnen (hat mir noch nie Probleme gemacht).

    Wenn ich dich jetzt richtig verstehe bist du der Meinung das dies von der Performance her keinen unterschied macht oder?
    War für mich gefühlsmäßig immer etwas anderes. Hatte mich aber nie genauer damit befasst, da ja mein Problem durch das Sprite zeichnen an sich gelöst war. Fände es toll zu wissen das dies aber an sich nicht wirklich einen unterschied mache ob ich jetzt ein Tile in den Raum lege, oder ein Sprite zeichnen lasse.
  • Hallo nochmal,

    Hab mir das Problem nochmal angeschaut und ne Nacht drüber geschlafen das bewirkt oft wunder ;).
    Deinen Quellcode hab ich jetzt so einigermaßen verstanden. Also: Ich hab mir gedacht man den Goblins sagen sie geben dem Heiler in seiner persöhnlichen variable (enemies) ein plus von 1 wenn sie sich in dessen (z.B 200 pixel) Reichweite befinden. Das sieht dann inetwa so aus :

    Goblin :event_create:

    GML-Quellcode

    1. block= false
    2. hspeed = 3
    3. {
    4. bronze = 0
    5. silber = 0
    6. // Erstelle eine Variable, "hp"
    7. // Diese Variable gibt die HP des Gegners an
    8. hp = 200;
    9. // hp_max gibt die Maximale HP der Einheit an,
    10. // dies ist f�r die Prozentuale Rechnung wichtig!
    11. hp_max = 200;
    12. // "size" stellt die Gr��e der Healthbar dar
    13. // Ich habe die "size" auf "sprite_get_width" gestellt,
    14. // was die Breite des Sprites wieder gibt, und somit genau da endet,
    15. // wo das Sprite endet!
    16. // Durch "sprite_index" als Variable, brauch man hier nichts mehr machen
    17. // egal welchen Sprite man bentutz!
    18. size = sprite_get_width(sprite_index);
    19. }
    Alles anzeigen


    Goblin Ausschnitt :event_step:

    GML-Quellcode

    1. if distance_to_object(Goblin_Magier)< 200
    2. {
    3. if block == false
    4. {
    5. (instance_nearest(x,y,Goblin_Magier)).enemies += 1
    6. block = true
    7. }
    8. }
    9. else
    10. {
    11. if block == true
    12. {
    13. (instance_nearest(x,y,Goblin_Magier)).enemies -= 1
    14. block = false
    15. }
    16. }
    Alles anzeigen


    Ausschnitt :event_collision: Player1

    GML-Quellcode

    1. if global.V_Player1 > 0
    2. {
    3. hp -= global.ad_p1
    4. // Wenn die HP unter oder gleich 0 ist, zerst�re die Instance
    5. if (hp <= 0)
    6. {
    7. (instance_nearest(x,y,Goblin_Magier)).enemies -= 1
    8. instance_destroy();
    9. bronze= random(100)
    10. if bronze < 31
    11. instance_create(x,y,Bronze)
    12. silber= random(100)
    13. if bronze < 3
    14. instance_create(x,y,Silber)
    15. global.ep +=10
    16. }
    17. }
    Alles anzeigen


    Das gleiche dann auch noch beim Goblin MAgier :

    Goblin_Magier :event_create:

    GML-Quellcode

    1. enemies= 0
    2. hspeed = 3
    3. alarm[0] = 200
    4. {
    5. bronze = 0
    6. silber = 0
    7. // Erstelle eine Variable, "hp"
    8. // Diese Variable gibt die HP des Gegners an
    9. hp = 300;
    10. // hp_max gibt die Maximale HP der Einheit an,
    11. // dies ist f�r die Prozentuale Rechnung wichtig!
    12. hp_max = 300;
    13. // "size" stellt die Gr��e der Healthbar dar
    14. // Ich habe die "size" auf "sprite_get_width" gestellt,
    15. // was die Breite des Sprites wieder gibt, und somit genau da endet,
    16. // wo das Sprite endet!
    17. // Durch "sprite_index" als Variable, brauch man hier nichts mehr machen
    18. // egal welchen Sprite man bentutz!
    19. size = sprite_get_width(sprite_index);
    20. }
    Alles anzeigen


    Undd das wohl wichtigste:

    Goblin_Magier :event_timer: [0]

    GML-Quellcode

    1. // Wichtig:
    2. //Wenn der Timer 0 ist wird dieser Code 1mal ausgel�st
    3. minhp_id = 200; // dieser Wert gibt die id wieder
    4. min_hp = 100; // kleinster gefundener hp wert, anfangs 100
    5. for (i=1; i=Goblin_Magier.enemies; i+=1) // Schleife zum �berpr�fen aller Instancen im Raum
    6. {
    7. iii = instance_find(Goblin,i) ;
    8. if (distance_to_object(i) < 200 ) // Den gew�nschten Gegner der geheilt werden soll und sich im Abstand von 200 vom Heiler befindet
    9. {
    10. if (i.hp< min_hp) // abfrage ob der gefundene Hp wert kleiner als der kleinste bekannte wert ist
    11. {minhp_id = iii; min_hp = iii.hp;} // falls ja, wird der Wert gespeichert und auch die ID
    12. }
    13. }
    14. minhp_id.hp=80 // gew�nschter Wert
    15. alarm[0]=100
    Alles anzeigen



    Funktioniert Leider immer noch net. Was aber funktioniert ist der Zähler(Hab ich im Debug-Mode ausprobiert)

    Bringt das überhaupt was?
    Bilder
    • Anzahl_Gegner.JPG

      72,63 kB, 1.128×365, 203 mal angesehen
  • Hast du dir mein Exampel mal angeschaut?

    Da funktioniert das ganze Wunderbar,....

    i=Goblin_Magier.enemies
    minhp_id = 200;


    wird kaum funktionieren minhp_id muss -1 sein damit er alle instancen abfrägt, warum du da eine 200 hast versteh ich nicht

    ich lad dir mal das example hoch das ich verbesser habe dort funktioniert das ganze wunderbar, hatte keine Probleme mit lags... möglicherweise ist mein PC besser als deiner und kommt mit den ganzen Obj klar

    außerdem hab ich dort ne Zeile Code bei den Goblins auskommentiert die alle ständig um 0,83 geheilt hat.

    Außerdem hab ich den Timer auf 100 gestellt, da bei 200 es 6,67 sek dauert bis er wieder heilt, was fürn game doch recht lange ist


    EDIT: Im Ausschnit Player 1
    hab ich glaub en kleinen Fehler gefunden^^

    GML-Quellcode

    1. bronze= random(100)
    2. if bronze < 31
    3. instance_create(x,y,Bronze)
    4. silber= random(100)
    5. if silber < 3 <--- stand bronze drin
    6. instance_create(x,y,Silber)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Blayde ()

  • Wenn man ganz genau guckt oder wenn du den Charakter mal eine Grade laufen lässt laggt auch diese Variation :P

    Ich hab mich jetzt entschlossen das ganze etwas einfacher zu machen indem ich einfach nur den vom Magier am nächsten gelegenen Goblin überprüft wird ob dieser volles leben hat. Wenn dieser kein volles leben hat wird er geheilt ansonsten wird alarm [0] wieder auf 100 gesetzt ;)

    Trotzdem vielen Dank für deine Hilfe & Mühe

    mfg
    Matthias