TD multi target

  • GM 7

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

  • TD multi target

    Hallo ... ich beschäftige mich erst seit kurzem mit dem GM7 (noch nutze ich GM7lite) dennoch komme ich gut vorran XD
    ich wollte ein Tower defence(TD) game erstellen dies klappt recht gut doch bekam ich von freunden den wunsch "mach doch ein turm der auf mehrere gleichzeitig schießt"
    nun zu meinem problem:
    Wie kann ich das realisieren das ein turm 3 targets hat und auf alle gleichzeitig schießt
    ich habe es bis jetzt so versucht

    Quellcode

    1. if target1 = noone{
    2. target1 = instance_nearest(x,y,ob_enemy);
    3. }
    4. if target2 = noone{
    5. target2 = instance_nearest(target1.x,target1.y,ob_enemy);
    6. }
    7. if target3 = noone{
    8. target3 = instance_nearest(target2.x,target2.y,ob_enemy);
    9. }

    problem daran ist ... das ob_enemy was dem target1 am nächsten ist ,ist es selber ergo schießt der 3* auf ein ziel
    danke im vorraus
    MFG
    ---- wer fehler findet darf sie behalten ---

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

  • Wenn du etwas kompliziertere Anvisierungsmechanismen haben willst, kannst du diese schön schnelle Funktion leider nicht mehr ohne weiteres benutzen.

    Du könntest aber ein bisschen Rumtricksen. Ich habs nicht getestet, aber das hier sollte funktionieren:

    GML-Quellcode

    1. var a, b, c;
    2. a = instance_nearest(x,y,ob_enemy);
    3. instance_deactivate_object(a);
    4. b = instance_nearest(x,y,ob_enemy);
    5. instance_deactivate_object(b);
    6. c = instance_nearest(x,y,ob_enemy);
    7. instance_activate_object(a);
    8. instance_activate_object(b);
    9. /* Mach hier deinen Kram mit a, b und c.
    10. Unter Umständen willst du die nicht nur lokal für den einen Step haben,
    11. dann muss die 1. Zeile weg.
    12. Ist vermutlich eh sinnvoller, die Variablen zu behalten,
    13. leistungstechnisch gesehen.*/
    Alles anzeigen

    Du deaktivierst einfach die bereits erhaltenen Instanzen und führst die gleiche Funktion nochmal aus. Dabei sollte er die deaktivierten nun ignorieren. Damit der Spielablauf dabei nciht gestört wird, aktivieren wir die Dinger direkt wieder.
  • createevent:

    GML-Quellcode

    1. target1=0
    2. target2=0
    3. target3=0
    4. map=ds_map_create()


    stepevent:

    GML-Quellcode

    1. var i,inst,key1,key2,key3;
    2. for(i=0;i<instance_number(enemy);i+=1)
    3. {
    4. inst=instance_find(enemy,i)
    5. ds_map_add(map,point_distance(x,y,inst.x,inst.y),inst)
    6. }
    7. key1=ds_map_find_first(map)
    8. key2=ds_map_find_next(map,key1)
    9. key3=ds_map_find_next(map,key2)
    10. target1=ds_map_find_value(map,key1)
    11. target2=ds_map_find_value(map,key2)
    12. target3=ds_map_find_value(map,key3)
    13. ds_map_clear(map)
    Alles anzeigen


    Erläuterung:
    Es wird eine map erstellt. In jedem Step werden alle instanzen des objektes enemy durchlaufen und auf Entfernung geprüft.
    Die id der instanz und die jeweilige Entfernung werden in der map gespeichert, die selbstständig die Einträge sortiert (nach größe des Keys - in diesem Fall der Entfernung).
    Dann werden die ersten 3 Schlüssel, folgend die ersten 3 ids rausgesucht und in target1, target2 und target3 gespeichert.
  • Wenn schon data structures, dann vielleicht eher eine priority list (hab die Funktionen dazu aber grad nicht im Kopf).

    Sollte für sowas aber zu langsam sein, abgesehen davon hat Deathshadow noch den Lite. ;)

    Nichtsdestotrotz sieht sowas natürlich professioneller aus. Leider interessiert das den GM oft nicht. :P
  • danke erstmal für die vielen antworten XD .... aber bei der variante mit der map bekomm ich die meldung das es nur in der pro geht und bei der variante mit dem deactivieren bekomm ich die meldung

    Quellcode

    1. ERROR in
    2. action number 7
    3. of Step Event
    4. for object ob_tower_multi:
    5. Error in code at line 47:
    6. if point_distance(x,y,target2.x,target2.y) > range{target2 = noone; }at position 33: Unknown variable x

    hier mal da komplette script mal sehen ob es weiter hilft ^^
    im create

    GML-Quellcode

    1. {
    2. firing1 = 0;
    3. firing2 = 0;
    4. firing3 = 0;
    5. target1 = noone;
    6. target2 = noone;
    7. target3 = noone;
    8. name = 'Multi';
    9. rate = 1;
    10. damage = 20;
    11. price = 100;
    12. range = 150;
    13. }
    Alles anzeigen

    im step

    GML-Quellcode

    1. //prüft ob gegner in nähe
    2. {
    3. var ii1, dist1, xx1, yy1;
    4. var ii2, dist2, xx2, yy2;
    5. var ii3, dist3, xx3, yy3;
    6. if firing1 > 0 firing1 += 1;
    7. if firing2 > 0 firing2 += 1;
    8. if firing3 > 0 firing3 += 1;
    9. if firing1 >= 30/rate firing1 = 0;
    10. if firing2 >= 30/rate firing2 = 0;
    11. if firing3 >= 30/rate firing3 = 0;
    12. if not instance_exists(target1) target1 = noone;
    13. if not instance_exists(target2) target2 = noone;
    14. if not instance_exists(target3) target3 = noone;
    15. if instance_exists(ob_enemy)
    16. {
    17. target1 = instance_nearest(x,y,ob_enemy);
    18. instance_deactivate_object(target1);
    19. target2 = instance_nearest(x,y,ob_enemy);
    20. instance_deactivate_object(target2);
    21. target3 = instance_nearest(x,y,ob_enemy);
    22. instance_activate_object(target1);
    23. instance_activate_object(target2);
    24. if point_distance(x,y,target1.x,target1.y) > range{target1 = noone;}
    25. else if firing1 = 0
    26. {
    27. firing1 = 1;
    28. //Create a bullet (target1)
    29. ii1 = instance_create(x,y,ob_bullet_multi);
    30. dist1 = point_distance(x,y,target1.x,target1.y)/24;
    31. xx1 = target1.x+target1.path_speed*dist1*cos(target1.direction*pi/180);
    32. yy1 = target1.y-target1.path_speed*dist1*sin(target1.direction*pi/180);
    33. ii1.speed = 24;
    34. ii1.direction = point_direction(x,y,xx1,yy1);
    35. ii1.damage = damage;
    36. }
    37. if point_distance(x,y,target2.x,target2.y) > range{target2 = noone; }
    38. else if firing2 = 0
    39. {
    40. firing2 = 1;
    41. //Create a bullet(target2)
    42. ii2 = instance_create(x,y,ob_bullet_multi);
    43. dist2 = point_distance(x,y,target2.x,target2.y)/24;
    44. xx2 = target2.x+target2.path_speed*dist2*cos(target2.direction*pi/180);
    45. yy2 = target2.y-target2.path_speed*dist2*sin(target2.direction*pi/180);
    46. ii2.speed = 24;
    47. ii2.direction = point_direction(x,y,xx2,yy2);
    48. ii2.damage = damage;
    49. }
    50. if point_distance(x,y,target3.x,target3.y) > range{target3 = noone;}
    51. else if firing3 = 0
    52. {
    53. firing3 = 1;
    54. //Create a bullet (target3)
    55. ii3 = instance_create(x,y,ob_bullet_multi);
    56. dist3 = point_distance(x,y,target3.x,target3.y)/24;
    57. xx3 = target3.x+target3.path_speed*dist3*cos(target3.direction*pi/180);
    58. yy3 = target3.y-target3.path_speed*dist3*sin(target3.direction*pi/180);
    59. ii3.speed = 24;
    60. ii3.direction = point_direction(x,y,xx3,yy3);
    61. ii3.damage = damage;
    62. }
    63. }
    Alles anzeigen

    mfg
    der death
    ---- wer fehler findet darf sie behalten ---
  • Mach die Überprüfung, bevor du weitere Instanzen deaktivierst:

    GML-Quellcode

    1. target1 = instance_nearest(x,y,ob_enemy);
    2. if (target1 != noone) {
    3. instance_deactivate_object(target1);
    4. target2 = instance_nearest(x,y,ob_enemy);
    5. if (target2 != noone) {
    6. instance_deactivate_object(target2);
    7. target3 = instance_nearest(x,y,ob_enemy);
    8. instance_activate_object(target2);
    9. }
    10. else {
    11. target3 = noone;
    12. }
    13. instance_activate_object(target1);
    14. }
    15. else {
    16. target2 = noone;
    17. target3 = noone;
    18. }
    Alles anzeigen

    instance_nearest gibt noone bereits zurück. Script ist ungetestet, sollte aber so gehen. Du solltest natürlich den point_distance-Kram nur dann machen, wenn das entsprechende target existiert.

    Edit: Noch else-cases ergänzt.