AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 cibler un objet avec l'instance

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
tales
Utilisateur confirmé: Rang *


Messages : 239

MessageSujet: cibler un objet avec l'instance   Lun 27 Fév 2017 - 19:10

Bonsoir!

J'ai un objet, que je pose plusieurs fois dans la room, quand le hero passe dessus il change de sprite, mais quand j'appuie sur une touche ça affiche du texte!

Comment je peux faire pour que, selon lequel des objets a changé de sprite, du texte différent s'écrit? Comme les objets sont assez loin, au début je me suis dis, j'ai juste à mettre sur l'objet obj_descriptableau

Code:
if place_meeting(x,y,Hero)
{image_index=1}
else
{image_index=0}

et ça sur un objet DRAW qui va afficher le texte

Code:
if obj_descriptableau.image_index=1 and keyboard_check_released(global.KACTION) and castle01txt=0
{castle01txt=1}
if obj_descriptableau.image_index=1 and keyboard_check_released(global.KACTION) and castle01txt=0
{castle01txt=1}
if castle01txt=1
{draw_sprite(spr_fondtext,0,obj_descriptableau.x+250,obj_descriptableau.y-100)}
(x2 avec castle02txt comme variable pour le deuxième texte)

parce que même si les deux texte s'affichent, ils sont loin donc ça se voit pas.. mais il n'y en a qu'un qui marche, comme si l'objet draw s'arrêtait au premier qu'il trouve.. (plus précisément il n'y a qu'un obj_description qui fonctionne et il affiche les deux textes.. l'autre ne fait rien..)
J'ai les id comme inst_BF545415 des différents objets dans la room, mais je n'arrive pas à les utiliser..
Revenir en haut Aller en bas
Mass
*Excellent utilisateur*
avatar

Messages : 3325
Localisation : Dans une canonnière wookie.
Projet Actuel :
Things


MessageSujet: Re: cibler un objet avec l'instance   Mar 28 Fév 2017 - 4:48

J'ai pas vraiment compris ton problème, mais tes conditions sont pour la plupart inutiles en l'état. Déjà il y a un doublon, ensuite il est inutile de faire une condition qui assigne une variable pour tout de suite après faire une condition exclusivement sur cette variable, vaut mieux condenser les deux.
Peux-tu réexpliquer ton soucis ?

_________________
Revenir en haut Aller en bas
http://madmass.mype.fr/CBNA/
tales
Utilisateur confirmé: Rang *


Messages : 239

MessageSujet: Re: cibler un objet avec l'instance   Mar 28 Fév 2017 - 8:00

Effectivement j'ai écris n'importe quoi........... il y a juste ça je crois (je suis pas chez moi..)

Code:
if obj_descriptableau.image_index=1 and keyboard_check_released(global.KACTION) and castle01txt=0
{castle01txt=1}
if castle01txt=1
{draw_sprite(spr_fondtext,0,obj_descriptableau.x+250,obj_descriptableau.y-100)}

en gros, quand le hero passe sur l'objet il change de sprite et l'objet DRAW (au dessus) écrit le texte et draw un sprite

Déjà pour ta remarque, je dois mieux écrire ça ?

Code:
if obj_descriptableau.image_index=1 and keyboard_check_released(global.KACTION)

{draw_sprite(spr_fondtext,0,obj_descriptableau.x+250,obj_descriptableau.y-100)}

si j'ai rajouté la variable castle01txt=0 c'est pour qu'il repasse à zero et efface le texte quand le hero s'éloigne mais c'est pas vraiment ça mon soucis, c'est bien que j'ai plusieurs fois cet objet obj_descriptableau et j'aimerais que en ciblant son x et y ou en ciblant son instance_id le DRAW dans un autre objet affiche différente chose. Je fais ça simplement pour économiser le nombre d'objet, je pourrais faire plusieurs obj_descrip mais j'ai pas envie d'en avoir 50 différent histoire de pas avoir trop de chose à charger..
Revenir en haut Aller en bas
Mass
*Excellent utilisateur*
avatar

Messages : 3325
Localisation : Dans une canonnière wookie.
Projet Actuel :
Things


MessageSujet: Re: cibler un objet avec l'instance   Ven 3 Mar 2017 - 0:55

Non je comprend mieux ce qui t'a amené à utiliser la variable. En l'état, la première condition devrait plutôt se trouver dans un step. L'event STEP contient le code fonctionnel, l'event DRAW le code qui sert au dessin. Leur fonctionnement est en apparence identique mais en réalité, les STEP de tous les objets sont exécutés avant les DRAW de façon à ce que toute la partie fonctionnelle soit exécutée et que le dessin soit la dernière chose faite.

Ensuite, c'est normal qu'il s'arrête au premier qu'il trouve. Parce que quand tu spécifie le nom de l'objet obj_descriptableau, tu désignes UNE SEULE instance. Laquelle ? Impossible de le savoir en l'état, ce sera probablement l'instance de cet objet avec l'id le plus faible. Il n'est PAS possible de passer à une fonction le nom d'un objet en espérant que ça impacte tous les objets de la room de ce type.

Ca veut dire qu'il faut faire une boucle et se taper toutes les instances de cet objet "à la main", une par une. Dans la doc j'ai trouvé instance_find(obj,n), ça donnerait donc un code comme ça:
Code:

instance_id = -1;
for (i = 0; 1; i+=1) {
   instance_id = instance_find(obj_descriptableau, i);
   if (instance_exists(instance_id)) {
      if (instance_id.image_index == 1 && keyboard_check_released(global.KACTION) && castle01txt == 0)
         castle01txt = 1;
   } else break;
}
J'ai pas fait de GML depuis plusieurs années donc c'est peut-être faux. A propos je remarque un truc, tu fais des conditions avec machin = 1, en théorie c'est une assignation ça ne marche pas, il faut utiliser un opérateur de comparaison, c'est à dire ==. Mais peut-être que game maker le tolère ? (quelle connerie dans ce cas).

Cela étant, cette solution n'est pas forcément élégante. Ne serais-ce pas mieux de faire cette condition dans obj_descriptableau directement ?

_________________
Revenir en haut Aller en bas
http://madmass.mype.fr/CBNA/
tales
Utilisateur confirmé: Rang *


Messages : 239

MessageSujet: Re: cibler un objet avec l'instance   Ven 3 Mar 2017 - 15:43

Merci pour ta réponse!

Petite question, pourquoi tu initialises instance_id à -1?

j'ai rien compris avec leur instance_id... quand tu es sur la room, tu mets le curseur sur un objet il te sort "inst_BF56045046", et quand, le même objet tu mets obj_osef.instance_id = ? il sort que ? = 415 de ce que j'ai compris c'est le numéro de l'objet qui a été créé, mais c'est dommage que les deux dénominations ne concordent pas....

tu es sur de la boucle
for (i = 0; 1; i+=1)?
il faut pas plutôt que je mette X à la place du ;1; où X est le nombre total d'instance de l'objet?

pour le == on m'a dit "c'est mieux de mettre ==" la vérité c'est que apparemment le GML s'en tape qu'on mette = ou ==, pour lui c'est pareil.. tu peux faire toutes les fonctions que tu veux avec ==, si tu mets =, ça changera rien du tout.. du moins de ce que j'ai vu ^^ du coup je met = vu que ça change rien du tout.
Revenir en haut Aller en bas
Mass
*Excellent utilisateur*
avatar

Messages : 3325
Localisation : Dans une canonnière wookie.
Projet Actuel :
Things


MessageSujet: Re: cibler un objet avec l'instance   Sam 4 Mar 2017 - 9:19

Je te conseille de mettre == car utiliser = dans une condition n'a aucun sens. = est une assignation: on attribue une valeur à une variable. == est un opérateur logique: il compare deux éléments. GM ne fait pas de différence mais il est à peu près le seul à le faire, n'importe quel langage digne de ce nom fait une différence entre = et == (et même === pour certains langages de script).

Dans la boucle for, on aurait pu effectivement mettre le nombre d'instances à la place du 1. Mais comment on connaît le nombre d'instances ? Soit a) une fonction permet de le faire, auquel cas il faut l'appeler; soit b) aucune fonction ne permet de le faire, et il faut se débrouiller. En l'occurrence j'ai eu la flemme de chercher si une telle fonction existait, surtout que ce n'est pas nécessaire puisque instance_find renvoie "noone" (équivalent à NULL) lorsqu'il a atteint la dernière instance. Du coup, instance_exists renverra zéro pour l'instance "noone", le else s'exécutera et ce n'est rien d'autre qu'un break, c'est à dire une instruction de sortie de la boucle. Le comportement de l'ensemble, au final, reste le même.

J'ai mis instance_id à -1 parce que -1 est inutilisé dans le système d'instances de game maker. L'idée est qu'il peut y avoir une instance d'ID 0. S'il y avait une erreur de traitement (normalement pas possible ici, mais sait-on jamais), si on avait initialisé la variable à 0, on ne pourrait pas faire la différence entre l'objet 0 et une erreur. Donc si instance_find déconne (ce qui ne peut pas arriver dans ce cas là, mais dans d'autres situations c'est possible), passer une instance_id de -1 à instance_exists est invalide et donc renverra 0. Ce qui limite les dégâts.
En outre, on peut vérifier la cohérence d'une donnée avec un if; if variable vaut 1 si variable est > 0, et if vaut 0 si variable <= 0. Lorsqu'on fait des traitements dont on n'est pas sûr de la fiabilité en sortie, il suffit de faire un if après le traitement et voir s'il a bien fonctionné ou si la variable a toujours une valeur aberrante.

_________________
Revenir en haut Aller en bas
http://madmass.mype.fr/CBNA/
tales
Utilisateur confirmé: Rang *


Messages : 239

MessageSujet: Re: cibler un objet avec l'instance   Mer 19 Avr 2017 - 20:18

Hello!

EDIT: OUF j'ai trouvé la bonne écriture!...
Code:

   var i;
   for (i = 0; i < instance_number(obj_cardwarblock01); i += 1)
   {
         scrpt_callcarddetail(instance_find(obj_cardwarblock01,i),global.cardwarblock01,01)  
   }  

Merci pour votre aide! Smile
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: cibler un objet avec l'instance   

Revenir en haut Aller en bas
 
cibler un objet avec l'instance
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» recherche émission tv/vivre avec 100 objets
» jeux avec les bébés et les enfants (post collectif)
» TUTO POUR SCINTILLEMENT AVEC PHOTOFILTRE
» rapport d'objet
» Poussette avec landau pour campagne

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: