moduswechsel für tower moba gun

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

  • moduswechsel für tower moba gun

    huhu,

    ich hätte da mal nen problemchen. ich bastel ab und an anner art tower defence game. nun habe ich eine gun welche später 3 feuermodi besitzen soll. den ersten mit instance_nearest hab ich hinbekommen. ich möchte aber noch einen der den creep mit den wenigsten und einen mit den meisten hp angreifen soll. jetzt hat die waffe eine range. und so recht weiß ich atm net wie ich das machen soll daß nur in der range die creeps gecheckt werden wer die meiste oder wenigste hp hat.
    hier ma mein momentanes script:

    create:

    GML-Quellcode

    1. range = 100 // reichweite des turret - levelbar
    2. gunmode = 0 // welchen KI-modus verwendet die gun - vorerst nur instance_nearest (0)
    3. damage = 2 // schaden per schuss - levelbar
    4. frequenzmax = 10 //maximale schussfrequenz
    5. frequenz = frequenzmax // schussfrequenz
    6. drawrange = false // zeichnet einen kreis in grgrösse der range wenn maus drüber fährt
    7. active = false // ist waffe aktiv


    step:

    GML-Quellcode

    1. //erster feuermodus - turret sucht nächstes ziel und schaltet ausser range oder wenn zerstört um
    2. if gunmode = 0 && instance_exists(obj_creep_follow_p1) {
    3. if active = false && distance_to_object(obj_creep_follow_p1) <= range {i = instance_nearest(x,y,obj_creep_follow_p1) active = true}
    4. if active = true{
    5. ii = point_distance(x,y,i.x,i.y)
    6. image_angle = ii
    7. frequenz -=1 //zählt runter bis schuss generiert wird
    8. if frequenz = 0 { i.leben -=damage frequenz = frequenzmax} // hier wird schaden pro schuss generiert
    9. if i.leben <=0 {active = false}
    10. if distance_to_object(i) >= range {active = false}
    11. }
    12. }
    Alles anzeigen


    das nächste prob ist daß die range iwie net richtig stimmt, wenn ich mit maus über meine gun fahre zeigt es einen kreis welcher der range entsprechen soll:

    draw:

    GML-Quellcode

    1. if gunmode = 0 && active = true{
    2. //i = instance_nearest(x,y,obj_creep_follow_p1)
    3. p = point_direction (x,y,i.x,i.y)
    4. if distance_to_object(i) <= range {
    5. //draw_sprite_ext(spr_turret_mgun,0,x,y,1,1,p,c_white,1) // turret
    6. draw_line_width_color(x,y,i.x,i.y,2,c_white,c_green)
    7. } // schussrichtung
    8. else{
    9. //draw_sprite_ext(spr_turret_mgun,0,x,y,1,1,direction,c_white,1)
    10. }}
    11. if drawrange = true {draw_circle_color(x,y,range,c_white,c_red,1)}
    Alles anzeigen


    aba warum auch immer ist die linie die erstmal die länge des schuß darstellt immer länger als der kreis der die max range angibt. also die überschneiden sich.

    hab ma meinen momentanen stand angehangen.

    hoffe man kann mir helfen.
    Dateien
    • test3_5.zip

      (18,91 kB, 243 mal heruntergeladen, zuletzt: )
  • Das range problem ist vielleicht einfach nur ein rundungsfehler bei den draw funktionen, bzw wie weit geht den der strich über den kreis hinaus?

    Zu deinen feuermodi:
    Es gibt ein paar arten das zu lösen. Eine davon ist, du deaktivierst alle Einheiten ausser die die in Recihweite des Turms sind, dann trägst du deren IDs und HP in ein ds_grid ein und sortierst dieses, dann pickt sich der Turm die oberste ID raus und schießt auf sie.

    GML-Quellcode

    1. instance_deactivate_region(x-range,y-range,range*2,range*2,false,true);
    2. //dann hier aber alle instancen aktivieren die wichtig sind und error verursachen würden wenn nicht (eg controller, andere Türme etc)
    3. //mitunter kann man das noch performanter lösen, es geht nur darum die anzahl an zu checkenden instances zu minimieren
    4. ds_grid_resize(2,instance_number(obj_enemy));
    5. with(obj_enemy)
    6. {
    7. for (i = 0 ; i < ds_grid_height(other.targetgrid) ; i += 1)
    8. {
    9. if other.targetgrid[# 0,i] == -1
    10. {
    11. other.targetgrid[# 0,i] = id;
    12. other.targetgrid[# 1,i] = hp;
    13. }
    14. else if other.targetgrid[# 0,i] == id
    15. {
    16. i = ds_grid_height(other.targetgrid); //wenn du dich schon eingetragen hast, beende den loop
    17. }
    18. }
    19. }
    20. //sortiere die liste und such dir dein target
    21. ds_grid_sort(1,true);
    22. target = targetgrid[# 1,0];
    23. //aktiviere wieder alle instancen
    24. instance_activate_all();
    Alles anzeigen


    Falls du performance probleme mit diesem code bekommst dann musst du schauen wo du das noch schlanker bekommst.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)

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

  • Es zwingt der Turm, alle Gegner die sich in seiner Reichweite befinden, sich in eine Art zweispaltige Liste einzutragen mit dem Namen und den Healthpoints und dann sortiert er die Liste nach der Anzahl der HP und pickt sich den mit den wenigesten/meisten Leben raus. Diesen Gegner speichert er in die Variable target. Dann kann er zB auf den Punkt target.x, target.y schießen.
    UND ich habe ncoh einen Fehler eingebaut, ist oben bereinigt.
    Das grid muss mit -1 gefüllt werden als default wert. Die Gegner tragen sich nur ein, wenn sie zu einer Zeile kommen wo -1 drin steht (sich also hier noch niemand eingetragen hat). Wenn sie am Ende ankommen oder auf den eigenen namen stossen, dann tragen sie sich nicht ein.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)