• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

GML Game crashes everyonce in a while when resetting it

Artie_Kyle

Member
Hey everyone,

This is an interesting one, mostly because I fail to see the reason it crashes, as I fail to see why the compiler is complaining about the issue.

Basically, I created a sprite_right_ and sprite_left_ variables, and everyone in a while, it says that the object is not assigned with the sprite.

Here's the code:

Code:
// create event

event_inherited();
hp_ = choose(30, 40, 50, 60);
original_hp_ = hp_;
targetx_ = 0;
targety_ = 0;
spd_ = 1;
number_ = random(100);
_image_speed = 0.4;

if number_ >= 0 and number_ <= 33 {   
   sprite_right_ = spr_zombie_walking;
   sprite_left_ = spr_zombie_walking_left;
} else if number_ >= 34 and number_ <= 66 {
   sprite_right_ = spr_zombie2_walking;
   sprite_left_ = spr_zombie2_walking_left;
} else if number_ >= 67 and number_ <= 100 {
   sprite_right_ = spr_zombie3_walking;
   sprite_left_ = spr_zombie3_walking_left;
}

state_ = scr_enemy_wander;

// step event

event_inherited();

if number_ >= 0 and number_ <= 33 {   
   sprite_right_ = spr_zombie_walking;
   sprite_left_ = spr_zombie_walking_left;
   
} else if number_ >= 34 and number_ <= 66 {
   sprite_right_ = spr_zombie2_walking;
   sprite_left_ = spr_zombie2_walking_left;
   
} else if number_ >= 67 and number_ <= 100 {
   sprite_right_ = spr_zombie3_walking;
   sprite_left_ = spr_zombie3_walking_left;   

}

script_execute(state_, obj_dude, sprite_right_, sprite_left_);

if state_ == scr_enemy_idle_state {
   image_speed = 0;
} else {
   image_speed = 0.4;
}

if state_ == scr_enemy_wander {
   if sign(moveX_) >= 0 {
       sprite_index = sprite_right_;
   } else if sign(moveX_) < 0 {
       sprite_index = sprite_left_;
   }
}
The way I see it, the variables should be defined before the game ever calls on them, so the reason for crashing is beyond me.

Here's the compiler error:

Variable obj_zombie.sprite_left_(100206, -2147483648) not set before reading it.
at gml_Object_obj_zombie_Step_0 (line 17) - script_execute(state_, obj_dude, sprite_right_, sprite_left_);
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Object_obj_zombie_Step_0 (line 17)

Your wisdom is very much appreciated. Thanks for your time, folks!
 

TsukaYuriko

☄️
Forum Staff
Moderator
What happens if the number is 33.33? That's neither less than or equal to 33 nor is it greater than or equal to 34.
 

YoSniper

Member
The error happens inside your script_execute script. It says "sprite_left_" is not set before reading, so it looks like your number_ attribute is out of range.

I recommend adding an "else" block to your code so a bad number doesn't crash your game.
 

Artie_Kyle

Member
Good call, but where and what would the else be like in this case?

Also, really like your sprite!

@Yuriko:

I LITERALLY just thought about that issue and then saw your post, where the heck was my logic there!

Thank you so much, will get to tweaking the code there!
 
Last edited:

YoSniper

Member
Here's my edit to your code, also taking into account Tsuka Yuriko's comment:

Code:
if number_ <= 33 {   
   sprite_right_ = spr_zombie_walking;
   sprite_left_ = spr_zombie_walking_left;
} else if number_ <= 66 {
   sprite_right_ = spr_zombie2_walking;
   sprite_left_ = spr_zombie2_walking_left;
} else if number_ <= 100 {
   sprite_right_ = spr_zombie3_walking;
   sprite_left_ = spr_zombie3_walking_left;
} else { //Added catch-all here
    sprite_right_ = spr_zombie_walking; //Default
    sprite_left_ = spr_zombie_walking_left; //Default
}
Hope this helps. And my sprite is from an old game I've been working on for years and have since put on hiatus. It was based on Blast Chamber.
 

TsukaYuriko

☄️
Forum Staff
Moderator
The number you're generating is not guaranteed to be inside of any of the ranges you defined. This applies for any numbers between 33.01 and 33.99 as well as 66.01 and 66.99 (shortened to two digits for simplicity).

You're generating it here:
Code:
number_ = random(100);
Either adapt your if-else chain to account for the missing numbers (">= 34" to "> 33", ">=67" to ">66"), use an approach as suggested by @YoSniper or change random to irandom. The latter would generate a random integer instead, which is what your current code would require to work as expected, as fractions throw it off when near the thresholds of each range.
 

Artie_Kyle

Member
Fixed the issue (did both of Yuriko's pointers to make sure I've covered all the basics).

Thanks so much, Yuriko and YoSniper, problem solved, so on to the next frustrating bit of game development!!
 
Top