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

Agents de placement/Fenêtres Java Discussion :

Jeu 2D vue de dessus avec caméra


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut Jeu 2D vue de dessus avec caméra
    Bonjour à tous,

    Voilà, après mettre renseigner et avoir essayer seul depuis 2 semaines, je n'arrive pas à trouver une solution simple à mon problème.

    Mon but est d'avoir une map avec un personnage en vue de dessus, map créé par ces cellules de 32x32px avec une map grande. On pourrait donc déplacer notre personnage avec les touches Z, Q, S et D à travers la map, et la caméra suivrait le personnage (qui est au centre). Chaque cellule a des caractéristiques (peut-on marcher dessus, image, peut-on pêcher ...).

    Au lieu de vous montrez mes 500 lignes de codes (qui sera certainement incompréhensible), je vais vous dire comment j'ai fait pour l'instant :
    - Pour la map et la caméra, j'ai un JScrollPane avec plein de JPanel (1 JPanel = 1 cellule) et quand on tape Z par exemple, ça scroll vers le haut (effet de caméra). Je ne sais pas si c'est une bonne idée mais cela fonctionne. Cela scroll de 1px toutes les 15 millisecondes.

    Mon problème est pour mettre mon personnage centré et au-dessus des autres éléments. J'ai essayé plein de tactiques mais je ne sais pas comment placer mon personnage, dans quel panneau, comment ?
    La seul solution que j'ai trouvé et qui fonctionne me balance une erreur dans la console (bien que le rendu est correct).

    J'espère que vous pourrez m'aider, si vous voulez voir une partie de mon code demandez-moi je vous le montrerai.


    Voici une liste de mes fichiers dans mon packet Game :
    - CellPanel
    - Game
    - GameOption (pas encore utilisé)
    Dans mon packet Map :
    - Map
    - Cell
    - main.txt (fichier texte où chaque caractère est une cellule)
    J'ai aussi un packet media pour les images.

  2. #2
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Il est probable que tes 500 lignes soient mal organisées. Combien de classes définis-tu ? Il faut essayer de rendre ton code compréhensible. Pour ça, il faut que les choses aient des noms qui ont un vrai sens, et que les classes concernent de "vrais" objets, comme des cases ou des persos. Il faut essayer qu'il n'y ait pas trop de lignes par méthode. Je vois après coup que tu as Map et Cell. et Perso etc ? Apparemment le scroll marche, donc si c'est incompréhensible tu peux le modifier de façon à ce qu'il devienne compréhensible tout en continuant à fonctionner (en t'arrangeant pour le tester entre chaque sauvegarde "qui marche"). Ca s'appelle "refactoriser" et ça fait progresser rapidement.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il faut utiliser un seul JPanel. Ta zone affichée définie les coordonnées des cases à construire dans ton JPanel. Ensuite, tu affiche ton personnage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Tout d'abord, merci pour vos réponses.

    Je tenais à signaler que je connais très bien l'HTML + CSS donc s'il y a un moyen de faire les graphismes en HTML/CSS je suis preneur (voir ajouter du javascript).

    Voici mon code pour la classe Game, j'ai ajouté quelques commentaires pour vous aider (tout est en anglais), je pense que le code est assez clair, si vous avez besoin de voir d'autre classe ou si vous voulez des explications sur un bout de code demandez-moi

    Il y a d'ailleurs 400 lignes.

    Ma question est donc, la fonction hero() va retourner un JPanel avec l'image en fond du héro, je ne sais pas où ajouter ce JPanel et comment le mettre au dessus de tout (GlassPane fait ramer la caméra). De plus, le personnage ne sera pas toujours nécessairement au centre, comment faire pour le faire bouger ?

    Merci d'avance.

    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
     
    package com.game;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
     
    import javax.imageio.ImageIO;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
    import javax.swing.JLabel;
    import javax.swing.JLayeredPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollBar;
    import javax.swing.JScrollPane;
     
    import com.map.Map;
    import com.personnage.Hero;
     
    public class Game extends JFrame{
     
    	private static final long serialVersionUID = 1L;
    	JLayeredPane container = new JLayeredPane();
     
    	private static Hero perso;
     
    	private Map map;
     
    	JScrollPane scroll;
     
    	JDesktopPane jdp = new JDesktopPane();
     
    	//private int nbCellH;
    	//private int nbCellV;
     
    	private final void windowConfiguration(){
     
    		//nbCellH = (int)(getSize().width / 32);
    		//nbCellV = (int)(getSize().height / 32);
     
    		//container.add(jdp);
     
    		this.setUndecorated(true);
    		this.setExtendedState(Game.MAXIMIZED_BOTH);
    		this.setBackground(Color.BLACK);
    		this.setContentPane(container);
    		this.addKeyListener(new KeyBoardListener());
    		this.setLayout(new BorderLayout(0, 0));
    		this.setVisible(true);
    	}
     
    	private final void index(){
    		container.removeAll();
     
    		this.map = new Map("main");
     
    		map();
     
    		container.add(scroll, BorderLayout.NORTH, new Integer(0));
    		container.add(state(), BorderLayout.SOUTH, new Integer(0));
    		container.add(hero(), 2, 0); // Works but there is a bug in the console
     
    		scroll.revalidate();
    		scroll.repaint();
     
    		container.revalidate();
    		container.repaint();
    	}
     
    	public Game(Hero hero){
    		Game.perso = hero;
     
    		windowConfiguration();
     
    		index();
    	}
     
    	@SuppressWarnings("serial")
    	private final JPanel hero(){
    		JPanel hero = new JPanel(){
    			public void paintComponent(Graphics g){
    				try{
    					Image img = ImageIO.read(new File("bin/com/media/hero.png"));
    					g.drawImage(img, 0, 0, null);
    				}catch(IOException e){
    					e.printStackTrace();
    					System.exit(1);
    				}
    			}
    		};
    		hero.setBounds(getSize().width / 2, (getSize().height - 64) / 2, 32, 32);
     
    		return hero;
    	}
     
    	/**
             * Move the camera with 1px/15milliseconds
             * @param direction
             */
    	private final void move(String direction){
    		if(direction.equals("west") && map.canWalk(perso.getPosX() + 1, perso.getPosY())){
    			final JScrollBar bar = scroll.getHorizontalScrollBar();
                for(int i = 0; i < 32; i++){
                	bar.setValue(bar.getValue() + 1);
                	try{
    					Thread.sleep(15);
    				}catch(InterruptedException e1){
    					e1.printStackTrace();
    				}
                }
                perso.addPosX();
    		}else if(direction.equals("south") && map.canWalk(perso.getPosX(), perso.getPosY() + 1)){
    			final JScrollBar bar = scroll.getVerticalScrollBar();
                for(int i = 0; i < 32; i++){
                	bar.setValue(bar.getValue() + 1);
                	try{
    					Thread.sleep(15);
    				}catch(InterruptedException e1){
    					e1.printStackTrace();
    				}
                }
                perso.addPosY();
    		}else if(direction.equals("east") && map.canWalk(perso.getPosX() - 1, perso.getPosY())){
    			final JScrollBar bar = scroll.getHorizontalScrollBar();
                for(int i = 0; i < 32; i++){
                	bar.setValue(bar.getValue() - 1);
                	try{
    					Thread.sleep(15);
    				}catch(InterruptedException e1){
    					e1.printStackTrace();
    				}
                }
                perso.subtractPosX();
    		}else if(direction.equals("north") && map.canWalk(perso.getPosX(), perso.getPosY() - 1)){
    			final JScrollBar bar = scroll.getVerticalScrollBar();
                for(int i = 0; i < 32; i++){
                	bar.setValue(bar.getValue() - 1);
                	try{
    					Thread.sleep(15);
    				}catch(InterruptedException e1){
    					e1.printStackTrace();
    				}
                }
                perso.subtractPosY();
    		}
    	}
     
    	/**
             * Initializes the JPanel map with the scroll
             */
    	private final void map(){
    		JPanel map = new JPanel(new GridBagLayout());
     
    		GridBagConstraints gbc = new GridBagConstraints();
     
    		gbc.fill = GridBagConstraints.NONE;
     
    		// Put all JPanel for the map
    		for(int i = 0; i < this.map.getMap().size(); i++){
    			gbc.gridheight = 1;
    			gbc.gridwidth = 1;
    			gbc.gridy = i;
    			for(int ii = 0; ii < this.map.getMap().get(i).size(); ii++){
    				gbc.gridx = ii;
    				CellPanel square = new CellPanel(this.map.getBackground(i, ii));
    				if(ii == this.map.getMap().get(i).size() - 1){
    					gbc.gridwidth = GridBagConstraints.REMAINDER;
    				}
    				map.add(square, gbc);
    			}
    			gbc.gridwidth = GridBagConstraints.REMAINDER;
    		}
     
    		// Make the scroll
    		JScrollPane scrol = new JScrollPane(map);
    		scrol.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    		scrol.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
     
    		scrol.setMinimumSize(new Dimension(getSize().width, getSize().height - 64));
    		scrol.setPreferredSize(new Dimension(getSize().width, getSize().height - 64));
    		scrol.setSize(new Dimension(getSize().width, getSize().height - 64));
    		scrol.setMaximumSize(new Dimension(getSize().width, getSize().height - 64));
     
    		final JScrollBar barH = scrol.getHorizontalScrollBar();
    		final JScrollBar barV = scrol.getVerticalScrollBar();
     
    		barH.setValue(perso.getPosX() * 32 - getSize().width / 2);
    		barV.setValue(perso.getPosY() * 32 - getSize().height / 2);
     
    		this.scroll = scrol;
    	}
     
    	/**
             * Return JLabel which contains the Hero's life / mana / gold / xp
             * @return JPanel
             */
    	private final JPanel state(){
    		JPanel state = new JPanel();
    		JPanel life = new JPanel();
    		JPanel mana = new JPanel();
    		JPanel gold = new JPanel();
    		JPanel xp = new JPanel();
     
    		state.setPreferredSize(new Dimension(getSize().width, 64));
    		life.setPreferredSize(new Dimension(280, 28));
    		mana.setPreferredSize(new Dimension(280, 28));
    		gold.setPreferredSize(new Dimension(280, 28));
    		xp.setPreferredSize(new Dimension(280, 28));
     
    		JLabel nbGold = new JLabel(Double.toString(perso.getGold()));
    		nbGold.setFont(new Font("Arial", Font.BOLD, 14));
    		nbGold.setPreferredSize(new Dimension(236, 28));
     
    		life.add(bar("red", perso.getAllMaxLife(), perso.getLife()));
    		mana.add(bar("blue", perso.getAllMaxMana(), perso.getMana()));
    		gold.add(nbGold);
    		xp.add(bar("purple", perso.getXpMax(), perso.getXp()));
     
    		state.add(life);
    		state.add(mana);
    		state.add(gold);
    		state.add(xp);
     
    		return state;
    	}
     
    	/**
             * Return a bar to show the Hero's life / mana
             * @param color blue / red
             * @param max
             * @param cur
             */
    	@SuppressWarnings("serial")
    	private final JPanel bar(final String color, final int max, final int cur){
    		JPanel container = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
    		final Color c;
    		if(color.equals("blue")){
    			c = new Color(0, 0, 255);
    		}else if(color.equals("red")){
    			c = new Color(255, 0, 0);
    		}else if(color.equals("purple")){
    			c = new Color(255, 0, 255);
    		}else{
    			c = new Color(255, 255, 255);
    		}
    		JPanel barContainer = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
    		JPanel bar = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)){
    			public void paintComponent(Graphics g){
    				g.setColor(c);
    				try{
    					g.fillRect(0, 0, (int)(236 * cur / max), 25);
    				}catch(ArithmeticException e){
    					System.err.println("ERROR max = 0, division by 0 in com.game.Game.java - bar()");
    				}
    			}
    		};
    		JPanel image = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)){
    			public void paintComponent(Graphics g){
    				try{
    					if(color.equals("red")){
    						Image img = ImageIO.read(new File("bin/com/media/heart.png"));
    						g.drawImage(img, 0, 0, this);
    					}else if(color.equals("purple")){
    						Image img = ImageIO.read(new File("bin/com/media/xp.png"));
    						g.drawImage(img, 0, 0, this);
    					}else if(color.equals("blue")){
    						Image img = ImageIO.read(new File("bin/com/media/mana.png"));
    						g.drawImage(img, 0, 0, this);
    					}
    				}catch (IOException e){
    					e.printStackTrace();
    				}
    			}
    		};
    		JLabel write = new JLabel(cur + " / " + max);
     
    		image.setPreferredSize(new Dimension(25, 25));
    		barContainer.setPreferredSize(new Dimension(236, 40));
    		bar.setPreferredSize(new Dimension(236, 32));
    		barContainer.setBorder(BorderFactory.createLineBorder(Color.black, 1));
    		bar.setBackground(c);
     
    		write.setFont(new Font("Arial", Font.BOLD, 14));
    		write.setPreferredSize(new Dimension(226, 20));
    		write.setHorizontalAlignment(JLabel.CENTER);
     
    		bar.add(write);
    		barContainer.add(bar);
     
    		container.add(image);
    		container.add(barContainer);
     
    		return container;
    	}
     
    	/**
             * Save the game with serialize
             */
    	private final void save(){
    		ObjectOutputStream oos;
    		File file = new File("C:/Users/Portable 14/workspace/World of Chaos/saves/" + perso.getName().toLowerCase() + ".txt");
    		try{
    			oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
    			oos.writeObject(perso);
    			oos.close();
    		}catch(FileNotFoundException e){
    			e.printStackTrace();
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    	}
     
    	private class KeyBoardListener implements KeyListener{
     
    		private long lastMove = 0L; // fix a little bug
     
    		public void keyPressed(KeyEvent e){
    			if(e.getKeyCode() == 27){ // ECHAP
    				jdp.add(new Options());
    				container.revalidate();container.repaint();
    			}else if(e.getKeyCode() == 68 && System.currentTimeMillis() - lastMove > 9){ // Q
    	            move("west");
    	            lastMove = System.currentTimeMillis();
    			}else if(e.getKeyCode() == 83 && System.currentTimeMillis() - lastMove > 9){ // S
    				move("south");
    				lastMove = System.currentTimeMillis();
    			}else if(e.getKeyCode() == 81 && System.currentTimeMillis() - lastMove > 9){ // D
    				move("east");
    				lastMove = System.currentTimeMillis();
    			}else if(e.getKeyCode() == 90 && System.currentTimeMillis() - lastMove > 9){ // Z
    				move("north");
    				lastMove = System.currentTimeMillis();
    			}
    		}
     
    		public void keyReleased(KeyEvent e){
     
    		}
    		public void keyTyped(KeyEvent e){
     
    		}
    	}
     
     
    	/**
             * Doesn't work right now but doesn't matter
             */
    	private class Options extends JInternalFrame{
     
    		private static final long serialVersionUID = 3L;
     
    		public Options(){
    			this.setTitle("Options");
    			this.setClosable(true);
    			this.setResizable(false);
    			this.setSize(200, 400);
    			this.setLocation(200, 200);
    			this.setVisible(true);
     
    			JButton saveAndQuit = new JButton("Save & quit");
    			saveAndQuit.addActionListener(new ActionListener(){
    				public void actionPerformed(ActionEvent e){
    					save();
    					System.exit(0);
    				}
    			});
    			JButton quit = new JButton("Quit");
    			quit.addActionListener(new ActionListener(){
    				public void actionPerformed(ActionEvent e){
    					System.exit(0);
    				}
    			});
    			this.add(saveAndQuit);
    			this.add(quit);
    	    }     
    	  }
     
    }

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Ce n'est pas une bonne méthode que de manipuler des JPanel pour les différents éléments graphiques.
    Voici un code simpliste codée en vite flash pour illustrer mes propos :
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.image.BufferedImage;
    import java.util.Random;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class Map2D extends JPanel implements KeyListener, Runnable
    {
    	public static void main( String arg[] )
    	{
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		Map2D map = new Map2D();
    		frame.getContentPane().setLayout( new BorderLayout() );
    		frame.getContentPane().add( map, BorderLayout.CENTER );
    		frame.pack();
    		frame.addKeyListener( map );
    		frame.setVisible( true );
    		frame.setResizable( false );
    		Thread thread = new Thread( map );
    		thread.start();
    	}
     
    	private final int tile_width = 10, tile_height = 10;
    	private final int nb_tile_width = 80, nb_tile_height = 40;
    	private final int nb_vue_width = 21, nb_vue_height = 11;
    	private final int bordure_x = 5, bordure_y = 2;
     
    	private BufferedImage img_buffer;
    	private BufferedImage img_fond;
    	private BufferedImage img_perso;
    	private Graphics2D graph_fond, graph_perso, graph_buffer;
    	private int tab_tile[][] = new int[ nb_tile_width ][ nb_tile_height ];
     
    	private int x_perso = 0, y_perso = 0, x_vue = 0, y_vue = 0;
    	private boolean up, down, left, right, stop;
     
    	public Map2D()
    	{
    		addKeyListener( this );
    		Random rand = new Random();
    		for( int i = 0 ; i < nb_tile_width ; ++i )
    		{
    			for( int j = 0 ; j < nb_tile_height ; ++j )
    			{
    				tab_tile[ i ][ j ] = rand.nextInt( 5 );
    			}
    		}
     
    		img_buffer = new BufferedImage( tile_width * nb_vue_width, tile_height * nb_vue_height, BufferedImage.TYPE_INT_ARGB );
    		graph_buffer = img_buffer.createGraphics();
    		img_fond = new BufferedImage( tile_width * nb_vue_width, tile_height * nb_vue_height, BufferedImage.TYPE_INT_ARGB );
    		graph_fond = img_fond.createGraphics();
    		img_perso = new BufferedImage( tile_width, tile_height, BufferedImage.TYPE_INT_ARGB );
    		graph_perso = img_perso.createGraphics();
    		up = down = left = right = false;
    		stop = false;
    	}
     
    	private void anim_perso()
    	{
    		graph_perso.setColor( Color.BLACK );
    		graph_perso.fillRect( 0, 0, tile_width, tile_height );
    	}
     
    	private void construire( int dx, int dy )
    	{
    		graph_fond.setColor( Color.WHITE );
    		graph_fond.fillRect( 0, 0, img_fond.getWidth(), img_fond.getHeight() );
    		anim_perso();
     
    		x_perso += dx;
    		y_perso += dy;
    		if( x_perso - x_vue <= bordure_x ) { x_vue -= bordure_x; if( x_vue < 0 ) { x_vue = 0; } }
    		if( y_perso - y_vue <= bordure_y ) { y_vue -= bordure_y; if( y_vue < 0 ) { y_vue = 0; } }
    		if( x_vue + nb_vue_width - x_perso <= bordure_x ) { x_vue += bordure_x; if( x_vue + nb_vue_width >= nb_tile_width ) { x_vue = nb_tile_width - nb_vue_width; } }
    		if( y_vue + nb_vue_height - y_perso <= bordure_y ) { y_vue += bordure_y; if( y_vue + nb_vue_height >= nb_tile_height ) { y_vue = nb_tile_height - nb_vue_height; } }
     
    		for( int i = x_vue ; i < nb_vue_width + x_vue ; ++i )
    		{
    			for( int j = y_vue ; j < nb_vue_height + y_vue ; ++j )
    			{
    				switch( tab_tile[ i ][ j ] )
    				{
    					case 0: graph_fond.setColor( Color.BLUE ); break;
    					case 1: graph_fond.setColor( Color.YELLOW ); break;
    					case 2: graph_fond.setColor( Color.RED ); break;
    					case 3: graph_fond.setColor( Color.GREEN ); break;
    					default: graph_fond.setColor( Color.magenta ); break;
    				}
    				graph_fond.drawRect( ( i - x_vue ) * tile_width + 2, ( j - y_vue ) * tile_height + 2, tile_width - 4, tile_height - 4 );
    			}
    		}
     
    		graph_buffer.drawImage( img_fond, 0, 0, this );
    		graph_buffer.drawImage( img_perso, ( x_perso - x_vue ) * tile_width, ( y_perso - y_vue ) * tile_height, this );
    	}
     
    	@Override
    	public void run()
    	{
    		construire( 0, 0 );
    		repaint();
     
    		try
    		{
    			while( ! stop )
    			{
    				Thread.sleep( 50 );
    				if( up && y_perso > 0 ) { construire( 0, -1 ); }
    				else if( down && y_perso < nb_tile_height - 1 ) { construire( 0, 1 ); }
    				else if( left && x_perso > 0 ) { construire( -1, 0 ); }
    				else if( right && x_perso < nb_tile_width - 1 ) { construire( 1, 0 ); }
    				repaint();
    			}
    		}
    		catch( InterruptedException exc )
    		{
    			System.out.println( "interruption !" );
    		}
     
    		System.exit( 0 );
    	}
     
    	@Override
    	public Dimension getPreferredSize()
    	{
    		return new Dimension( img_buffer.getWidth(), img_buffer.getHeight() );
    	}
     
    	@Override
    	protected void paintComponent( Graphics graph )
    	{
    		super.paintComponent( graph );
    		graph.drawImage( img_buffer, 0, 0, this );
    	}
     
    	@Override
    	public void keyPressed( KeyEvent event )
    	{
    		if( event.getKeyCode() == KeyEvent.VK_LEFT && ! right ) { left = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_RIGHT && ! left ) { right = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_UP && ! down ) { up = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_DOWN && ! up ) { down = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_ESCAPE ) { stop = true; }
    	}
     
    	@Override
    	public void keyReleased( KeyEvent event )
    	{
    		if( event.getKeyCode() == KeyEvent.VK_LEFT ) { left = false; }
    		else if( event.getKeyCode() == KeyEvent.VK_RIGHT ) { right = false; }
    		else if( event.getKeyCode() == KeyEvent.VK_UP ) { up = false; }
    		else if( event.getKeyCode() == KeyEvent.VK_DOWN ) { down = false; }
    	}
     
    	@Override
    	public void keyTyped( KeyEvent event ){}
    }
    Tu remarqueras l'usage des BufferedImage. Pour le déplacement de la vue, indépendamment du "personnage", j'utilise les variables bordure_x et bordure_y.
    Pour tester ce programme, utilise les touches du pavé directionnel.
    Pour fermer le programme, utilise la touche Échap.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup, cela m'a l'air très complet.

    Bien entendu, je ne vais pas copier coller ton code comme un idiot, je vais analyser ton code, comprendre les différences avec mon code et modifier mon code en fonction.

    J'ai pour l'instant quelques questions :
    - Que fait @Override ?
    - Quel est la différence entre implémenté KeyListener directement dans la classe et créer une classe dans la classe (comme j'ai fait) ?
    - Est-ce que créer une classe qui extends JFrame est une mauvaise idée ou as-tu initialisé une nouvelle JFrame dans une variable comme exemple ?


    Merci encore pour votre temps et vos réponses

    EDIT : Quand on bouge dans ton code tu déplaces directement le personnage d'une case à l'autre, est-il possible de faire un effet de déplacement ? (le personnage se déplace d'une case à l'autre en disons genre 1/2 seconde sur des cases 32x32 collés).

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Aureroy Voir le message
    Merci beaucoup, cela m'a l'air très complet.

    Bien entendu, je ne vais pas copier coller ton code comme un idiot, je vais analyser ton code, comprendre les différences avec mon code et modifier mon code en fonction.
    Tu peux reprendre le code comme tu veux, ça ne me pose aucun problème
    J'ai pour l'instant quelques questions :
    - Que fait @Override ?
    C'est une annotation (existe depuis Java 1.5). Le compilateur va vérifier que la signature de la méthode existe dans une classe ou interface mère. Si ce n'est pas le cas, il sort en erreur. C'est très pratique pour être sûr de ne pas faire de faute d'orthographe dans la signature de la méthode et éviter de chercher le bug pendant des heures.
    - Quel est la différence entre implémenté KeyListener directement dans la classe et créer une classe dans la classe (comme j'ai fait) ?
    Créer une classe dans la classe n'apporte rien à part des lignes en plus. Autant je comprend l'utilité d'une classe séparée dans un autre fichier, autant l'usage d'une classe interne à usage unique me laisse de marbre.
    - Est-ce que créer une classe qui extends JFrame est une mauvaise idée ou as-tu initialisé une nouvelle JFrame dans une variable comme exemple ?
    Je te laisse lire le code que j'ai posté. Etendre JFrame n'a pas de sens ici. Je travaille sur un JPanel, j'étends donc un JPanel. La JFrame ne fait qu'afficher mon JPanel spécial.

    Merci encore pour votre temps et vos réponses

    EDIT : Quand on bouge dans ton code tu déplaces directement le personnage d'une case à l'autre, est-il possible de faire un effet de déplacement ? (le personnage se déplace d'une case à l'autre en disons genre 1/2 seconde sur des cases 32x32 collés).
    Tu pourrais chercher un peu...
    Mais voici un exemple possible. J'ai également fait un défilement "doux" pour la map :
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.image.BufferedImage;
    import java.util.Random;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class Map2D extends JPanel implements KeyListener, Runnable
    {
    	public static void main( String arg[] )
    	{
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		Map2D map = new Map2D();
    		frame.getContentPane().setLayout( new BorderLayout() );
    		frame.getContentPane().add( map, BorderLayout.CENTER );
    		frame.pack();
    		frame.addKeyListener( map );
    		frame.setVisible( true );
    		frame.setResizable( false );
    		Thread thread = new Thread( map );
    		thread.start();
    	}
     
    	private final int tile_width = 32, tile_height = 32;
    	private final int nb_tile_width = 40, nb_tile_height = 20;
    	private final int nb_vue_width = 10, nb_vue_height = 10;
    	private final int bordure_x = 2, bordure_y = 2;
     
    	private BufferedImage img_buffer;
    	private BufferedImage img_fond;
    	private BufferedImage img_perso;
    	private Graphics2D graph_fond, graph_perso, graph_buffer;
    	private int tab_tile[][] = new int[ nb_tile_width ][ nb_tile_height ];
     
    	private int x_perso = 0, y_perso = 4, x_vue = 0, y_vue = 0;
    	private boolean up, down, left, right, stop;
     
    	public Map2D()
    	{
    		addKeyListener( this );
    		Random rand = new Random();
    		for( int i = 0 ; i < nb_tile_width ; ++i )
    		{
    			for( int j = 0 ; j < nb_tile_height ; ++j )
    			{
    				tab_tile[ i ][ j ] = rand.nextInt( 5 );
    			}
    		}
     
    		img_buffer = new BufferedImage( tile_width * nb_vue_width, tile_height * nb_vue_height, BufferedImage.TYPE_INT_ARGB );
    		graph_buffer = img_buffer.createGraphics();
    		img_fond = new BufferedImage( tile_width * ( nb_vue_width + bordure_x ), tile_height * ( nb_vue_height + bordure_y ), BufferedImage.TYPE_INT_ARGB );
    		graph_fond = img_fond.createGraphics();
    		img_perso = new BufferedImage( tile_width, tile_height, BufferedImage.TYPE_INT_ARGB );
    		graph_perso = img_perso.createGraphics();
    		up = down = left = right = false;
    		stop = false;
    	}
     
    	private void anim_perso()
    	{
    		graph_perso.setColor( Color.LIGHT_GRAY );
    		graph_perso.fillRect( 0, 0, tile_width, tile_height );
    	}
     
    	private void construire( int dx, int dy )
    	{
    		if( x_perso + dx < 0 || x_perso + dx >= nb_tile_width || y_perso + dy < 0 || y_perso + dy >= nb_tile_height ) { return; }
     
    		graph_fond.setColor( Color.WHITE );
    		graph_fond.fillRect( 0, 0, img_fond.getWidth(), img_fond.getHeight() );
    		anim_perso();
     
    		int x_vue_old = x_vue;
    		int y_vue_old = y_vue;
    		int x_old = x_perso;
    		int y_old = y_perso;
    		x_perso += dx;
    		y_perso += dy;
    		int temp_bordure_x = bordure_x;
    		int temp_bordure_y = bordure_y;
    		if( x_perso - x_vue <= temp_bordure_x ) { x_vue -= temp_bordure_x; if( x_vue < 0 ) { temp_bordure_x -= x_vue; x_vue = 0; } }
    		if( y_perso - y_vue <= temp_bordure_y ) { y_vue -= temp_bordure_y; if( y_vue < 0 ) { temp_bordure_y -= y_vue; y_vue = 0; } }
     
    		if( x_vue + nb_vue_width - x_perso <= temp_bordure_x )
    		{
    			x_vue += temp_bordure_x;
    			if( x_vue + nb_vue_width > nb_tile_width )
    			{
    				temp_bordure_x -= x_vue + nb_vue_width - nb_tile_width;
    				x_vue = nb_tile_width - nb_vue_width;
    			}
    		}
    		if( y_vue + nb_vue_height - y_perso <= temp_bordure_y )
    		{
    			y_vue += temp_bordure_y;
    			if( y_vue + nb_vue_height > nb_tile_height )
    			{
    				temp_bordure_y -= y_vue + nb_vue_height - nb_tile_height;
    				y_vue = nb_tile_height - nb_vue_height;
    			}
    		}
     
    		for( int i = 0 ; i < nb_vue_width + ( x_vue_old != x_vue ? temp_bordure_x : 0 ) ; ++i )
    		{
    			for( int j = 0 ; j < nb_vue_height + ( y_vue_old != y_vue ? temp_bordure_y : 0 ) ; ++j )
    			{
    				int tab_x = i + ( x_vue_old < x_vue ? x_vue_old : x_vue );
    				int tab_y = j + ( y_vue_old < y_vue ? y_vue_old : y_vue );
    				switch( tab_tile[ tab_x ][ tab_y ] )
    				{
    					case 0: graph_fond.setColor( Color.BLUE ); break;
    					case 1: graph_fond.setColor( Color.YELLOW ); break;
    					case 2: graph_fond.setColor( Color.RED ); break;
    					case 3: graph_fond.setColor( Color.GREEN ); break;
    					default: graph_fond.setColor( Color.GRAY ); break;
    				}
    				graph_fond.drawRect( i * tile_width + 2, j * tile_height + 2, tile_width - 4, tile_height - 4 );
    			}
    		}
     
    		int move_perso_x = ( x_old - x_vue_old ) * tile_width;
    		int move_perso_y = ( y_old - y_vue_old ) * tile_height;
    		int move_vue_x = ( x_vue_old <= x_vue ? 0 : - temp_bordure_x * tile_width );
    		int move_vue_y = ( y_vue_old <= y_vue ? 0 : - temp_bordure_y * tile_height );
     
    		do
    		{
    			move_perso_x += dx;
    			move_perso_y += dy;
    			move_vue_x -= ( x_vue_old != x_vue ? dx * temp_bordure_x : 0 );
    			move_vue_y -= ( y_vue_old != y_vue ? dy * temp_bordure_y : 0 );
     
    			graph_buffer.drawImage( img_fond, move_vue_x, move_vue_y, this );
    			graph_buffer.drawImage( img_perso,
    					move_perso_x + move_vue_x + ( x_vue_old <= x_vue ? 0 : temp_bordure_x * tile_width ),
    					move_perso_y + move_vue_y + ( y_vue_old <= y_vue ? 0 : temp_bordure_y * tile_height ), this );
    			repaint();
    			try { Thread.sleep( Math.abs( dx ) * 500 / tile_width + Math.abs( dy ) * 500 / tile_height ); } catch( InterruptedException exc ){}
    		} while( move_perso_x != ( x_perso - x_vue_old ) * tile_width || move_perso_y != ( y_perso - y_vue_old ) * tile_height );
    	}
     
    	@Override
    	public void run()
    	{
    		construire( 0, 0 );
     
    		try
    		{
    			while( ! stop )
    			{
    				if( up && y_perso > 0 ) { construire( 0, -1 ); }
    				else if( down && y_perso < nb_tile_height - 1 ) { construire( 0, 1 ); }
    				else if( left && x_perso > 0 ) { construire( -1, 0 ); }
    				else if( right && x_perso < nb_tile_width - 1 ) { construire( 1, 0 ); }
    				else { Thread.sleep( 100 ); }
    			}
    		}
    		catch( InterruptedException exc )
    		{
    			System.out.println( "interruption !" );
    		}
     
    		System.exit( 0 );
    	}
     
    	@Override
    	public Dimension getPreferredSize()
    	{
    		return new Dimension( img_buffer.getWidth(), img_buffer.getHeight() );
    	}
     
    	@Override
    	protected void paintComponent( Graphics graph )
    	{
    		super.paintComponent( graph );
    		graph.drawImage( img_buffer, 0, 0, this );
    	}
     
    	@Override
    	public void keyPressed( KeyEvent event )
    	{
    		if( event.getKeyCode() == KeyEvent.VK_LEFT && ! right ) { left = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_RIGHT && ! left ) { right = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_UP && ! down ) { up = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_DOWN && ! up ) { down = true; }
    		else if( event.getKeyCode() == KeyEvent.VK_ESCAPE ) { stop = true; }
    	}
     
    	@Override
    	public void keyReleased( KeyEvent event )
    	{
    		if( event.getKeyCode() == KeyEvent.VK_LEFT ) { left = false; }
    		else if( event.getKeyCode() == KeyEvent.VK_RIGHT ) { right = false; }
    		else if( event.getKeyCode() == KeyEvent.VK_UP ) { up = false; }
    		else if( event.getKeyCode() == KeyEvent.VK_DOWN ) { down = false; }
    	}
     
    	@Override
    	public void keyTyped( KeyEvent event ){}
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 385
    Points
    20 385
    Par défaut
    juste une remarque : éviter à tout prix l'utilisation de thread avant que tout ne soit bien finalisé...
    tu démarres un thread mais tu n'est pas certain que tout s'affiche correctement
    Le gros problème des threads c'est la synchronisation avec le reste donc toujours commencer par faire simple pour optimiser ensuite

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup, ta classe toute seule fonctionne très bien mais je l'ai essayé dans ma JFrame est le personnage de bouge pas quand je tape les touches. Voilà le code que j'ai dans ma classe Main (la JFrame) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MapPanel mapPanel = new MapPanel();
     
    Thread map = new Thread(mapPanel);
    map.start();
     
    container.add(mapPanel);
    container est le JPanel qui contient tout les autres JPanel.

    La raison pour laquelle je fais ça est que si un combat s'engage, je vide le JPanel container, je lance le combat, puis à la fin du combat, on recharge la map. Auriez-vous une idée de pourquoi le KeyListener a l'air de ne pas fonctionner dans ce cas là ? Merci

    Mat.M : Merci pour ta remarque j'en tiendrai compte pour éviter les bugs (quand ça fonctionnera)

  10. #10
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    juste une remarque : éviter à tout prix l'utilisation de thread avant que tout ne soit bien finalisé...
    tu démarres un thread mais tu n'est pas certain que tout s'affiche correctement
    Le gros problème des threads c'est la synchronisation avec le reste donc toujours commencer par faire simple pour optimiser ensuite
    Dans le code présenté, l'usage du thread n'a rien à voir avec une quelconque optimisation.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  11. #11
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Aureroy Voir le message
    Merci beaucoup, ta classe toute seule fonctionne très bien mais je l'ai essayé dans ma JFrame est le personnage de bouge pas quand je tape les touches. Voilà le code que j'ai dans ma classe Main (la JFrame) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MapPanel mapPanel = new MapPanel();
     
    Thread map = new Thread(mapPanel);
    map.start();
     
    container.add(mapPanel);
    container est le JPanel qui contient tout les autres JPanel.

    La raison pour laquelle je fais ça est que si un combat s'engage, je vide le JPanel container, je lance le combat, puis à la fin du combat, on recharge la map. Auriez-vous une idée de pourquoi le KeyListener a l'air de ne pas fonctionner dans ce cas là ? Merci
    Dans le constructeur de Map, il faut ajouter la ligne :
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  12. #12
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    En effet, cela fonctionne parfaitement, merci infiniment pour ton aide.
    Il ne me manque plus qu'à remplacer les carrés par les images correspondantes, tout en modifiant le code pour qu'il convienne à mon projet. Je pense que je devrais y arriver tout seul, si j'ai encore besoin d'aide je reposterai ici.

    Merci énormément à tout ceux qui ont répondu à mon sujet, bonne continuation à vous !

  13. #13
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Effectivement j'ai une erreur et après avoir cherché, je crois avoir trouvé les lignes qui bug mais je n'ai aucune idée de pourquoi cela bug comme ça.

    En gros, j'ai réussi à afficher ma map (avec les images), mais la caméra ne bouge pas comme je veux, en gros, je veux que mon personnage soit toujours centré, et si mon personnage ne peut pas être centré (car la vue peut pas être inférieur à 0), alors il n'est plus centré. Ce qui veut dire que si je peux bouger la caméra, le personnage restera au centre, si la caméra ne peut pas bouger, le personnage bougera. Si la map peut bouger mais que le personnage n'est pas au centre, alors le personnage bouge (pour revenir au centre).
    Je ne sais pas si c'est clair mais voilà le code en entier :

    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    package com.game;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.image.BufferedImage;
     
    import javax.swing.JPanel;
     
    import com.map.Map;
    import com.personnage.Hero;
     
     
    public class MapPanel extends JPanel implements KeyListener, Runnable{
     
    	private static final long serialVersionUID = 3L;
     
    	private final int nb_tile_width, nb_tile_height;
    	private int nb_vue_width, nb_vue_height;
     
    	private BufferedImage bufferImage;
    	private BufferedImage backgroundImage;
    	private BufferedImage persoImage;
    	private Graphics2D graph_fond, graph_perso, graph_buffer;
     
    	private int x_perso, y_perso, x_vue = 0, y_vue = 0;
    	private boolean north, south, west, east, stop;
     
    	private Map map;
     
    	public MapPanel(Map map, Hero hero, int sizeX, int sizeY){
    		this.map = map;
    		nb_tile_width = map.getMap().get(0).size();
    		nb_tile_height = map.getMap().size();
    		setFocusable(true);
    		addKeyListener(this);
    		nb_vue_width = (sizeX / 32 % 2 == 1) ? (int)(sizeX / 32) : (int)(sizeX / 32 - 1); 
    		nb_vue_height = (sizeY / 32 % 2 == 1) ? (int)(sizeY / 32) : (int)(sizeY / 32 - 1);
    		x_perso = (nb_vue_width - 1) / 2;
    		y_perso = (nb_vue_height - 1) / 2;
     
    		bufferImage = new BufferedImage(32 * nb_vue_width, 32 * nb_vue_height, BufferedImage.TYPE_INT_ARGB);
    		graph_buffer = bufferImage.createGraphics();
    		backgroundImage = new BufferedImage(32 * (nb_vue_width + 1), 32 * (nb_vue_height + 1), BufferedImage.TYPE_INT_ARGB);
    		graph_fond = backgroundImage.createGraphics();
    		persoImage = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);
    		graph_perso = persoImage.createGraphics();
    		north = south = west = east = false;
    		stop = false;
    	}
     
    	final private void anim_perso(){
    		graph_perso.setColor(Color.LIGHT_GRAY);
    		graph_perso.fillRect(0, 0, 32, 32);
    	}
     
    	final private void build(int dx, int dy){
    		if(x_perso + dx < 0 || x_perso + dx >= nb_tile_width || y_perso + dy < 0 || y_perso + dy >= nb_tile_height) { return; }
     
    		graph_fond.setColor(Color.WHITE);
    		graph_fond.fillRect(0, 0, backgroundImage.getWidth(), backgroundImage.getHeight());
    		anim_perso();
     
    		int x_vue_old = x_vue;
    		int y_vue_old = y_vue;
    		int x_old = x_perso;
    		int y_old = y_perso;
    		x_perso += dx;
    		y_perso += dy;
     
    		if(x_old == (x_vue_old + nb_vue_width - 1) / 2) x_vue += dx;
    		if(y_old == (y_vue_old + nb_vue_height - 1) / 2) y_vue += dy;
    		if(x_vue < 0) x_vue = 0;
    		if(y_vue < 0) y_vue = 0;
    		if(x_vue > nb_tile_width - nb_vue_width - 1) x_vue = nb_tile_width - nb_vue_width - 1;
    		if(y_vue > nb_tile_height - nb_vue_height - 1) y_vue = nb_tile_height - nb_vue_height - 1;
     
    		if(x_vue + nb_vue_width - x_perso <= 1){
    			x_vue ++;
    			if(x_vue + nb_vue_width > nb_tile_width){
    				x_vue = nb_tile_width - nb_vue_width;
    			}
    		}
    		if(y_vue + nb_vue_height - y_perso <= 1){
    			y_vue ++;
    			if(y_vue + nb_vue_height > nb_tile_height){
    				y_vue = nb_tile_height - nb_vue_height;
    			}
    		}
     
    		for(int i = 0 ; i < nb_vue_width + (x_vue_old != x_vue ? 1 : 0) ; ++i){
    			for(int j = 0 ; j < nb_vue_height + (y_vue_old != y_vue ? 1 : 0) ; ++j){
    				graph_fond.clearRect(i * 32, j * 32, 32, 32);
    				graph_fond.drawImage(this.map.getBackground(i, j), i * 32, j * 32, null);
    			}
    		}
     
    		int move_perso_x = (x_old - x_vue_old) * 32;
    		int move_perso_y = (y_old - y_vue_old) * 32;
    		int move_vue_x = (x_vue_old <= x_vue ? 0 : -1 * 32);
    		int move_vue_y = (y_vue_old <= y_vue ? 0 : -1 * 32);
     
    		do{
    			move_perso_x += dx;
    			move_perso_y += dy;
    			move_vue_x -= (x_vue_old != x_vue ? dx : 0);
    			move_vue_y -= (y_vue_old != y_vue ? dy : 0);
     
    			graph_buffer.drawImage(backgroundImage, move_vue_x, move_vue_y, this);
    			graph_buffer.drawImage(persoImage,
    					move_perso_x + move_vue_x + (x_vue_old <= x_vue ? 0 : 1 * 32),
    					move_perso_y + move_vue_y + (y_vue_old <= y_vue ? 0 : 1 * 32), this);
    			repaint();
    			try { Thread.sleep(Math.abs(dx) * 500 / 32 + Math.abs(dy) * 500 / 32); } catch(InterruptedException exc){}
    		}while(move_perso_x != (x_perso - x_vue_old) * 32 || move_perso_y != (y_perso - y_vue_old) * 32);
    	}
     
    	@Override
    	public void run(){
    		build(0, 0);
     
    		try{
    			while(!stop){
    				if(north && y_perso > 0) build(0, -1);
    				else if(south && y_perso < nb_tile_height - 1) build(0, 1);
    				else if(west && x_perso > 0) build(-1, 0);
    				else if(east && x_perso < nb_tile_width - 1) build(1, 0);
    				else Thread.sleep(100);
    			}
    		}
    		catch(InterruptedException e){
    			e.printStackTrace();
    			System.exit(1);
    		}
     
    		System.exit(0);
    	}
     
    	@Override
    	public Dimension getPreferredSize(){
    		return new Dimension(bufferImage.getWidth(), bufferImage.getHeight());
    	}
     
    	@Override
    	protected void paintComponent(Graphics graph){
    		super.paintComponent(graph);
    		graph.drawImage(bufferImage, 0, 0, this);
    	}
     
    	@Override
    	public void keyPressed(KeyEvent event){
    		if(event.getKeyCode() == 90 && !south) north = true;
    		else if(event.getKeyCode() == 68 && !west) east = true;
    		else if(event.getKeyCode() == 81 && !east) west = true;
    		else if(event.getKeyCode() == 83 && !north) south = true;
    		else if(event.getKeyCode() == 27) stop = true;
    	}
     
    	@Override
    	public void keyReleased(KeyEvent event){
    		if(event.getKeyCode() == 90) north = false;
    		else if(event.getKeyCode() == 68) east = false;
    		else if(event.getKeyCode() == 81) west = false;
    		else if(event.getKeyCode() == 83) south = false;
    	}
     
    	@Override
    	public void keyTyped(KeyEvent event){}
    }
    Et je crois que les lignes qui bug sont dans le début de la fonction build (j'ai renommé quelques variables pour respecter les conventions) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(x_old == (x_vue_old + nb_vue_width - 1) / 2) x_vue += dx;
    if(y_old == (y_vue_old + nb_vue_height - 1) / 2) y_vue += dy;
    if(x_vue < 0) x_vue = 0;
    if(y_vue < 0) y_vue = 0;
    if(x_vue > nb_tile_width - nb_vue_width - 1) x_vue = nb_tile_width - nb_vue_width - 1;
    if(y_vue > nb_tile_height - nb_vue_height - 1) y_vue = nb_tile_height - nb_vue_height - 1;
    Merci d'avance

    EDIT : nb_vue_width et nb_vue_height sont des nombres impairs

  14. #14
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Bon, après 2 jours de recherches j'ai enfin réussi à faire fonctionné mon code, merci à tout le monde !

    Si vous voulez voir ce qu'est mon code maintenant, le voici :

    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
    package com.game;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.image.BufferedImage;
     
     
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    import com.map.Map;
    import com.personnage.Hero;
     
     
    public class MapPanel extends JPanel implements KeyListener, Runnable{
     
    	private static final long serialVersionUID = 3L;
     
    	private final int nb_tile_width, nb_tile_height;
    	private int nb_vue_width, nb_vue_height;
     
    	private BufferedImage bufferImage;
    	private BufferedImage backgroundImage;
    	private BufferedImage persoImage;
    	private Graphics2D graph_fond, graph_perso, graph_buffer;
     
    	private int x_perso, y_perso, x_vue = 0, y_vue = 0;
    	private boolean north, south, west, east, stop;
     
    	private Map map;
     
    	public MapPanel(Map map, Hero hero, int sizeX, int sizeY){
    		this.map = map;
    		nb_tile_width = map.getMap().get(0).size();
    		nb_tile_height = map.getMap().size();
    		setFocusable(true);
    		addKeyListener(this);
    		nb_vue_width = (sizeX / 32 % 2 == 1) ? (int)(sizeX / 32) : (int)(sizeX / 32 - 1); 
    		nb_vue_height = (sizeY / 32 % 2 == 1) ? (int)(sizeY / 32) : (int)(sizeY / 32 - 1);
    		x_perso = (nb_vue_width - 1) / 2;
    		y_perso = (nb_vue_height - 1) / 2;
     
    		bufferImage = new BufferedImage(32 * nb_vue_width, 32 * nb_vue_height, BufferedImage.TYPE_INT_ARGB);
    		graph_buffer = bufferImage.createGraphics();
    		backgroundImage = new BufferedImage(32 * (nb_vue_width + 1), 32 * (nb_vue_height + 1), BufferedImage.TYPE_INT_ARGB);
    		graph_fond = backgroundImage.createGraphics();
    		persoImage = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);
    		graph_perso = persoImage.createGraphics();
    		north = south = west = east = false;
    		stop = false;
    	}
     
    	final private void anim_perso(){
    		/*graph_perso.setColor(Color.LIGHT_GRAY);
    		graph_perso.fillRect(0, 0, 32, 32);*/
    		try{
    			Image hero = ImageIO.read(new File("bin/com/media/hero.png"));
    			graph_perso.drawImage(hero, 0, 0, null);
    		}catch(IOException e){
    			e.printStackTrace();
    			System.exit(1);
    		}
    	}
     
    	final private void build(int dx, int dy){
    		if(x_perso + dx < 0 || x_perso + dx >= nb_tile_width || y_perso + dy < 0 || y_perso + dy >= nb_tile_height) return;
    		// TODO return if can't walk
     
    		graph_fond.setColor(Color.WHITE);
    		graph_fond.fillRect(0, 0, backgroundImage.getWidth(), backgroundImage.getHeight());
    		anim_perso();
     
    		int x_vue_old = x_vue;
    		int y_vue_old = y_vue;
    		int x_old = x_perso;
    		int y_old = y_perso;
    		x_perso += dx;
    		y_perso += dy;
     
    		if(x_old == x_vue + (nb_vue_width) / 2) x_vue += dx;
    		if(y_old == y_vue + (nb_vue_height) / 2) y_vue += dy;
    		if(x_vue < 0) x_vue = 0;
    		if(y_vue < 0) y_vue = 0;
    		if(x_vue > nb_tile_width - nb_vue_width - 1) x_vue = nb_tile_width - nb_vue_width - 1;
    		if(y_vue > nb_tile_height - nb_vue_height - 1) y_vue = nb_tile_height - nb_vue_height - 1;
     
    		for(int i = 0 ; i < nb_vue_width + (x_vue_old != x_vue ? 1 : 0) ; ++i){
    			for(int j = 0 ; j < nb_vue_height + (y_vue_old != y_vue ? 1 : 0) ; ++j){
    				graph_fond.clearRect(i * 32, j * 32, 32, 32);
    				graph_fond.drawImage(this.map.getBackground(i + x_vue_old, j + y_vue_old), i * 32, j * 32, null);
    			}
    		}
     
    		int move_perso_x = (x_old - x_vue_old) * 32;
    		int move_perso_y = (y_old - y_vue_old) * 32;
    		int move_vue_x = (x_vue_old <= x_vue ? 0 : -1 * 32);
    		int move_vue_y = (y_vue_old <= y_vue ? 0 : -1 * 32);
     
    		do{
    			move_perso_x += dx;
    			move_perso_y += dy;
    			move_vue_x -= (x_vue_old != x_vue ? dx : 0);
    			move_vue_y -= (y_vue_old != y_vue ? dy : 0);
     
    			graph_buffer.drawImage(backgroundImage, move_vue_x, move_vue_y, this);
    			graph_buffer.drawImage(persoImage,
    					move_perso_x + move_vue_x + (x_vue_old <= x_vue ? 0 : 1 * 32),
    					move_perso_y + move_vue_y + (y_vue_old <= y_vue ? 0 : 1 * 32), this);
    			repaint();
    			try{Thread.sleep(Math.abs(dx) * 500 / 32 + Math.abs(dy) * 500 / 32);}catch(InterruptedException exc){}
    		}while(move_perso_x != (x_perso - x_vue_old) * 32 || move_perso_y != (y_perso - y_vue_old) * 32);
    	}
     
    	@Override
    	public void run(){
    		build(0, 0);
     
    		try{
    			while(!stop){
    				if(north && y_perso > 0) build(0, -1);
    				else if(south && y_perso < nb_tile_height - 1) build(0, 1);
    				else if(west && x_perso > 0) build(-1, 0);
    				else if(east && x_perso < nb_tile_width - 1) build(1, 0);
    				else Thread.sleep(100);
    			}
    		}
    		catch(InterruptedException e){
    			e.printStackTrace();
    			System.exit(1);
    		}
     
    		System.exit(0);
    	}
     
    	@Override
    	public Dimension getPreferredSize(){
    		return new Dimension(bufferImage.getWidth(), bufferImage.getHeight());
    	}
     
    	@Override
    	protected void paintComponent(Graphics graph){
    		super.paintComponent(graph);
    		graph.drawImage(bufferImage, 0, 0, this);
    	}
     
    	@Override
    	public void keyPressed(KeyEvent event){
    		if(event.getKeyCode() == 90 && !south) north = true;
    		else if(event.getKeyCode() == 68 && !west) east = true;
    		else if(event.getKeyCode() == 81 && !east) west = true;
    		else if(event.getKeyCode() == 83 && !north) south = true;
    		else if(event.getKeyCode() == 27) stop = true;
    	}
     
    	@Override
    	public void keyReleased(KeyEvent event){
    		if(event.getKeyCode() == 90) north = false;
    		else if(event.getKeyCode() == 68) east = false;
    		else if(event.getKeyCode() == 81) west = false;
    		else if(event.getKeyCode() == 83) south = false;
    	}
     
    	@Override
    	public void keyTyped(KeyEvent event){}
    }
    Merci encore pour toute l'aide apportée !

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

Discussions similaires

  1. [BUG]Select toujours au dessus avec IE
    Par Jibees dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 19/09/2007, 14h38
  2. Minimap vue de dessus
    Par antalares dans le forum OpenGL
    Réponses: 1
    Dernier message: 02/05/2007, 12h02
  3. image qui s'affiche au dessus avec souris au passage sur un lien
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 18/09/2006, 22h55
  4. Projet jeu RPG/moteur 3D isométrique avec SDL
    Par Milan111 dans le forum Projets
    Réponses: 4
    Dernier message: 13/04/2006, 22h01
  5. PB de vue utilisant UNION avec ENTERPRISE MANAGER
    Par punglas dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/12/2004, 15h18

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