AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 [FAQ] Instances

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
onilink_
Modérateur
avatar

Messages : 8915
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: [FAQ] Instances   Dim 8 Mar 2015 - 11:10


  • Qu'est ce qu'une instance, qu'est ce qu'un object, quelle est la différence entre instance et object?
  • J'ai trop d'instances en jeu, cela le fait ralentir. Comment y remédier?
  • J'ai beaucoup d'objets en jeu et je voudrais qu'ils s'affichent dans le bon ordre.
  • Pendant un event de collision, je veux savoir quelle instance est entrée en collision avec celle ci.
  • Je veux récupérer l'instance qui touche mon objet, comment faire?
  • Je veux déplacer mon objet case par case, comment faire?
  • Comment trouver l'instance la plus proche de mon objet?
  • Je veux lier une instance a mon objet, comment faire?
  • Je veux faire tirer un enemi, ou le joueur, comment m'y prendre?
  • A quoi sert un objet parent?
  • Y a-t-il d'autre choses dont les objets enfants héritent du parent?





Q: Qu'est ce qu'une instance, qu'est ce qu'un object, quelle est la différence entre instance et object?

R:Un object est une espèce de moule qui servira a créer des instance (on dit instancier) sur son modèle. Chaque instance sera unique, mais aura comme base commune avec les autres instances du même object les variables et scripts qu'elle contient. Par contre les variables locales pourront avoir des valeurs différentes d'une instance a l'autre.

>Chaque instance possède un x et y différent, peut avoir un image_speed ou sprite_index unique, et de même pour chaque variable locale.

Un object peut être identifié par son IND, une instance par son ID.
L'index d'un object, c'est l'identifiant unique crée par GM quand on crée un nouvel object dans le sous dossier approprié.
Le premier vaut 0, le second 1, etc... Et si on en supprime un ça va faire un "trou".
On peut obtenir l'IND d'un objet avec son nom tout bêtement.

Par exemple dans un draw:
Code:
draw_text(x, y, object3)
affichera généralement 3.

Quand on instancie un object par contre, ça va générer un id unique, mais unique pour TOUTES les instances.
Donc
Code:
ins1 = instance_create(x, y, object0)
ins2 = instance_create(x, y, object1)
pourra donner 100000 et 100001, mais pas deux valeurs identiques.

Ça permet donc d'identifier chaque instance comme une entité unique sans jamais la confondre avec une autre.
Et a partir de cet id on peut obtenir des infos sur l'object, ou même obtenir l'ind de l'object avec my_instance.object_index.

Il 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.




Q: J'ai trop d'instances en jeu, cela le fait ralentir. Comment y remédier?
R1: Il faut désactiver les instances inutiles, généralement celles qui sont hors view
Code:
instance_activate_all();
instance_deactivate_region(view_xview[0],view_yview[0],view_wview[0],view_hview[0],false,true);
Attention cependant a réactiver vos instances sans masques, comme celles utilisées pour la GUI.
R2: Il se peut que vous modifiez la depth de vos objets chaque frame.
Cela n'est pas du tout apprécié par GM, qui a chaque modification de depth, fait un tri par insertion pour placer la nouvelle valeur.
On arrive très vite a une demande en performances absolument énorme, pour 3x rien...
Ne modifiez la depth d'un objet que quand cela est nécessaire, et ne le faite pas chaque step si possible.




Q: J'ai beaucoup d'objets en jeu et je voudrais qu'ils s'affichent dans le bon ordre.
R: Pour cela, il faut modifier la depth de l'objet. Une depth minimale correspond a une priorité d'affichage maximale.
Sujets similaires:
http://cbna.forumactif.com/t12920-resolu-demande-d-aide-avec-les-depth
http://cbna.forumactif.com/t12536-resolu-probleme-depth-collision




Q: Pendant un event de collision, je veux savoir quelle instance est entrée en collision avec celle ci.
R: L'id de l'instance en collision est donné par 'other' (uniquement valable pour l'event de collision).
Sujets similaires:
http://cbna.forumactif.com/t13089-son-rebond




Q: Je veux récupérer l'instance qui touche mon objet, comment faire?
R: Il faut récupérer l'id de l'instance en collision avec l'objet, avec la fonction instance_place:
Code:
ii = instance_place(x, y, object)
if(ii != noone) {
    // utiliser ii, l'id de l'instance trouvée
}




Q: Je veux déplacer mon objet case par case, comment faire?
R: Voici la façon de faire pour des cases de 16x16 pixels:
#create
Code:
dir = 0
moving = false

key[0] = vk_right
key[1] = vk_up
key[2] = vk_left
key[3] = vk_down

lx[0] = 1
lx[1] = 0
lx[2] = -1
lx[3] = 0
ly[0] = 0
ly[1] = -1
ly[2] = 0
ly[3] = 1

#step
Code:
if(place_snapped(16, 16))
    moving = false

for(i=0; i<4; i+=1) {
    if(!moving && keyboard_check(key[i]))
    {
        dir = i
        moving = true
    }
}

if(moving) {
    if(place_free(x+lx[dir], y+ly[dir]))
    {
        x += lx[dir]
        y += ly[dir]
    }
    else
    moving = false
}
Sujets similaires:
http://cbna.forumactif.com/t12913-deplacement-en-suivant-les-cases




Q: Comment trouver l'instance la plus proche de mon objet?
R: Pour cela, il suffit d'utiliser instance_nearest, qui retourne l'id de l'instance.
Dans le cas ou il faudrait le faire manuellement (comparaison d'une certaine variable de chaque instance par exemple):
Code:
d = 99999
find = noone
for(i=0; i<instance_number(object); i++)
{
  ii = instance_find(object, i)
  t = point_distance(x, y, ii.x, ii.y)
  if(t < d) {
    d = t
    find = ii
  }
}
Sujets similaires:
http://cbna.forumactif.com/t12633-instance_nearest-point_nearest




Q: Je veux lier une instance a mon objet, comment faire?
R: Pour cela, il faut la créer depuis le create event, mais surtout penser a récupérer son id lors de la creation.
Vous pourrez ensuite utiliser cette variable comme l'id de l'object lié:
Code:
linked = instance_create(x, y, object)
Sujets similaires:
http://cbna.forumactif.com/t13088-aide-jeux-vaisseau-spatial




Q: Je veux faire tirer un enemi, ou le joueur, comment m'y prendre?
R: Tirer correspond juste a créer une instance d'un objet que vous aurez définis comme bullet.
Donc, si vous voulez faire tirer une enemi, vous n'avez qu'a créer l'instance BulletEnemy, et dans votre
objet qui doit tirer, vous l'instanciez:
Code:
instance_create(x, y, BulletEnemy)
Vous pouvez aussi lui donner une direction et une vitesse dès sa creation:
Code:
ii = instance_create(x, y, BulletEnemy)
ii.speed = 2
ii.direction = point_direction(x, y, Player.x, Player.y)[/code]
Sujets similaires:
http://cbna.forumactif.com/t13090-ennemis-qui-tire




Q: A quoi sert un objet parent?
R: Un objet parent partage ses propriétées avec ses enfants. Si vous avez écris du code dans un de ces events, il sera virtuellement "copié collé" chez tous les enfants, sauf si l'event contiens déjà du code.
Dans ce cas, si vous voulez quand même appliquer l'héritage du parent, il faudra appeller la fonction event_inherited().




Q: Y a-t-il d'autre choses dont les objets enfants héritent du parent?
R: Oui, l'object_index de tout enfant sera aussi considéré comme égal a celui du parent.
Par exemple, si vous avez l'objet parent WallParent, qui a pour enfant Wall1, Wall2, Wall3... et que vous utilisez la fonction place_meeting(x, y, WallParent), elle testera la fonction sur tous les enfants de WallParent.
Sujets similaires:
http://cbna.forumactif.com/t13048-resolu-verification-de-presence-d-objets-enfants

_________________
                 


Dernière édition par onilink_ le Mar 1 Mar 2016 - 13:13, édité 5 fois
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8915
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [FAQ] Instances   Mar 1 Mar 2016 - 13:14

Je viens de 'finir' cette petite FAQ sur les instances que j'avais commencé y a longtemps, s'il manque quelque chose n'hésitez pas a me le faire savoir.
Si quelqu'un pose une question dont la réponse est dans cette FAQ, redirigez le directement ici.

_________________
                 
Revenir en haut Aller en bas
 
[FAQ] Instances
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Entraide débutants-
Sauter vers: