L'index d'un objet, c'est l'identifiant unique crée par GM quand tu crées un nouvel objet dans le sous dossier des objects. Le premier vaut 0, le second 1, etc... Et si t'en supprime un ça va faire un "trou".
Tu peux obtenir l'ind d'un objet avec son nom tout bêtement.
Par exemple dans un draw affiche: draw_text(x, y, object3) bah t'auras logiquement 3.
Quand tu instancie un objet par contre, ça va générer un id unique, mais unique pour TOUTES les instances.
Donc si tu fais
ins1 = instance_create(x, y, object0)
ins2 = instance_create(x, y, object1)
bah t'auras 100000 et 100001 normalement, mais pas deux valeurs identiques.
Ça te permet donc d'identifier chaque instance comme une entité unique sans jamais confondre avec une autre.
Et a partir de cet id tu peux obtenir des infos sur l'objet, ou même obtenir l'ind de l'object avec ins.object_index.
Quand on change un sprite, généralement on change le sprite de l'instance, changer le sprite de l'objet ça veut pas dire grand chose vu que l'objet est un "moule" qui va servir a créer les instances. Donc si tu changes le sprite d'un objet toutes ses instances futures auront ce sprite.
Si tu changes le sprite d'une instance, ça va changer le sprite que pour cette instance.
D'ailleurs y a une nuance importante entre object et instance, c'est with.
with(object_ind) { foo() } va executer foo() pour toutes les instances de object_ind.
with(instance_id) { bar() } va lancer bar() que pour l'instance passé a with.