Nederlandse Game Maker Community

Werken met Game Maker => Beginners => Topic gestart door: Piet Piraat op 23 December 2019, 12:51:35



Titel: iets met een ds_list [Onoplosbaar]
Bericht door: Piet Piraat op 23 December 2019, 12:51:35
Hallo

Iemand hielp mij met een gevechtsysteem. Helaas heeft het een fout en ik kan het niet vinden en die persoon die mij hielp kan ik niet meer bereiken.

Het gaat om het volgende, ik heb een aantal instances die om beurten een aanval doen. Er zijn hero instances en 1 vijand obj met meerdere instances.

Elke hero instance en vijand instance krijgt een priority nummer. Zo krijgen de vijand instances 1, 3, 5 enz, en de hero instances 2, 4, 6, 8 enz.

Ik heb in een controller, als de room start deze code staan:

GML:
global.battle_queue = ds_priority_create();

global.hero_list = ds_list_create();

global.enemy_list = ds_list_create();

Nu heb ik in een alarm deze code staan:

GML:
if (ds_priority_size(global.battle_queue) > 0)
{
next_combatant = ds_priority_delete_min(global.battle_queue);
next_combatant.attack = true;
}
else
{
//Check the priority queue still exists
if (ds_exists(global.battle_queue, ds_type_priority) ) ds_priority_clear(global.battle_queue);
else global.battle_queue = ds_priority_create();

with obj_battle_objects
{
ds_priority_add(global.battle_queue, id, priority) //agility would be the priority of the object that gets added and whoever had the highest agility could go first
}

   next_combatant = ds_priority_delete_min(global.battle_queue);
   next_combatant.attack = true;
}

Als de code voor de strijd is afgelopen, dan start dat alarm en kijkt hij naar de volgende instance die aan de beurt is waarna de volgende instance weer een strijd levert. De strijd is een enkele slag met een wapen. Dus ombeurten doen de vijanden en heroes een slag totdat iemand dood is en zijn instance word gedstroyed.

Voor de heroes staat deze code in een script, omdat die dan maar 1 keer hoeft te worden getypt.

script voor de heroes:

GML:
if attack = true
{
ds_list_shuffle(global.enemy_list);
defender = global.enemy_list[| 0];

a_stats[hero_stats.strike] = a_stats[hero_stats.level] * 10 - (defender.a_stats[hero_stats.armour] + defender.a_stats[hero_stats.defense]);

if (a_stats[hero_stats.strike] <= ( (a_stats[hero_stats.level] * 2) - (defender.a_stats[hero_stats.armour] + defender.a_stats[hero_stats.defense]) ) ){
a_stats[hero_stats.strike] = (10 * irandom(a_stats[hero_stats.level]));
}

var damage = random_range(a_stats[hero_stats.strike]*0.25, a_stats[hero_stats.strike]);

axe = instance_create_depth(defender.x, defender.y, -120, obj_barbarian_hit_enemy);

hit = choose(true, true, true, false, false);

if hit = false
{
audio_play_sound(sound_sword_miss, false, 0);
}
if (hit == true)
{
audio_play_sound(sound_sword_hit, false, 0);
defender.a_stats[hero_stats.life] -= damage;
}

if defender.a_stats[hero_stats.life] < 1
{

ds_list_delete(global.enemy_list, defender);

if a_stats[hero_stats.xp] >= (a_stats[hero_stats.level]*10)+(sqr(a_stats[hero_stats.level])*5)
{
for (var i = hero_stats.level; i <= hero_stats.dexterity; i ++)
{
a_stats[i] += 1;
}
a_stats[hero_stats.life] += 10
a_stats[hero_stats.max_life] = a_stats[hero_stats.life]
a_stats[hero_stats.xp] = 0
}
a_stats[hero_stats.xp] += defender.a_stats[hero_stats.level]*a_stats[hero_stats.constitution]*global.dungeon_level
a_stats[hero_stats.gold] = defender.a_stats[hero_stats.level] * 5



if (ds_list_size(global.enemy_list) <= 0)
{
with obj_battle_objects
{
for (var i = 0; i < hero_stats.last; i ++)
{
global.hero_array[hero_index, i] = a_stats[i];
}
}
}
instance_destroy(defender);
}

obj_controller_vars.alarm[1]=40

attack = false
}

In het step event van de vijand staat dezelfde code alleen aangepast voor de vijand:

GML:
if attack = true
{
ds_list_shuffle(global.hero_list);

defender = global.hero_list[| 0];

a_stats[hero_stats.strike] = a_stats[hero_stats.level] * 10 - (defender.a_stats[hero_stats.armour] + defender.a_stats[hero_stats.defense]);

if (a_stats[hero_stats.strike] <= ( (a_stats[hero_stats.level] * 2) - (defender.a_stats[hero_stats.armour] + defender.a_stats[hero_stats.defense]) ) ){
a_stats[hero_stats.strike] = (10 * irandom(a_stats[hero_stats.level]));
}

var damage = random_range(a_stats[hero_stats.strike]*0.25, a_stats[hero_stats.strike]);

axe = instance_create_depth(defender.x, defender.y, -120, obj_barbarian_hit_enemy);



hit = choose(true, true, true, false, false);

if hit = false
{
audio_play_sound(sound_sword_miss, false, 0);
}

if (hit == true)
{
audio_play_sound(sound_sword_hit, false, 0);
defender.a_stats[hero_stats.life] -= damage;
}

if defender.a_stats[hero_stats.life] < 1
{

ds_list_delete(global.hero_list, defender);
if (ds_list_size(global.hero_list) <= 0)
{
//all the heroes died so do something?
}
instance_destroy(defender);
}

obj_controller_vars.alarm[1]=40

attack = false
}

Als nu een instance wordt destroyed gaat de code nog door totdat de instance die aan de beurt is, die inmiddels destroyed is, weer aan de beurt is en dan komt de error omdat die instance er niet meer is.

Wat ik ervan begijp is dat deze code:

GML:
ds_list_delete(global.hero_list, defender);

de instance verwijdert van de list omdat die destroyed is.

Maar toch krijg ik die error.

GML:
############################################################################################
FATAL ERROR in
action number 1
of Alarm Event for alarm 1
for object obj_controller_vars:

Unable to find any instance for object index '101750'
 at gml_Object_obj_controller_vars_Alarm_1 (line 7) -               next_combatant.attack = true;
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Object_obj_controller_vars_Alarm_1 (line 7)

Hieronder een gif hoe het eruit ziet.

(https://i.gyazo.com/4233a8bbf49956e17656283ef68b8ee0.gif)

Weet iemand hoe ik dit op kan lossen? Ik begrijp het geheel maar gedeeltelijk, helaas.



Titel: Re: iets met een ds_list
Bericht door: smoothcriminal op 2 Maart 2020, 23:22:25
Je probeert iets te gebruiken dat niet meer bestaat, natuurlijk krijg je dan een error wat is precies het probleem?


Titel: Re: iets met een ds_list
Bericht door: Piet Piraat op 3 April 2020, 08:33:15
Hoi smoothcriminal

Er zijn meerdere problemen met die code. Ik heb het dus opgegeven.


www.game-maker.nl © 2003, 2007 Nederlandse Game Maker Community