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

avec Java Discussion :

Deplacer des objets (ou images) suivant une trajectoire


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Deplacer des objets (ou images) suivant une trajectoire
    Bonjour,

    Je souhaite créer une appli Java permettant des dessiner des Objets (des carrés pour débuter, ca pourrait être des jpg) et les déplacer suivant une trajectoire prédéfini.

    C'est a dire, dans un 1er temps les coordonnées seront statiques directement dans le code et par la suite elles pourront être stockées dans un fichier.
    Les coordonnées correspondent à des positions a temps t, t1, t2 ....

    L'idée étant de faire bouger les X objets en même temps entre 2 intervalles.
    Le déplacement entre 2 coordonnées se fera de façon rectiligne (on verra plus tard pour les trajectoires arrondis)

    Mon gros soucis ... c'est que je ne sais pas comment démarrer, j'étais en réflexion autour de Flash/Action script mais je préfèrerai faire ça en Java, ca me permettrait d'utiliser Swing et d'autres API graphique.

    Merci d'avance a ceux qui lisent ... et bon courage a ceux qui vont repondre.

    Patoch

  2. #2
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    J'ai du mal à saisir la question désolé
    Tu ne sais pas par quoi commencer mais tu veux pratiquer du Swing et des API Graphique Java.
    Et bien aprend le Swing pardis

    Et ce que tu demande est - à première vu - très faisable est java.
    Un ami avait fait un snake en Java et pour le déplacement il prennait la distance entre les 2 points (départ et arrivée), il retranchait une valeur ( équivaut à la vitesse) à cette distance, et il redessinnait le snake à partir des nouvelles coordonnées.

    Bref, tu passe par des sin et des cos et le tour est joué
    ps : je sais, plus facile à dire qu'à faire
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  3. #3
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Citation Envoyé par Pat31 Voir le message

    Mon gros soucis ... c'est que je ne sais pas comment démarrer, j'étais en réflexion autour de Flash/Action script mais je préfèrerai faire ça en
    si ton contrainte est le temps, je te conseille de travailler avec flash.
    pour le reste, il faut plus de détail pour qu'on puisse t'aider.

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Il est vrai qu'en relisant mon message , ce n'est pas très clair .

    Mon idée était de faire une appli (qui me servirait aussi d'apprentissage de JAVA et Swing ....) permettant de simuler des déplacements de personnages suivant des positions et des trajectoires prédéfinies.
    Par exemple : une simulation de chorégraphie (ou autres)
    Dans un 1er temps, je souhaiterai travailler en 2D puis pourquoi pas la 3D ... mais je n'y suis pas encore .
    Mes personnages seraient donc des objets se déplaçant sur une scène suivant des positions et trajectoires qui seraient stockés dans un fichier XML (là je rentre dans du détail technique). Dans un premier temps, les positions seront en dur dans le code .

    Je n'ai pas de contraintes de temps, je fais ça pour le plaisir ... mais je ne veux pas partir dans une techno et revenir en arrière plus tard .

    Voila ... j'espère avoir été un peu plus clair ... et je suis preneur de tous conseils et idées sur les technos utilisables.

    Merci encore

  5. #5
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    salut.
    pour déplacer un objet, il faut changer sa positon en x et y après un laps de temps. pour faire ça, tu doit créer un Thread qui fera l'appelle de la méthode repaint() aprés chaque laps de temps (méthode sleep()) pour redessiner ton personnage à sa nouvelle position.

    les positions ( les points de cordonnées x et y) qui présentent ta trajectoire peuvent être générés suivant une formule mathématique par exemple celle d'une sinusoïde ou bien, tu peux dessiner ta trajectoire, tu récupère les points du trajectoire dans un vecteur, après à chaque fois tu récupère la nouvelle position à partir de ce vecteur et tu fais le dessin.

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour toutes ces infos.

    Concernant la trajectoire, elle sera dans un premier temps stocké en dur dans un tableau.

    Par contre, pour le déplacement de mes objets, si j'ai bien compris, chaque objet se déplacera tout seul via son thread . Mais dans ce cas là, comment garantir la synchronisation du déplacement de mes objets?
    Car imaginons, 4 objets en position X,Y, le 1er objet partirait de 1 vers le haut le 2ieme de 1 vers la droite ... comment garantir que l'objet 4 ne sera pas en bas de 10 avant que les autres soit arriver a cette position ?

    Merci

  7. #7
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Même si les Thread ne s'éxécute pas en même temps, le décalage est de l'ordre de la milliseconde ... et encore je suis super gentil.

    Donc pas de soucis à te faire pour la synchronisation des thread
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Pour un truc plus simple, je pense que tu peux utiliser le même thread pour dessiner tes différents personnages. Cela dépend du niveau de complexité que tu veux atteindre.
    Tu peux aussi utiliser un Timer à la place du sleep.

    Voilà un exemple en JAVA2D :
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
     
     
    @SuppressWarnings("serial")
    public class Test extends JPanel implements ActionListener{
    	private List<int[]> mvt_perso1 = new ArrayList<int[]>();
    	private List<int[]> mvt_perso2 = new ArrayList<int[]>();
    	private int counter;
    	private Timer timer;
     
    	public Test() {
    		counter = 0;
    		timer = new Timer(42, this);
     
    		readXML();
     
    		timer.start();
    	}
     
    	// récupération des informations écrites en dur
    	// à remplacer par la lecture du xml
    	private void readXML() {
    		Random rand = new Random();
     
    		// position de départ
    		mvt_perso1.add(new int[]{200, 200});
     
    		// positions suivantes calculées à partir de la précédente + une valeur aléatoire
    		for(int i = 0 ; i < 500; i++){
    			mvt_perso1.add(new int[]{mvt_perso1.get(mvt_perso1.size()-1)[0] + (rand.nextInt(5)-2), mvt_perso1.get(mvt_perso1.size()-1)[1] + rand.nextInt(5)-2});
    		}
     
    		mvt_perso2.add(new int[]{200, 200});
    		for(int i = 0 ; i < 500; i++){
    			mvt_perso2.add(new int[]{mvt_perso2.get(mvt_perso2.size()-1)[0] + (rand.nextInt(5)-2), mvt_perso2.get(mvt_perso2.size()-1)[1] + rand.nextInt(5)-2});
    		}
    	}
     
     
    	// Méthodes de dessin
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
     
    		Graphics2D g2 = (Graphics2D)g;
    		drawPerso1(g2);
    		drawPerso2(g2);
    	}	
     
    	private void drawPerso1(Graphics2D g2) {
    		g2.setColor(Color.BLUE);
    		// Tete
    		g2.fillOval(mvt_perso1.get(counter)[0]-5, mvt_perso1.get(counter)[1]-5, 10, 10);
    		// Corps
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+5, mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+15);
    		// Membres
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+7, mvt_perso1.get(counter)[0]-5, mvt_perso1.get(counter)[1]+12);
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+7, mvt_perso1.get(counter)[0]+5, mvt_perso1.get(counter)[1]+12);
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+15, mvt_perso1.get(counter)[0]-5, mvt_perso1.get(counter)[1]+20);
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+15, mvt_perso1.get(counter)[0]+5, mvt_perso1.get(counter)[1]+20);
    	}
     
    	private void drawPerso2(Graphics2D g2) {
    		g2.setColor(Color.RED);
    		// Tete
    		g2.fillOval(mvt_perso2.get(counter)[0]-5, mvt_perso2.get(counter)[1]-5, 10, 10);
    		// Corps
    		g2.drawLine(mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+5, mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+15);
    		// Membres
    		g2.drawLine(mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+7, mvt_perso2.get(counter)[0]-5, mvt_perso2.get(counter)[1]+12);
    		g2.drawLine(mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+7, mvt_perso2.get(counter)[0]+5, mvt_perso2.get(counter)[1]+12);
    		g2.fillPolygon(new int[]{mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[0]-5, mvt_perso2.get(counter)[0]+5}, new int[]{mvt_perso2.get(counter)[1]+10, mvt_perso2.get(counter)[1]+20, mvt_perso2.get(counter)[1]+20}, 3);
    	}
     
     
    	// Action provoquée par le timer
    	public void actionPerformed(ActionEvent e) {
    		counter++;
    		if(counter==mvt_perso1.size())timer.stop();
    		else repaint();			
    	}
     
     
    	// Main
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Scène");
    		Test pan = new Test();
     
    		frame.setContentPane(pan);
     
    		frame.setSize(400, 400);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);
    	}
     
    }
    Évidemment, tu peux revoir le dessin des personnages, mais je serais très deçu !

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup

    Je pense en effet que je m'en sortirai mieux avec un timer.
    T'inquiète pas dans un 1er temps mes personnages resteront en l'état .

    Merci encore

  10. #10
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Alors ... me voila de retour ... car j'ai juste essayé de mettre une image de fond dans le JPanel et je ne vois qu'elle , mes personnages ne sont plus visibles ....

    merci

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Bon déjà je te rassure, il est tout à fait possible d'avoir les 2.
    Par contre ! pour te dire où est ton problème, il faudrait que tu fournisses du code

    Sinon, en modifiant la class que j'avais proposé plus haut, il est possible d'ajouter un attribut image ainsi qu'une méthode setBackground(Image img), comme ceci :
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
     
     
    @SuppressWarnings("serial")
    public class Test extends JPanel implements ActionListener{
    	private List<int[]> mvt_perso1 = new ArrayList<int[]>();
    	private List<int[]> mvt_perso2 = new ArrayList<int[]>();
     
    	private Image img = null;
     
    	private int counter;
    	private Timer timer;
     
    	public Test() {
    		counter = 0;
    		timer = new Timer(42, this);
     
    		readXML();
     
    		timer.start();
    	}
     
    	// récupération des informations écrites en dur
    	// à remplacer par la lecture du xml
    	private void readXML() {
    		Random rand = new Random();
     
    		// position de départ
    		mvt_perso1.add(new int[]{200, 200});
     
    		// positions suivantes calculées à partir de la précédente + une valeur aléatoire
    		for(int i = 0 ; i < 500; i++){
    			mvt_perso1.add(new int[]{mvt_perso1.get(mvt_perso1.size()-1)[0] + (rand.nextInt(5)-2), mvt_perso1.get(mvt_perso1.size()-1)[1] + rand.nextInt(5)-2});
    		}
     
    		mvt_perso2.add(new int[]{200, 200});
    		for(int i = 0 ; i < 500; i++){
    			mvt_perso2.add(new int[]{mvt_perso2.get(mvt_perso2.size()-1)[0] + (rand.nextInt(5)-2), mvt_perso2.get(mvt_perso2.size()-1)[1] + rand.nextInt(5)-2});
    		}
    	}
     
    	public void setBackground(Image img){
    		this.img = img;
    	}
     
    	// Méthodes de dessin
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
     
    		if(img!=null)g.drawImage(img, 0, 0, this);
     
    		Graphics2D g2 = (Graphics2D)g;
    		drawPerso1(g2);
    		drawPerso2(g2);
    	}	
     
    	private void drawPerso1(Graphics2D g2) {
    		g2.setColor(Color.BLUE);
    		// Tete
    		g2.fillOval(mvt_perso1.get(counter)[0]-5, mvt_perso1.get(counter)[1]-5, 10, 10);
    		// Corps
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+5, mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+15);
    		// Membres
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+7, mvt_perso1.get(counter)[0]-5, mvt_perso1.get(counter)[1]+12);
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+7, mvt_perso1.get(counter)[0]+5, mvt_perso1.get(counter)[1]+12);
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+15, mvt_perso1.get(counter)[0]-5, mvt_perso1.get(counter)[1]+20);
    		g2.drawLine(mvt_perso1.get(counter)[0], mvt_perso1.get(counter)[1]+15, mvt_perso1.get(counter)[0]+5, mvt_perso1.get(counter)[1]+20);
    	}
     
    	private void drawPerso2(Graphics2D g2) {
    		g2.setColor(Color.RED);
    		// Tete
    		g2.fillOval(mvt_perso2.get(counter)[0]-5, mvt_perso2.get(counter)[1]-5, 10, 10);
    		// Corps
    		g2.drawLine(mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+5, mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+15);
    		// Membres
    		g2.drawLine(mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+7, mvt_perso2.get(counter)[0]-5, mvt_perso2.get(counter)[1]+12);
    		g2.drawLine(mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[1]+7, mvt_perso2.get(counter)[0]+5, mvt_perso2.get(counter)[1]+12);
    		g2.fillPolygon(new int[]{mvt_perso2.get(counter)[0], mvt_perso2.get(counter)[0]-5, mvt_perso2.get(counter)[0]+5}, new int[]{mvt_perso2.get(counter)[1]+10, mvt_perso2.get(counter)[1]+20, mvt_perso2.get(counter)[1]+20}, 3);
    	}
     
     
    	// Action provoquée par le timer
    	public void actionPerformed(ActionEvent e) {
    		counter++;
    		if(counter==mvt_perso1.size())timer.stop();
    		else repaint();			
    	}
     
     
    	// Main
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Scène");
    		Test pan = new Test();
    		pan.setBackground( /*ton_image*/ );
     
    		frame.setContentPane(pan);
     
    		frame.setSize(400, 400);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);		
    	}
     
    }

  12. #12
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé comment faire ....en fait j'ai repris ton code ... et j'ai rajouté :
    monIcone.paintIcon(this,g,0,0);
    dans la methode PaintComponent ...

    et ca marche ...

    Mais comme je ne maitrise pas trop je bidouille pas mal a vrai dire ..

    merci encore ...

Discussions similaires

  1. [WD14] deplacer des objet sur une fenetre
    Par ehui_kouakess dans le forum WinDev
    Réponses: 4
    Dernier message: 09/10/2009, 14h30
  2. Deplacement des objets à l'aide des touches
    Par AmineDev9 dans le forum MFC
    Réponses: 4
    Dernier message: 07/05/2008, 16h02
  3. deplacer des objets dans un panel
    Par chris81 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/03/2008, 12h44
  4. [CS3] Dreamweaver CS3 deplacer des objet
    Par sambzh24 dans le forum Dreamweaver
    Réponses: 5
    Dernier message: 06/02/2008, 08h40
  5. Affichage images suivant une valeur
    Par Alexandr dans le forum IHM
    Réponses: 1
    Dernier message: 18/10/2006, 10h55

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