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

SWT/JFace Java Discussion :

[SWT]jeu n'affiche pas l'animation


Sujet :

SWT/JFace Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 49
    Points
    49
    Par défaut [SWT]jeu n'affiche pas l'animation
    Alors voilà, j'ai fait un petit programme (cf code simplifié) où un personnage doit se déplacer vers le haut quand on appuie sur la touche "i". Pour cela je me suis fortement inspiré d'un des articles du site d'eclipse.
    Le problème c'est que l'animation qui correspnd à ce mouvement comprend cinq phases pour rendre le mouvement du personnage, hors mon programme ne m'affiche que la dernière des images.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Start {
    	public static void main(String[] args) {
    		Jeu jeu = new Jeu();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    import org.eclipse.swt.graphics.*;
    import org.eclipse.swt.*;
    import org.eclipse.swt.widgets.*;
    import org.eclipse.swt.events.*;
     
    public class Jeu {
     
    	private Display display;
    	private Shell shell;
    	private Canvas canvas;
    	private GC gc;
    	//Tableau dans lequel on va stocker les images de l'animation du personnage.
    	private Image[] images;
    	//Delais d'affichage entre chaque phase d'animation du personnage.
    	private int delayTime;
    	//x et y représentent la position du personnage.
    	private int x;
    	private int y;
    	//Ecart entre deux animations.
    	private int step;
     
    	public Jeu() {
     
    		step = 5;
    		x = 150;
    		y = 150;
    		delayTime = 150;
     
    		display = new Display();
    		shell = new Shell(display, SWT.MIN | SWT.CLOSE);
    		shell.setLocation(0, 0);
    		shell.setSize(300, 300);
     
    		//On initialise le tableau d'image avec les fichiers choisis.
    		images = new Image[4];
    		images[0] = new Image(display, ".\\rpg1-1.png");
    		images[1] = new Image(display, ".\\rpg1-2.png");
    		images[2] = new Image(display, ".\\rpg1-3.png");
    		images[3] = images[1];
     
    		final Image image = new Image(display, images[1], SWT.IMAGE_COPY);
    		gc = new GC(image);
     
    		canvas = new Canvas(shell,SWT.NONE);
    		canvas.setSize(300, 300);
    		canvas.setLocation(0, 0);
    		canvas.setBackground(new Color(display, 0, 0, 0));
    		canvas.addPaintListener(new PaintListener(){
    			public void paintControl(PaintEvent event){
    				event.gc.drawImage(image, x, y);
    			}
    		});   
     
    		//Lorsqu'on appuyra sur la touche "i" on veut que le personnage monte.
    		canvas.addKeyListener(new KeyListener() {
    			public void keyPressed(KeyEvent e) {
    				String key = "" + e.character;
    				if (key.equals("i")) {
    					display.syncExec(
    						new Runnable() {public void run() {
    							walkForward();
    						}
    					});
    				}
    			}
    			public void keyReleased(KeyEvent e) {
    			}
    		});
     
    		shell.open();
    		while(!shell.isDisposed()){
    			if(!display.readAndDispatch())
    				display.sleep();
    		}
    	}
     
    	//Fonction faisant l'animation du personnage qui monte vers le haut.
    	private void walkForward() {
    		for (int i=0; i<=3; i=i+1) {
    			y = y - step;
    			ImageData imageData = images[i].getImageData();
    			Image newImage = new Image(display, imageData);
    			gc.drawImage(newImage, imageData.x, imageData.y);
    			newImage.dispose();
    			canvas.redraw();
    			try {
    				Thread.sleep(delayTime);
    			} catch (Exception e) {
    				System.out.println(e.getMessage());
    			}
    		}
    	}
    }
    En fait tout ce passe comme ci dans la fonction walkForward() les images images[0]..images[2] n'étaient jamais affichées, seule images[3] est rendue dans ma fenetre.

    J'ai essayé de modifier le delayTime mais même avec un plus important j'ai toujours une seule phase d'animation au lieu des cinqs.

    Si quelqu'un a une idée je suis preneur.

    Je donne des liens pour les images si il y en a qui on envie de s'amuser

    http://membres.lycos.fr/denebscoalition/rpg1-1.png
    http://membres.lycos.fr/denebscoalition/rpg1-2.png
    http://membres.lycos.fr/denebscoalition/rpg1-3.png

  2. #2
    Membre habitué Avatar de relivio
    Profil pro
    Inscrit en
    Février 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 157
    Points : 177
    Points
    177
    Par défaut
    salut
    tu as essayé d'augmenter le délai à deux secondes par exemple?
    je pense que l'utilisation du balai chiotte n'est pas interdite et est même recommandé par les suivants!!!!

  3. #3
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 49
    Points
    49
    Par défaut
    Salut relivio.
    Oui j'ai essayé d'augmenter le delais.
    En mettant 2 secondes par exemple, si j'appuies sur "i", le programme ne fait rien et au bout de 8s il affiche ma dernière image (qui est images[3]). Or 8s= 4 X 2s, 4 le nombre d'animations que j'ai.
    Le programme fait bien une pause de 2s entre chaque animation mais apparement il n'affiche pas les images à chaque passage dans la boucle for.

    Ma machine c'est un 2Ghz donc je ne pense pas que ça vienne de là.

    PS : J'ai ajouté des liens pour les images et édité le code (il y avait une phase de trop dans l'animation).

  4. #4
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 49
    Points
    49
    Par défaut
    Hum je crois que j'ai une théorie : mon affichage graphique est traité comme un thread SWT, il serait traité quand le programme a une baisse d'activité.
    Ainsi l'image s'affiche en fait une fois que la boucle "for" a terminé (car à ce moment le programme devient inactif, il écoute juste les evenement clavier).

    Existe il une fonction en SWT pour forcer un affichage immédiat?

  5. #5
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 49
    Points
    49
    Par défaut
    Je crois que j'ai trouvé, chaque image doit être affichée dans un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    display.syncExec( 
         new Runnable() {public void run() { 
     
         } 
    });
    en revanche la pause doit être en dehors de ce thread.
    On a donc la boucle for qui englobe :
    - le thread qui déclenche l'affichage de l'image
    - la pause entre les phase de l'animation

    Ca semble marcher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SWT] Canvas n'affiche pas toute l'image
    Par wwave dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 17/06/2010, 13h01
  2. Animation flash qui ne s'affiche pas en ligne
    Par Thierry_A dans le forum Flash
    Réponses: 1
    Dernier message: 21/09/2008, 11h27
  3. Réponses: 1
    Dernier message: 31/01/2008, 17h13
  4. Réponses: 2
    Dernier message: 28/10/2007, 17h46
  5. gif animé qui ne s"affiche pas sous IE
    Par manaboko dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 10/08/2007, 16h11

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