IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Petite animation à la main


Sujet :

Composants Java

  1. #1
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut Petite animation à la main
    Bonjour,


    Je souhaiterais faire un petit jeu pour faire quelques tests, mais n'ayant pas encore tous les sprites pour l'illustrer, j'ai commencé à établir la mécanique du jeu.

    Néanmoins, un petit problème s'est posé quand j'ai voulu commencer à réfléchir à l'affichage des IA qui peupleront la map; les faire marcher et réagir en fonction de ce qu'il se passe.

    Voici donc ma question:

    Pour chaque action spécifique, il y aura logiquement une méthode associée à celle-ci (qui fera défiler toutes les images propres à l'action pour voir l'IA s'animer).

    Si je dessine ces images, il faut que la dernière image affichée disparaisse pour laisser place à celle d'après, mais la classe Graphics ne semble pas posséder de méthode facilitant la suppression d'image (sauf pour les formes géométriques, de souvenir). Donc la seule solution viable que j'ai trouvée jusqu'ici était de mettre toutes les images respectives à une action dans une liste pour ensuite les supprimer au besoin, mais si un moyen plus simple (et/ou plus efficace) je préfère me renseigner avant de me lancer. (Je précise que c'est de la 2D simple)

    Auriez-vous une idée ?

    Je vous remercie d'avance pour votre réponse,

    Cordialement,

    Songbird.
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il ne faut pas considérer le contexte graphique comme une sorte de scène en permanence filmée et retransmise dans un composant Swing. A certains moments, quand du code Swing le demande, ou qu'on le force par appel de repaint(), un composant est redessiné dans le contexte graphique, qu'on peut décrire en simplifiant comme une image bitmap. Cette image bitmap peut être utilisé pour dessiner plusieurs composants et on ne contrôle pas vraiment ça. Donc, ce n'est même pas la peine de chercher à effacer un truc qu'on a déjà dessiner pour le même composant. En plus, dès que le composant est opaque, il est rempli de la couleur de background d'office, sauf si on omet d'appeler la super methode, lorsqu'on redéfinit paint(), ou paintComponent(), ou consor. Donc dessiner un carré, puis dessiner un rond à la place, c'est juste dessiner un carré, puis dessiner un rond
    . Pas besoin d'effacer le carré, qu'il soit là ou pas, c'est pareil, on ne doit pas en tenir compte.

    On peut procéder éventuellement comme tu le penses, en dessinant tout dans une image intermédiaire, puis en dessinant cette image dans le fond du composant, dans la méthode paint(). Il y a même des systèmes prévus pour fonctionner comme ça, en particulier lorsqu'on fait certaines animations pour éviter certains phénomènes disgratieux (flicking, scintillements...),qu'on appelle multi-buffering (pour le plus simple doublebuffering). Mais de toute manière, il est assez difficile d'effacer un carré peint dans une image bitmap (l'effacer peut vouloir dire restituer la portion d'image qu'il y a derrière). Mais on peut repeindre que la zone correspondant lorsqu'on veut effacer quelque chose pour dessiner autre chose.

    On peut également, pour des raisons pratiques, utiliser un modèle "vectoriel", ou, par exemple, un arbre d'objet, qui est toujours dessiné entier, mais dont on peut retirer ou ajouter des objets qui seront dessinés. C'est bien sûr plus long que de dessiner directement en bitmap à la base, et les optimisations ne sont pas forcément simple à programmer (comme ne redessiner que la partie qui a été modifiée, c'est-à-dire premièrement la déterminer).

    Vient s'ajouter à ça la problématique de dessiner les différents éléments à une fréquence régulière, pour faire de l'animation type dessins animés, donc redessiner le composant à une fréquence régulière. De base Swing ne redessine que on fait une action où c'est prévu qu'il le fasse dans le code ou quand on lui demande expressement (par repaint()). On peut s'en sortir avec un timer pour cadencer ça. Mais ne change rien au reste.
    Enfin, un JPanel peut être observeur d'une image pour faire des animations d'image (avec les Gif animés), mais c'est complexe.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Merci pour cette réponse on ne peut plus exhaustive.

    Donc, si j'ai bien compris, avoir recours au double buffering reviendrait à affecter un contexte graphique par image (et donc par entité/IA ?) ?
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, le double-buffering permet simplement de dessiner hors-écran : on dessine sur une image, et c'est une autre qui est affichée, et quand on a terminer de dessiner on échange : on montre celle qu'on était en train de dessiner, et celle qui était affichée devient celle dans laquelle on va dessiner. Ceci permet d'éviter des affichages d'lmage non terminée, et ça évite d'avoir certains effets disgracieux lors d'une animation. Si Swing décide de dessiner le composant à ton insu, une image incomplète ne sera pas dessinée avant d'avoir indiquer qu'elle est complète. Il y a de toute façon tout dessiné dans la même image. La différence avec la méthode de dessin dans une image sans multi-buffering est que tu dessines toujours offscreen (dans une image), mais cette image est directement affichée dans le contexte graphique.

    [EDIT]Tu peux regarder le programme ici comme exemple
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    D'accord, merci pour les explications.

    Je vais aller me renseigner un peu plus sur le multi-buffering, ça me semble beaucoup plus adapté si on ne souhaite pas avoir de mauvaises surprises durant le dessin des images/formes souhaitées. (du moins si on en a beaucoup à dessiner)


    Bonne soirée à toi et encore merci !
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

Discussions similaires

  1. [DEBUTANT] Besoin d'un petit coup de main
    Par rantanplan08 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/04/2006, 12h09
  2. UPDATE trop compliqué, besoin d'un petit coup de main ;)
    Par pwangen dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/02/2006, 11h16
  3. Réponses: 11
    Dernier message: 26/11/2005, 13h00
  4. Un petit coup de main avec valgrind ?
    Par YéTeeh dans le forum Linux
    Réponses: 2
    Dernier message: 25/11/2005, 01h22
  5. Réponses: 3
    Dernier message: 28/02/2003, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo