AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 Problème animation, liaison entre différents objets.

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Ahamka
Pas mal


Messages : 38

MessageSujet: Problème animation, liaison entre différents objets.    Jeu 10 Oct 2013 - 15:04

Bonjour.

J'ai deux petits problèmes que je ne sais pas par où résoudre.

Pour remettre dans la situation, dans mon jeu, il y a un distributeur de biberon. Quand le joueur appuie sur le bouton, il perd de l'argent et un biberon sort du distributeur. Mais le joueur peut aussi upgrader son distributeur (je détruis le premier distributeur et le remplace par un nouveau) et ainsi avoir des biberons plus perforant.


Mon premier problème est que l'animation d'ouverture du distributeur ne se réalise que sur le distributeur présent de base dans le base et non dans les suivant. Aussi, l'animation ne se fait qu'une seule fois. Les autres fois, le biberon se créé bien et l'argent est retiré, mais il n'y a plus d'animation.

Voici mon code présent sur l'object bouton du distributeur spécifique et dans l'event Left Button :

Code:
with (Distributeur_Animation){
if mouse_check_button_pressed(mb_left)
{
if Var_Gold.Gold >= 50
{
image_speed=0.3;
Var_Gold.Gold -= 50;
instance_create(810,357,Biberon);
}
else{
show_message("you do not have enough gold to buy this item =D");
}
}
}
Et le code présent sur l'object Distributeur_Animation, dans l'event End Animation. (le code en commentaire, c'est parce que j'ai tenté de faire que le biberon apparaisse à l'image 5, mais ca marche pas Sad)

Code:
if (sprite_index == Distributeur_animation) {
image_index = 7;
image_speed = 0;
}

//if (image_index = 5) instance_create(810,357,Biberon);

Mon deuxième problème est relatif à la création des biberon. Malgré que le code de la création de l'instance Biberon est dans l'event Left Button, j'ai rajouté la ligne "if mouse_check_button_pressed(mb_left)", car sans ça, quand je clic sur le bouton, le jeu me créé autant de biberon que j'ai d'argent disponible. Ce code marche bien pour le distributeur déjà de base dans le jeu, mais dans les upgrade, alors que j'ai copié exactement le même code, quand je clic surle bouton, ca me créé des 10aine de Biberon au lieu d'un seul.

J'ai essayé de réglé le problème en créant un Biberon lorsque l'animation arrive à une image donné, mais vu que pour l'instant c'est bugué Sad

_________________
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1608
Localisation : Montpellier

MessageSujet: Re: Problème animation, liaison entre différents objets.    Jeu 10 Oct 2013 - 15:31

C'est un peu chasser un moustique avec un lance-roquettes, mais c'est un bon conseil pour programmer en objet : ne pas multiplier les objets similaires. Par exemple tes distributeurs upgradés sont quand même des distributeurs, par conséquent ce devraient être le même objet que le distributeur de base. Il suffit d'ajouter une variable qui conserve le niveau d'upgrade, et de changer de sprite en conséquence.

Pour le problème de biberons en rafale : il y a un event Left Button Pressed (ou un truc du genre), qui ne s'actionne qu'une fois par clic (comme la fonction du même nom que tu utilises).

Pour le if(image_index == 5), c'est plus subtil.
image_index n'est pas un entier mais un double, un nombre à virgule quoi. Or, ta vitesse d'animation étant 0.3, et 0.3 n'étant pas un diviseur de 5, tu ne tombes jamais exactement sur 5, donc ta condition n'est jamais vraie.
Note aussi que mettre ce code dans Animation End est insensé : d'après ton code, je suppose que ton sprite a au moins 7 frames, donc impossible d'entrer dans l'event avec image_index aux alentours de 5...
Pour résoudre ça, le plus propre je pense est d'utiliser une alarme. En règle générale c'est une mauvaise idée d'utiliser l'aspect graphique d'un objet comme condition d'exécution, il vaut mieux au contraire séparer totalement graphismes et code.

Conseil supplémentaire, valable pour tous les langages : ne jamais tester l'égalité avec un flottant (ou double), excepté si celui-ci s'est vu assigner explicitement la valeur que tu veux tester.
Dans le cas particulier de GM, l'égalité implémentant en fait une petite marge d'erreur, il est possible de faire quelques petits calculs entiers sans trop de risque, mais pas plus.
Code:

var i = 10; //Assignation explicite

if(i == 10) {
    // Test avec ce qu'on a assigné : pas de problème
}

// Code qui semble ne rien faire
i /= 3;
i *= 3;

if(i == 10) {
    // Pas sûr que ce code soit exécuté si i a trop perdu en précision !
}

// Encore un code qui semble ne rien faire
i += power(10, 300);
i -= power(10, 300);

if(i == 10) {
    // Quasiment certain que ce code ne sera pas exécuté.
}

if(i == 0) {
    // Et lui va peut-être être exécuté !
}

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Ahamka
Pas mal


Messages : 38

MessageSujet: Re: Problème animation, liaison entre différents objets.    Jeu 10 Oct 2013 - 16:03

D'accord, merci pour tes explications, j'ai compris le truc. Je vais tenter de les mettre en application maintenant !

_________________
Revenir en haut Aller en bas
Ahamka
Pas mal


Messages : 38

MessageSujet: Re: Problème animation, liaison entre différents objets.    Jeu 10 Oct 2013 - 18:11

Bon voilà, il n'y a plus qu'un distributeur, les upgrade sont fait avec les sprite.

Par contre toujours un problème avec les animations. Quand j'appuie sur le bouton, elle se lance la première fois mais pas les autres fois où j'enclenche le bouton. Je me demande si il ne faut pas réinitialisé l'animation, ou quelque chose de ce genre.

Pour la création du biberon, j'ai tenté la méthode de l'alarm mais elle ne fonctionne pas. J'ai mis l'alarm dans une condition (seulement si le joueur actionne le bouton). C'est la première fois que j'utilise une alarm de cette manière du coup je suis pas sur si c'est juste.

Alors voilà les codes. Dans l'objet du bouton, event Left button :

Code:
if sprite_index = Distributeur_animation{
if Var_Gold.Gold >= 50
{
alarm[0]=10;
image_speed=0.3;
Var_Gold.Gold -= 50;
}
else{
show_message("you do not have enough gold to buy this item =D");
}
Dans l'event Alarm[0].

Code:
instance_create(810,357,Biberon);

_________________
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1608
Localisation : Montpellier

MessageSujet: Re: Problème animation, liaison entre différents objets.    Jeu 10 Oct 2013 - 19:30

Je pense que la dernière frame de ton animation de distribution est identique au sprite d'idle, donc ton distributeur paraît dans le bon état, mais n'a pas le bon sprite pour déclencher ta condition, donc plus d'anim.
Dans tous les cas, essaye de séparer complètement la prog du graphisme. Voilà comment je ferais :

- Faire un sprite représentant l'animation de distribution, dont la première frame est l'état d'idle. Je suppose ici que l'idle n'est pas animé, mais ça peut se faire facilement ensuite.

Create:
Code:
image_speed = 0;
upgrade = 0;
Left Button Pressed:
Code:
if(alarm[0] < 0 && Var_Gold >= 50) { // Si on n'est pas déjà en train de distribuer
    Var_Gold -=50;
    alarm[0] = 10;
    image_index = 0;
    image_speed = 0.3;
} else {
    afficherMessage("Vous n'avez pas assez d'or !");
}
Alarm 0:
Code:
// Ici je suppose que tu n'as qu'un objet Biberon upgradable lui aussi
(instance_create(810,357,Biberon)).upgrade = upgrade;
Animation End:
Code:
image_index = 0;
image_speed = 0;

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Ahamka
Pas mal


Messages : 38

MessageSujet: Re: Problème animation, liaison entre différents objets.    Ven 11 Oct 2013 - 12:02

En effet c'était un problème de frame pour l'animation. Du coup tout mes bug sont réglé.

Par contre, je comprend ce que tu as fait avec "upgrade", mais je ne sais pas comment l'utilisé.

Je suppose qu'à un endroit, il faut que je marque que si upgrade = 1, alors le sprite utilisé est tant, les valeurs des variables sont tant. Alors est ce que je dois déclarer une variable "upgrade" quelque part ou je dois utilisé une sorte de tableau où je range toutes les valeurs ?

Je précise que je suis totalement débutante en programmation, et j'ai commencé à apprendre avec GML, du coup j'ai quelques petites lacunes ^^

_________________
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1608
Localisation : Montpellier

MessageSujet: Re: Problème animation, liaison entre différents objets.    Ven 11 Oct 2013 - 14:37

J'ai nommé les deux pareil, mais ce sont bien deux variables différentes, qui appartiennent chacune à un objet. On parle d'attribut d'instance (une instance est un exemplaire d'un objet, et chaque exemplaire a aussi sa propre variable). Dans mon code l'évènement Create du distributeur déclare cet attribut et l'initialise à zéro.
À partir de là on peut y accéder avec "(idD'unDistributeur).upgrade". Faire "(Distributeur).upgrade" accède à l'attribut de l'instance de distributeur avec l'id le plus petit, donc celui qui a été créé en premier.
Tout ceci est bien sûr vrai pour les Biberons et les autres objets.
Tu peux te servir de la valeur numérique dans un calcul : puissanceBiberon = 100 + 50 * upgrade
Ou dans des conditions : if((leBiberon).upgrade > 2) {…}
Pour l'affichage, tu peux :
- Changer de sprite de distributeur quand tu upgrades (si tu utilises l'astuce de la première frame fixe)
- mettre un switch(upgrade) {…} quand tu changes de sprite pour choisir lequel prendre (un peu lourd)
- utiliser des tableaux pour définir les sprites à prendre (pas de gros code en plus, facile d'en rajouter):
Code:
spriteIdle[0] = spr_distrib0idle;
spriteDistrib[0] = spr_distrib0distrib;

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Ahamka
Pas mal


Messages : 38

MessageSujet: Re: Problème animation, liaison entre différents objets.    Lun 14 Oct 2013 - 15:55

J'ai compris le principe du fonctionnement mais j'ai un peu de mal à le mettre en application.

Mon code n'est surement pas le plus optimisé qu'on puisse trouver, mais en tout cas, tout fonctionne bien.

J'essayerai de revenir sur les attributs d'instance un peu plus tard ^^

Merci en tout cas !

_________________
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1608
Localisation : Montpellier

MessageSujet: Re: Problème animation, liaison entre différents objets.    Lun 14 Oct 2013 - 17:02

L'entraînement fait tout ! N'hésite pas à revenir poser des questions :)

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Ahamka
Pas mal


Messages : 38

MessageSujet: Re: Problème animation, liaison entre différents objets.    Jeu 7 Nov 2013 - 22:01

Bonsoir,

Ce remonte ce poste là car j'ai un problème dont j'ai déjà parlé ici. C'est à propos du clic en folie.

J'ai bien mis partout des event "Left pressed" pour réaliser les achats du jeu et ça me fait encore des achats en continue.

Pourtant, ce problème n'intervient pas lorsque je met d'autre "left pressed" dans le jeu qui ne procure pas un achat.

Y'aurait il des sortes de condition spécial où je ne sais quoi qui font que ça fait des clic à la chaîne ?

_________________
Revenir en haut Aller en bas
keïtchi
Utilisateur confirmé: Rang **
avatar

Messages : 366
Localisation : Don't Follow me, I'm lost too!

MessageSujet: Re: Problème animation, liaison entre différents objets.    Jeu 7 Nov 2013 - 22:53

Voila un exemple que j'ai fait pour une autre personne aujourd'hui,
jette y un coup d'oeil je pense que tu trouvera ton bonheur.
Pour faire simple l'event que tu appel vérifie toutes les step si tu fait un clique gauche,
donc, pour le calmé, tu met une vérification qui renvoie a une alarme qui reset le cooldown de ton clique. :p

_________________
Mon Projet:
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: Problème animation, liaison entre différents objets.    

Revenir en haut Aller en bas
 
Problème animation, liaison entre différents objets.
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Photos de différents sièges RF à l'avant et à l'arrière
» avoir accès aux différents thèmes de discussions...?
» les différents labels écologiques
» Les différents types de tocs
» Les différents types de shampooings

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: