Bonjour! Nouveau sur ce forum, je dois dire que la communauté semble vraiment disponible et agréable. Du coup, j'espère que je pourrais apprendre un maximum des échanges qui se font ici puisque j'essaye de me former à plusieurs des logiciels dont on parle ici.
Je travail actuellement sur un projet de visualisation de son avec Processing et j'ai un premier petit problème pour lequel j'ai besoin de votre aide.
J'ai plusieurs objets en forme de cercle qui on donc une variable rayon qui leur est propre. J'aimerais que lorsque deux objets se touche, il y ai un rayon qui augmente progressivement et passe de 20pixels à 200pixels en 5secondes, par exemple.
Mon soucis se situe vraiment au niveau de l'agrandissement progressif.
La seule chose à laquelle j'arrive à penser depuis quelques jours, c'est de faire une boucle. Du coup, je crée une méthode que j'appelle dans une autre méthode lorsqu'il y a rencontre entre deux objets.
void editCircle(){ for(int i=0; i<400; i++){ radiusCircle = radiusCircle + 1; } }
Le problème est que le rayon passe évidemment directement de 0 à 400 et que l'augmentation que je veux progressive est imperceptible.
Désolé de ne pas être très clair quand je vous l'explique mais ce problème tout bête m'énerve depuis un peu trop de jours. ^^'
Hors ligne
Quand tu parles d'objets as-tu construit des classes pour ces objets ?
Pour te donner une idée, il faut qu'à chaque tour de la boucle draw() tu incrémentes le diamètre comme ici :
int diametreMin, diametreMax; float diametre; boolean etat; void setup() { size(400, 400); diametreMin = 20; diametreMax = 200; diametre = diametreMin; etat = false; frameRate(20); } void draw() { background(255); if (etat && (diametre <= diametreMax)) { diametre += 1.0; } ellipse(mouseX, mouseY, diametre, diametre); } void keyPressed() { if (key == ' ') { etat = !etat; } }
Hors ligne
Bonjour
un rayon qui grossi progressivement.
float rayon; void setup(){ size(400,400); rayon=20; } void draw(){ rayon+=0.1; ellipse(200,200,rayon,rayon); }
Hors ligne
Merci à tous les deux pour vos réponses.
Je travaille effectivement avec des classes d'objets depuis quelques semaines, c'est pour ça que je suis pas mal frustré de ne pas réussir à résoudre mon problème qui semble carrément basique.
Frustré, je le suis encore, je crois comprendre complètement le code que Mushussu m'a donné, et il fonctionne exactement comme je le veux, sauf que je n'arrive pas à l'intégrer dans ma classe d'objet.
Dans le code en question, c'est l'appuie sur une touche qui change l'état et qui fait que le rayon peut s'agrandir puisque le draw se joue en boucle. Dans mon projet, c'est une rencontre entre deux objets qui devrait changer l'état pour qu'un cercle s'agrandissent, puis disparaisse.
J'ai donc une première méthode qui détecte la collision et c'est dans cette méthode que j'appelle cette qui édite les visuels.
J'ai tenté avec une boucle while mais ça ne fonctionne pas non plus...
Le problème est encore une fois que la méthode se joue en boucle trop vite et, même avec un noFill(), les ellipse se dessine successivement et fond un gros cercle coloré plutôt que l'effet désiré. Je suis un peu perdu pour le coup.
Dernière modification par yakuru (2014-04-02 11:29:45)
Hors ligne
C'est que tu pas encore saisis le principe, voici une possibilité :
La boucle draw() appelle chaque fois la méthode miseAJour() qui augments le rayon.
Hors ligne
Bonjour
J'ai essayé ton code mais je n'ai pas réussi à le faire fonctionner;je ne sais pas si j'ai bien compris ,mais dans tes boucles si tu mets 0.1;par exemple au lieu de 1 ton cercle grossira moins vite;ou une valeur qui corresponde à ce que tu veux,qui soit inférieure à 1.
Hors ligne
Pardon, oui, j'ai la sale habitude de ne donner que des bribes de mon code; je ne vous avais effectivement mis qu'une partie d'une classe sans même vous mettre mon sketch principal. C'était forcément loin d'être fonctionnel du coup.
A l'avenir, il vaut mieux mettre tout son code? Je ne savais pas trop comment vous fonctionniez ici pour ce genre de question.
Je suis en train d'analyser le code et de l'adapter à mon projet. Il est simple alors ça se passe bien, un grand merci!
Tant que j'y suis, vous voulez bien m'ôtez d'un doute? J'organise donc mon code avec différents onglets correspondant à mes classes d'objets (ça ne change rien au fonctionnement mais bon...) J'aimerais agir sur une variable depuis plusieurs de mes classes d'objets (pour l'augmenter et la comparer); où est-ce qu'il vaut mieux créer cette variable? Dans mon sketch "principal" (donc, en dehors de classe) ou bien peut être dans une classe créer spécialement pour gérer tout ce genre de chose? On hésite.
Dernière modification par yakuru (2014-04-04 20:17:47)
Hors ligne
Je ne sais pas si cela va bien répondre à ta question ;mais si tu veux tester une variable plusieurs fois à différents endroits dans le programme ,et la faire réagir en fonction de tes besoins peut être vaut il mieux faire un sous programme .Pour exemple:
void setup() { size(200,200); } void draw() { int i=5; int j=10; int k=somme(i,j); println(k); } int somme(int num1,int num2){ int resultat; resultat=num1+num2; return resultat; }
Hors ligne
C'est ce que l'on se demandait, ça me semble bien mieux aussi.
Je vous remercie. Vraiment!
Encore une question: est-ce qu'il y a un endroit où les utilisateurs postent leur projets? J'ai bien trouvé la catégorie "codes & travaux" du forum mais il y a l'air d'y avoir assez peu de production réalisée avec Processing, par exemple?
Hors ligne
Pour ta variable, il est fortement déconseillé d'utiliser une variable globale définie avant le setup() que tu utiliserais dans tes classes.
Le but des classes est d'être indépendantes et de pouvoir être réutilisées.
Tu peux utiliser des variables de classe, java le permet :
http://fr.openclassrooms.com/informatiq … de-classes
Après je ne sais pas trop ce que tu veux faire.
Tu peux mettre ton programme dans code&travaux, c'est fait pour cela.
Hors ligne
Bonjour!
Merci pour ton lien, c'est vraiment super intéressant; je n'avais jamais pensé à me plonger dans les ressources du java pour progresser dans mes travaux. Idiotie. --'
Si vous voulez bien m'accordez encore un peu de votre temps, je vous serais reconnaissant de jeter un coup d'oeil au code ci dessous. Je travail sur un programme qui gère les collisions entre des "balles"; les balles sur le bord de l'écran, les balles d'une même classe entre elles et les balles d'une classe avec celle d'une autre classe.
Je gère parfaitement les collisions avec le bord d'un territoire. En revanche, j'ai du mal avec les collisions des balles entre elles. En testant, on s'aperçoit que leur comportement est étrange; elles rebondiront parfois parfaitement bien l'une sur l'autre et, d'autre fois, elles "fusionneront" pour se traverser complètement (et donc, elle clignoteront, ce qui montre une multitude de choc que j'aimerais éviter).
Ce comportement me fait penser, que cette fois, mon problème est surtout mathématique; je crois que le comportement change en fonction de la direction du vecteur de mouvement de chacune des deux balles lors de la collision. Et si c'est effectivement ça, je n'arrive simplement pas à vérifier la direction des vecteurs pour la comparer.
J'ai analysé des tas de codes de ce genre de "bouncy balls" mais il y en a peu qui fonctionnent avec mon principe et qui gèrent autant de chose que je le voudrais.
J'ai vraiment peine à résoudre ce problème. En fait, je n'arrive même plus à évaluer vraiment ce qu'il se passe lorsque deux balles se rencontrent.
Lorsque je comprendrais mon soucis au sein d'une même classe, je ne devrais pas avoir de problème à l'adapter pour la rencontre entre deux classes d'objets différentes. De fait, je vous ai enlevé tout ce qu'il y a de "superflu" dans le code.
Mon sketch principal:
Ma première classe:
Ma deuxième classe:
Sincèrement, je suis un peu perdu. Même dans les références de processing.org, je ne vois rien qui pourrait m'aider.
Si vous aviez au moins une piste, ce serait vraiment sympa: ces balles vont avoir raison de moi!
Dernière modification par yakuru (2014-04-07 04:37:15)
Hors ligne
je te fais parvenir un programme de rebonds avec vecteurs si cela peut t'aider;les rebonds sont à peut prés corrects
int nb=10; Balles[]balles=new Balles[nb]; void setup(){ size(700,500); for(int i=0;i<nb;i++) { balles[i]=new Balles(); } } void draw(){ background(255); for(int i=0;i<nb;i++) { balles[i].display(); balles[i].deplacement(); balles[i].rebond(); } for(int i=0;i<nb;i++) { for(int j=i+1;j<nb;j++) { balles[i].collision(balles[j]); } } } class Balles{ PVector position; PVector deplacement; boolean bing; float diametre; color couleur; Balles(){ position=new PVector(random(0,width),random(0,height)); deplacement=new PVector(-2,2); diametre=30; couleur=color(255,255,0); } void display(){ if(bing) { deplacement.x=deplacement.x*-1; deplacement.y=deplacement.y*-1; } fill(couleur); ellipse(position.x,position.y,diametre,diametre); } void deplacement(){ position.add(deplacement); } void rebond(){ bing=false; if(position.x<0||position.x>width) { deplacement.x=deplacement.x*-1; } if(position.y<0||position.y>height) { deplacement.y=deplacement.y*-1; } } void collision(Balles j){ float distance=position.dist(j.position); if(distance<30) { bing=true; j.bing=true; } } }
Hors ligne
Merci, mais ce n'est pas exactement ce que je veux faire. C'est le genre de code que j'ai trouvé sur internet avant de venir vous demander de l'aide; il inverse la direction des balles à chaque collision en multipliant le vecteur de déplacement par -1.
Pour mon programme, je tente de faire une simulation de choc plus "réaliste" puisqu'il prendrait en compte comment se touche les objets pour changer leur direction: si une balle est touchée de plein fouet sur le coté, elle ne va pas seulement faire marche arrière, elle va partir sur le coté opposé. C'est pour cela que j'ajoute au vecteur de déplacement de la balle A celui de la balle B (pour qu'elle prennent la direction de la balle qui l'a heurté). Et après ça, il faut que la balle B voit son vecteur inversé pour repartir dans le sens inverse.
Mais c'est à ce niveau que je n'arrive pas à faire ma simulation.
Globalement, c'est ce qu'il se passe ici: http://processing.org/examples/bouncybubbles.html
...mais j'ai vraiment du mal à comprendre comment fonctionne leur méthode collide().
Hors ligne
j'ai regardé le programme ,d'aprés ce que j'ai compris il modifie les angles du rebond.mais toi tu veux le faire avec des vecteurs.
Hors ligne
Je ne suis plus. Tu parles bien du programme présent dans les références de processing.org?
L'angle doit changer à chaque situation, pourquoi le mettre en paramètre?
:s :s
Dernière modification par yakuru (2014-04-07 16:56:44)
Hors ligne
Pages: 1 2