J'ai continué le projet et ait réussi un assez bon programme qui semble fonctionner :
void contamination() { for (int k = 0; k < nbContamine;k++) { Infection cont = infected.get(k); cont.contamine = true; cont.couleur = color(255,0,0); } }
et dans le sous-onglet de la class Infected, j'ai rajouté ça :
class Infection { color couleur; PVector position, vitesse; boolean bing, contamine; Infection (int posX, int posY, color nouvCouleur) { position = new PVector(posX, posY); vitesse = new PVector(int(random(-10, 10)), int(random(-10, 10))); couleur = nouvCouleur; bing = false; contamine = true; } void affichage() { if (bing == true && contamine == true) { fill(255,0,0); } else { fill(couleur); } ellipse(position.x, position.y, 20, 20); }
Je pressens que mon professeur va me dire que mes fonctions n'ont pas vraiment des noms adaptés, il faudra que je pense à les modifier pour que les autres personnes sur le projet puissent s'y retrouver quand je leur expliquerai ^^.
Dernière modification par alexis51151 (2014-10-20 14:53:23)
Hors ligne
C'est chouette que tu arrives à quelque chose qui te convienne. Ce serait bien que tu postes sur le forum ton code sous la forme d'un fichier zip, pour que d'autre personne puisse s'en inspirer.
Il est important, comme tu le dis, que les noms de méthodes et de classes soient bien explicite pour pouvoir être utilisés par d'autres.
Continue ton exploration.
Hors ligne
Oui, dès que j'aurai fini mon projet, je le posterai en intégralité pour qu'on s'en inspire.
Je vais essayer de faire des compteurs pour des statistiques maintenant.
Cela semble compliqué à cause du fonctionnement de "draw", qui met à jour à chaque fois la boucle, ce qui donne des nombre infiniment grands.
Dernière modification par alexis51151 (2014-10-21 15:29:44)
Hors ligne
Bonjour,
Beau boulot et beau projet pour mettre les mains dans le code.
- Sur ta question principale, en fait tu n'avais pas besoin de la variable bing dans ta classe. La variable contamine suffit. Si deux boules se rencontrent et que l'une d'elle est contaminée alors elle contamine l'autre. C'est le travail réalisé dans la méthode comparer().
- Il faut que tu fasses un travail de renommage de ta classe et de tes variables qui ne sont pas parlantes. La classe principale n'est pas une infection, c'est une personne, un agent, une balle …
Cet agent a des caractéristiques notamment celui d'être contaminé.
- j'ai modifié la méthode affichage de la classe car pour chaque agent, tu redessinais le cadre et le texte.
- J'ai changé la méthode bouger_GUI, en méthode changer avec le prototype suivant :
void bouger(int bordGauche, int bordHaut, int bordDroit, int bordBas);
Cela s'appelle la surcharge de méthode. Le programme suivant que tu passes ou non des arguments dans ta méthode choisira l'une ou l'autre.
- Attention tu as sans doute mis un nouvel onglet pour ta classe, mais si tu mets des variables avant le mot-clef class, ces variables sont considérées comme globales. Et il ne faut pas utiliser dans une class des variables globales.
- Pour l'initialisation des agents, j'ai introduit un autre paramètre dans le constructeur pour savoir s'il sont contaminés au départ.
Hors ligne
Merci pour ton aide. J'avais hier supprimé mon message car j'ai trouvé la solution après de multiples essais, d'où mon soulagement.
Mais, aujourd'hui, j'ai décidé de faire une sorte de "panneau de configuration" annexe qui ouvrirait une autre fenêtre lorsque l'on cliquerait sur un bouton.
J'ai donc cherché sur Internet, car je n'arrivais pas en utilisant les void draw et setup à avoir le résultat, et suis tombé sur le sujet du forum http://codelab.fr/4435 . J'ai donc lu les réponses et tenté de comprendre le code.
J'en suis ainsi venu à savoir que PApplet était en fait la librairie pour processing, que Frame était la classe que je devais utiliser pour créer une nouvelle fenêtre, et que setBounds servait à positionner la nouvelle fenêtre par rapport à la première.
Je me suis donc amusé à reproduire cela, c'est-à-dire à faire apparaître une deuxième fenêtre le plus simplement possible, et ayant réussi, je me suis lancé dans mon code.
Là, déjà, un problème de taille : n'ayant que très peu (voir aucunes) notions en Java, mais me remémorant du PHP, je vois des "public" avant les classes. Je sais que c'est pour que la classe soit valable dans tout le code. Je l'enlève donc comme je l'avais fais dans le programme simplifié.
Je renomme les classes avec des noms évocateurs (avant cela j'avais essayé avec tout le code d'origine, excepté les void setup et draw de la page de base). Mais, des erreurs apparaissent. Je tente beaucoup de choses, sans succès.
Je pense être cette fois-ci réellement perdu car j'ai deux parties en création (le input et la nouvelle fenêtre) qui sont liés entre-eux, je fusionne donc une partie de input avec la nouvelle fenêtre pour faire un input dans celle-ci (mon but final).
J'ai obtenu cela :
On peut observer que le bouton est prêt. Le problème ici est que je ne peux pas exécuter le programme à cause d'une erreur : "Cannot find a class or type named Cadre". Pour résoudre ce problème, j'ai passé la classe "Cadre" en public class, sans aucune amélioration. J'avais auparavant enlevé la déclaration d'un objet pour chacune de ces classes, car processing ne les trouvaient pas, avec le même message d'erreur.
J'espère que tu pourras m'aider, voire m'expliquer si possible.
Je te laisse aussi le code modifié de mes deux autres onglets (principal et classe Infection) pour te montrer comment j'ai réussi à faire fonctionner le programme.
Onglet principal :
Onglet Infection :
J'ai observé la forme de la fonction bouger que tu me proposes, je vais voir si je la mets ou non demain.
Merci beaucoup pour ton aide, tu es en quelque sorte mon guide dans ce monde de la programmation. Je passe de nombreuses heures sur ce programme car il sera un atout lors de la présentation de mes travaux, mais aussi par passion car je pense que la programmation permet tout, et cela me permet aussi de comprendre comment fonctionne les choses avec lesquelles nous vivons chaque jour, pour voir qu'ils ne sont pas si complexes.
Encore merci, et à bientôt.
Dernière modification par alexis51151 (2014-10-31 18:10:40)
Hors ligne
Bonsoir,
Tu avais mis la définition de ta classe SecondeFenetre dans une méthode, donc elle ne se créait jamais. J'ai remis cela tout en ordre. Cependant,
- Il y a une convention typographique en java pour nommer les classes. Il faut que le première lettre soit en majuscule, on n'utilise pas les tirets, tous les mots sont agglutinés et chacun a une majuscule à la première lettre.
- Il faut donc déclarer les classes Cadre et SecondeFenetre comme les autres.
- Il y a une distinction entre les méthodes mousePressed et mouseClicked, regarde bien l'aide.
- PApplet et la classe de Processing
- Il faut vraiment séparer l'affichage de tes menus de l'affichage de tes agents. Le menu est distinct de la classe Infection. Donc il doit apparaître dans la méthode draw
- Dans un forum, l'aide est pour tout le monde, donc ne supprime pas tes messages, ils eurent servir pour une autre personne. Tu peux faire une modification en indiquant que tu as trouvé la solution au problème.
- Comme ton programme commence a être long, compresse-le et joint le dans ta future réponse.
- Il y avait aussi un problème lors de ton test de survol du bouton un mouseX qui devait être un mouseY
Bon courage pour la suite.
Hors ligne
Bonjour,
j'ai observé et remanié le code, j'espère enfin avoir compris et intégré les majuscules pour les classes, je me souviens que tu me l'avais déjà dis pour la classe Infection.
J'ai ce matin commencé la programmation d'une classe Input permettant donc de l'utiliser dès que je le souhaite, mais je trouve encore un message d'erreur.
Je pense que créer directement une classe pourra m'être plus utile, si je fais un interface graphique car le style que j'aurais mis sur celle-ci (input) s'appliquera à toutes les autres.
Je mettrai, sous ton conseil, dorénavant mon fichier en zip.
Merci.
Hors ligne
C'est une bonne idée de créer une classe pour un nouvel objet qui serait un champ de saisie.
C'est un peu complexe de gérer les évènements clavier, souris … Ce n'est pas aussi trivial que tu le penses. Va voir l'article du wiki du Labomedia que j'ai rédigé :
http://wiki.labomedia.org/index.php/Acc … une_classe
Il existe une librairie Processing qui a déjà tout les éléments GUI. Elle s'appelle controlP5 :
http://www.sojamo.de/libraries/controlP5/
Il y a une erreur dans le constructeur de ta classe Input :
Input(int posX, int posY, int longRect, int largRect) {
N'hésite pas à créer des onglets, un onglet par classe.
J'ai un peu modifier le code que j'ai posté précédemment, j'ai utilisé la méthode isShowing() pour savoir si la fenêtre est visible ou non. Cela évite l'utilisation d'une variable.
Dernière modification par Mushussu (2014-11-01 13:07:58)
Hors ligne
Bonjour, j'ai analysé ton code sur Labomedia, et pense l'avoir compris dans l'ensemble. Il me reste une zone de flou : les getX(), getAction()... ont-ils été déclarés auparavant dans le programme ? Car ils ne semblent pas être reconnus par processing. Dois-je alors importer une librairie ?
Hormis cela, j'avais entendu parler de la librairie controlP5 mais je pense qu'il serait préférable que je tente d'abord par moi-même, bien sûr les résultats graphiques seront peu enviables à celle-ci. Alors, je pourrais peut-être l'utiliser au moins pour l'aspect graphique "soigné".
Et j'ai une dernière question quant à cette bride de code :
void mousePressed() { if ((mouseX > 960) && (mouseX < 1190) && (mouseY > 120) && (mouseY < 220)) { if (c.isShowing()) { c.setVisible(false); } else { c.setVisible(true); } } }
J'ai compris que la fonction isShowing() renvoyait l'état de l'objet selon deux attributs -> est-il ou non visible.
Mais le problème vient ensuite : le if a donc pour but que si la fenêtre est ouverte (donc visible), elle ne l'est plus, et sinon qu'elle le soit ? Je viens de comprendre, qu'en réalité, c'est pour la refermer avec le bouton, n'est-ce-pas ?
Ne serait-il pas enviable de pouvoir aussi refermer la fenêtre avec la croix de celle-ci, ce qui n'est actuellement pas possible.
PS : Pour les Get()..., je viens de trouver ceci : http://processing.org/reference/javadoc … Event.html qui semble bien correspondre à l'explication que je cherchais.
J'ai donc adopté un nouvel import :
import java.lang.Object;
Question : Est-il utile ou déjà incorporé à processing ?
Dernière modification par alexis51151 (2014-11-02 08:51:21)
Hors ligne
Bonjour,
Le programme du wiki tourne sans importer de librairie supplémentaire. Je suis avec la dernière version de Processing la 2.2.1. Comme tu l'as vu getX() est défini dans la classe mouseEvent de Processing.
Donc si la fenêtre est ouverte, elles se ferme
Sinon, elles s'ouvre
Hors ligne
Bonjour,
J'ai poursuivi l'assimilation de ton code, en l'aménageant (trop peu, mais malheureusement mon manque de connaissances ne me laisse que peu d'originalité, mais l'habitude me fait me rappeler d'initialiser... désormais) mais je pense qu'une partie (surtout pour le keyEvent ou Clavier dans mon cas) n'est pas indispensable, je n'ai besoin de gérer qu'un nombre limité d'informations différentes, le but étant d'avoir un interface simple et efficace.
J'ai donc fais à part le programme de la classe, pour le corriger, mais une erreur apparaît : le programme ne parvient pas à trouver la méthode Souris() qui est pourtant public.
Merci pour l'aide.
Hors ligne
C'est un but tout à fait louable de franciser ton application, mais dans ce cas là ce n'est pas approprié. Les méthodes doivent être celles définies par Processing.
Si tu remplaces Clavier par keyEvent et Souris par mouseEvent la compilation se déroule normalement.
Hors ligne
Bonjour,
J'ai réussi ma classe input ainsi :
Désormais, je souhaite ajouter un input dans ma seconde fenêtre. Je vais donc dans le setup() de la seconde fenêtre et ajoute ceci :
public class SecondeFenetre extends PApplet { public void setup() { size(400, 300); entree = new Input(this,100,100,100,100,color(255,0,0)); noLoop(); } public void draw() { } }
Je remarque lorsque je fais certaines manipulations tout en positionnant l'input dans l'Applet SecondeFenetre qu'il est toujours par rapport à l'Applet principal car il se positionne par rapport à celle-ci.
Je me demande donc où je dois initialiser mon nouvel objet.
Hors ligne
Il ne faut pas croiser les effluves. c'est mal.
Evite de déclarer une variable globale, ici entrée, pour l'utiliser dans une classe.
Je te propose une solution qui ne me satisfait pas, mais qui fonctionne. Il faut mettre la déclaration de ta classe dans la classe Secondefenetre. Il faut que je me penche sur cette histoire de classe emboitées.
public class SecondeFenetre extends PApplet { Input entree; public void setup() { size(400, 300); entree = new Input(this, 100, 100, 100, 100, color(255, 0, 0)); noLoop(); } public void draw() { } public class Input { ... } }
Petite remarque, je viens de découvrir que la méthode registerDraw() était dépréciée. Il faut remplacer :
page.registerDraw(this);
par
page.registerMethod("draw", this);
Hors ligne
Bonjour,
Cela fait plusieurs jours que je suis face à un problème que je ne comprends pas : mon code semble fonctionnel (celui avec l'input), mais lorsque je tape un caractère, il apparaît trois fois.
Alors, je vérifie mon code, avec le plus d'éventualités qui me viennent à l'esprit (fermer les possibilités sur le boolean curseur pour le remettre à false si l'utilisateur n'est plus sur le rectangle)... mais ceci est fonctionnel.
Je décide ensuite d'étudier plus particulièrement cette petite partie du code "evenement.getKey()" mais je ne trouve aucun problème particulier.
J'en viens donc à la conclusion qu'il s'agit d'un problème de répétition, mais je ne sais guère où.
Une aide me serait précieuse, merci.
Voici le code de la partie, et le code entier en zip :
Hors ligne