2016-12-15 2 views
0

Das Problem mit meinem Code tritt auf, wenn ich versuche, eine ds-Liste für alle meine Ziele zu verwenden. Es scheint, als würde es nichts registrieren, ich weiß nicht, was ich falsch mache, ich habe alles versucht, was ich weiß. Wenn ich die Werte für die DS-Liste anzeigen, ist es immer 0, auch wenn die Kollisions-ID, die ich in die Liste eingetragen habe, einen Wert hat. auch die Kollisions-ID ist standardmäßig auf -4 gesetzt, wenn sie aus irgendeinem Grund nicht mit irgendetwas kollidiert.ds_list Funktioniert nicht in Game Maker Studio

Hier ist der Code, der den Wert der ds-Liste zuweist.

Hier ist der Code, den ich versuche, die ds-Liste in der Dosis nichts zu verwenden.

var i 
for (i = 0; i < ds_list_size(collision_list) + 1; i++){ 
    target_test = ds_list_find_value(collision_list, i); 
if (instance_exists(target_test) and (rectangle_in_circle(target_test.x - 7, target_test.y - 7, target_test.x + 7, target_test.y + 7, x, y, tower_range) > 0)) 
    { 
     target = ds_list_find_value(collision_list, i); 
     target.show_hp_bar = true; 
     target.path_speed = target.path_speed * ((100 - slow)/100) 
     show_debug_message(other.target); 
    }else{ 
     target.path_speed = target.start_speed; 
     ds_list_delete(collision_list, i); 
    } 
} 

Ich kann diesen Code wegen der ds-Liste, die nichts enthält, nicht ausführen. Wie ich bereits sagte, gibt "current_coli" die ID des Objekts an, speichert sie aber aus irgendeinem Grund nicht in der ds-Liste, "target_test" ist immer unidentifiziert und die ds-Liste "collision_list" ist immer 0. Der Code ist innerhalb eines Objektschritt-Ereignisses, das einen stationären Ort auf der Karte hat und den Effekt auf ein feindliches Objekt anwendet, das sich innerhalb seines Kollisionsradius befindet.

Antwort

0

Das ist falsch:

//get all enemys in area 
current_coli = collision_circle(x, y, tower_range, obj_enemys, 0, 1); 
if (current_coli != noone){ 
    ds_list_add(collision_list, current_coli); 
} 

collision_circle gibt nur eine (mindestens) ID nicht alle IDs.

with obj_enemys 
{ 
    if point_distance(x, y, other.x, other.y) < other.tower_range 
    { 
     ds_list_add(other.collision_list, id); 
    } 
} 

Und

var i 
for (i = 0; i < ds_list_size(collision_list) + 1; i++) 

auch falsch: Sie können so etwas wie dies zu tun. Rechts:

for (var i=0; i<ds_list_size(collision_list); i++) 
  1. Sie var innerhalb for schreiben kann.

  2. Sie brauchen nicht +1.

Eine weitere Sache. Wenn Sie

ds_list_delete(collision_list, i); 

tun ändert es Daten und bricht Ihrer for Schleife. Zum Beispiel können Sie i nach dem Löschen verringern.

ds_list_delete(collision_list, i); 
i--; 

oder gleiche in einer Zeile

ds_list_delete(collision_list, i--); 
+0

Vielen Dank für Ihre Antwort! Ich verstehe, ich dachte, mit Obj {} zu tun, aber ich dachte, es würde keinen Unterschied machen. Und ich dachte auch, dass es falsch sein könnte, das in die for-Schleife zu schreiben, aber ich habe nicht so viel Erfahrung mit for-Schleifen, also wusste ich nicht wirklich. Danke trotzdem für die Hilfe! Probier es gleich mal aus! –

+0

Okay, es funktioniert jetzt, aber jetzt tritt ein anderes Problem auf, die For-Schleife verlangsamt das Spiel dramatisch, es ist wirklich bemerkenswert, also hast du irgendwelche anderen Ideen, die die CPU nicht so stark belasten könnten? –

+0

nvm löste es, es war, weil es die gleichen Augenblicke des Objekts infeetly hinzufügte, die die for-Schleife größer und größer machten, solange etwas innerhalb des Radius war. –

Verwandte Themen