Bonsoir,
je programme un jeu de puzzle en java et je vx savoir svp comment enregistrer les parties non terminées pour les terminer après.
grand Merci pr vs.
Version imprimable
Bonsoir,
je programme un jeu de puzzle en java et je vx savoir svp comment enregistrer les parties non terminées pour les terminer après.
grand Merci pr vs.
Allo,
La façon la plus simple, si tu n'as qu'un object qui décrit la partie, serait de rendre la classe sérialisable. Tu pourais ensuite enregistrer l'objet dans un fichier et le recharger plus tard.
Regarde l'interface http://download.oracle.com/javase/6/...ializable.html à implémenter sur ta classe.
Ensuite tu peux écrire l'objet dans un fichier avec http://download.oracle.com/javase/6/...putStream.html
Regarde les explications de ces deux pages. Le second a un exemple avec un fichier.
Merci pour votre réponse Monsieur, la classe que je veux sérialiser est la suivante:
je ne sais pas vraiment très bien comment faire, car je dois enregistrer les dernières pièces ainsi que leurs positions sur l’écran. A l'ouverture du fichier enregistré toutes les pièces doivent se positionner là où elles étaient. Merci beaucoup pour votre aide.Code:
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
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471 package puzzle; import java.awt.*; import java.awt.image.*; import java.util.*; import java.io.*; /** * dans chaque piece on sait comment les bords doivent êtres dessiner et les pieces aussi voisines */ public class Piece implements Serializable { //un id qui represente l'id de la piece suivante private static int nextId = 0; //une piece doit être proche de ca voisine par ce nombre de pixel public static final int posClose = 7; //une piece doit être comprise dans cette marge pour être considere comme alignée avec sa voisine public static final int rotClose = 5; /* * creation de nouveau piece * @param data image data * @param imageX position X de l'image par rapport au puzzle entier * @param imageY position Y de l'image par rapport au puzzle entier * @param imageWidth la largeur de l'image de la piece * @param imageHeight la hauteur de l'image de la piece * @param totalWidth la largeur de l'image entiere * @param totalHeight la heuteur de l'image entiere */ protected Piece(int[] data, int imageX, int imageY, int imageWidth, int imageHeight, int totalWidth, int totalHeight) { id = nextId++; neighbors = new HashSet(); this.curWidth = this.origWidth = imageWidth; this.curHeight = this.origHeight = imageHeight; origData = data; this.imageX = imageX; this.imageY = imageY; this.totalWidth = totalWidth; this.totalHeight = totalHeight; // calculer le hash code: if (data != null) { int temp = 0; for(int i = 0; i < data.length; i++) { temp += data[i]; } this.hash = temp; } else { this.hash = 0; } } /** * @param rotation initial rotation */ public Piece(int[] data, int imageX, int imageY, int imageWidth, int imageHeight, int totalWidth, int totalHeight, int rotation) { this (data, imageX, imageY, imageWidth, imageHeight, totalWidth, totalHeight); forceSetRotation (rotation); } //constructeur de copie public Piece(Piece p) { this(p.getOrigData(), p.getImageX(), p.getImageY(), p.getImageWidth(), p.getImageHeight(), p.getTotalWidth(), p.getTotalHeight(), p.getRotation()); } //Id de la piece protected int id; //Emplacement dans l'image int imageX, imageY; // Taille de l'image. int totalWidth, totalHeight; //Emplacement dans l'image ajuster par la rotation actuel int rotatedX, rotatedY; //les pieces considerés comme voisin de celle-ci //Seulement les pieces qui peuvent être collée protected Set neighbors; //la taille de l'image original protected int origWidth, origHeight; int[] origData; //la taille actuel apres totation protected int curWidth, curHeight; int[] curData; //emplacement dans le pannel int puzzleX, puzzleY; //dernier point cliquer int transX, transY; /** constante hash code de la piece. */ protected int hash; //image de la piece Image image; //une rotation entre 0-359 dans le sens horlogique int rotation; //------------------------------------------------------------ //retourner l'id de la piece public int getId() {return id;} //retourne la rotation actuelle de la piece public int getRotation() { return rotation; } /**si la rotation actuelle est differente, le data de l'image sera recalculer * @throws IllegalArgumentException si la rotation n'est pas entre [0,359] */ public void setRotation (int rot) { if (rot == rotation) return; forceSetRotation (rot); } /** definir la rotation de la piece * cette methode force le recalcule de l'image * @throws IllegalArgumentException si la rotation n'est pas entre [0,359] */ protected void forceSetRotation (int rot) { if ((rot < 0) || (rot > 359)) throw new IllegalArgumentException("rotation invalide: "+rot); // ne permettre qu'une roation de 0, 90, 180, 270. if (rot % 90 != 0) { int newRot = rot / 90; System.out.println ("rotation invalide "+rot+"; utiliser plutot "+newRot); rot = newRot; } rotation = rot; recomputeImageData(); if (image != null) image.flush(); image = Toolkit.getDefaultToolkit().createImage ( new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth)); } // Fulshe sert a vider le buffer public void flushImage() { if (image!= null) { image.flush(); } image = Toolkit.getDefaultToolkit().createImage ( new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth)); } /* * la position des pieces par rapport au puzzle */ public void setPuzzlePosition (int x, int y) { this.puzzleX = x; this.puzzleY = y; } /* * retourne la hauteur actuelle de la piece en pixel */ public int getCurrentHeight() { return curHeight; } /* * retourne la largeur actuelle de la piece en pixel */ public int getCurrentWidth() { return curWidth; } /** Retourne la largeur de toute l'image dans son orientation actuelle . */ public int getTotalWidth() { return totalWidth; } /** Retourne la hauteur de toute l'image dans son orientation actuelle */ public int getTotalHeight() { return totalHeight; } /* * Retourne la hauteur de la piece dans son orientation original. */ public int getImageHeight() { return origHeight; } /* * Retourne la largeur de la piece dans son orientation original. */ public int getImageWidth() { return origWidth; } /**Retourne la position X de la piece dans l'image originale.*/ public int getImageX() { return imageX; } /**Retourne la position Y de la piece dans l'image originale.*/ public int getImageY() { return imageY; } /**Retourne la position X de la piece dans l'image originale modifier par sa rotation actuelle.*/ public int getRotatedX() { return rotatedX; } /**Retourne la position Y de la piece dans l'image originale modifier par sa rotation actuelle.*/ public int getRotatedY() { return rotatedY; } /*Retourne la position X dans l'image originale modifier par la rotation donnée*/ public int getRotatedX(int rotation) { return rotatedX; } /*Retourne la position Y dans l'image originale modifier par la rotation donnée*/ public int getRotatedY(int rotation) { return rotatedY; } /*Retourne la position X dans le puzzle*/ public int getPuzzleX() { return puzzleX; } /*Retourne la position Y dans le puzzle*/ public int getPuzzleY() { return puzzleY; } /** Retourne thie Piece's transX */ public int getTransX() {return transX; } //retourne la derniere position X du clique sur la piece public void setTransX(int x) {transX = x;} /** Retourne Piece's transY */ public int getTransY() {return transY; } //retourne la derniere position Y du clique sur la piece public void setTransY(int y) {transY = y;} public HashSet getNeighbors() { return (HashSet)neighbors; } public void setNeighbors(HashSet neighbors) { this.neighbors = neighbors; } /* * retourne l'image de la piece actuelle. */ public Image getImage () { return image; } /*Retourne le data de la piece actuelle*/ public int[] getCurrData() {return curData; } public void setCurrData(int[] data) { curData = data; } /** retourne le data original de la piece */ public int[] getOrigData() { return this.origData; } public void setOrigData(int[] data) { this.origData = data; } public int hashCode() { return hash+rotation; } /** * ajouter une piece au voisinage de ces pieces * @throws NullPointerException s il n existe pas de voisin */ public void addNeighbor (Piece neighbor) { if (neighbor == null) throw new NullPointerException ("pas de voisins"); neighbors.add (neighbor); } //supprimer la piece donnée des voisins de la piece public void removeNeighbor (Piece neighbor) { neighbors.remove (neighbor); } // deplacer la piece en cours a la position indiquée sur le jpannel public void moveTo (int x, int y) { setPuzzlePosition (x, y); } //dessiner la piece dans dans l'objet graphique donné //cette image sera dessiner dans la position en cours de la piece. protected void draw (Graphics g) { Image img = getImage(); if (img != null) g.drawImage (img, getPuzzleX(), getPuzzleY(), null); } //retourn si la piece en cours contient le point donné public boolean contains (int x, int y) { int puzX = getPuzzleX(); int puzY = getPuzzleY(); int w = getCurrentWidth(); int h = getCurrentHeight(); return (puzX <= x) && (x <= (puzX+w-1)) && (puzY <= y) && (y <= (puzY+h-1)) && (getAlpha(x-puzX, y-puzY) != 0); } //retourne la valeur de alpha (transparence) du point donné de l'image en cours protected int getAlpha (int x, int y) { int pixel = curData[y*curWidth + x]; return (pixel >> 24) & 0xff; } //verifier si la piece en cours est situé et orienté assez proche de la piece donnée pour se coller public boolean isCloseTo (Piece piece) { //verifier si les pieces sont allignées int rot = getRotation(); int rotD = Math.abs (piece.getRotation() - getRotation()); rotD = Math.min (rotD, 360-rotD); if (rotD > rotClose) return false; //si on est ici alors c que les pieces sont bien allignées int puzXD = getPuzzleX() - piece.getPuzzleX(); int puzYD = getPuzzleY() - piece.getPuzzleY(); int rotXD = getRotatedX() - piece.getRotatedX(rot); int rotYD = getRotatedY() - piece.getRotatedY(rot); return (Math.abs(puzXD-rotXD) <= posClose) && (Math.abs(puzYD-rotYD) <= posClose) ; } // joindre les pieces ------------------------------------------------------- /* * Vérifie si l'un des voisins de cette pièce sont situées et orientées * suffisament pour être joint à celui-ci. * @ retourne un tableau des pièces, ou nulle s'ils n'étaient pas assez de voisins proches; * si le tableau est non-nul, la premiere piece sera la nouvelle. */ public Piece[] join () { ArrayList close = new ArrayList(); Iterator iter = neighbors.iterator(); while (iter.hasNext()) { Piece piece = (Piece) iter.next(); if (piece.isCloseTo (this)) { close.add (piece); } } if (close.size() == 0) return null; Piece newPiece = MultiPiece.join (this, close); Piece[] ret = new Piece[close.size()+2]; ret[0] = newPiece; ret[1] = this; this.image.flush(); for (int i = 0; i < close.size(); i++) { Piece piece = (Piece) close.get(i); ret[i+2] = piece; piece.image.flush(); } System.gc(); return ret; } /* * 4 position de rotation * definir la position d'une piece en se basant sur sa rotaton actuelle * */ protected void setRotatedPosition() { int rot = getRotation(); switch (rot) { case 0: rotatedX = imageX; rotatedY = imageY; curWidth = origWidth; curHeight = origHeight; break; case 90: rotatedX = totalHeight-imageY-origHeight; rotatedY = imageX; curWidth = origHeight; curHeight = origWidth; break; case 180: rotatedX = totalWidth -imageX-origWidth; rotatedY = totalHeight-imageY-origHeight; curWidth = origWidth; curHeight = origHeight; break; case 270: rotatedX = imageY; rotatedY = totalWidth -imageX-origWidth; curWidth = origHeight; curHeight = origWidth; break; default: System.out.println ("rotation non permise: "+rot); } } /* * recalculer les pixels de l'image et sa taille a partir des données original de l'image et sa rotation */ public void recomputeImageData() { setRotatedPosition(); if (rotation == 0) { curData = (int[]) origData.clone(); } else if (rotation == 90) { curData = new int[origData.length]; for (int i = 0; i < curWidth; i++) { for (int j = 0; j < curHeight; j++) { try { curData[j*curWidth+i] = origData[(origHeight-i-1)*origWidth + j]; } catch (ArrayIndexOutOfBoundsException ex) { throw new NullPointerException(); } } } } else if (rotation == 180) { curData = new int[origData.length]; for (int i = 0; i < curWidth; i++) { for (int j = 0; j < curHeight; j++) { curData[j*curWidth+i] = origData[(origHeight-j-1)*origWidth + (origWidth-i-1)]; } } } else if (rotation == 270) { curData = new int[origData.length]; for (int i = 0; i < curWidth; i++) { for (int j = 0; j < curHeight; j++) { curData[j*curWidth+i] = origData[i*origWidth + (origWidth-j-1)]; } } } image = Toolkit.getDefaultToolkit().createImage ( new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth)); } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.*; public class Jeu { public static Piece charge(String fichier) throws Exception { FileInputStream fis = new FileInputStream(fichier); ObjectInputStream ois = new ObjectInputStream(fis); Piece p = (Piece) ois.readObject(); ois.close(); fis.close(); return p; } public static void sauve(String fichier, Piece p) throws Exception { FileOutputStream fos = new FileOutputStream(fichier); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); oos.close(); fos.close(); } }
Merci beaucoup Monsieur pour votre réponse rapide, je veux savoir svp comment je peux appeler la classe que vous me suggérer depuis un boton "enregistrer" et "charger" pour recharger le partie enregistrée.
Merci
Bonjour,
Regardez la faq
Bonjour, j'ai une erreur à ce niveau "sauve(String fichier, Piece p);" il m'affiche ")" expected, ";" expected, not a statement!!!!!!!
Merci
Code:
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 package puzzle.gui.listeners; import java.awt.event.ActionEvent; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import javax.swing.JOptionPane; import puzzle.Piece; import puzzle.gui.*; public class ActionSaveGame extends MenuListener{ public ActionSaveGame(PuzzleIG jigsawFrame) { super(jigsawFrame); } public void actionPerformed(ActionEvent arg0) { int answer = JOptionPane.showConfirmDialog( jigsawFrame, "Etes-vous sûr de vouloir enregistrer?", null, JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { sauve(String fichier, Piece p); } } public static void sauve(String fichier, Piece p) throws Exception { FileOutputStream fos = new FileOutputStream(fichier); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); oos.close(); fos.close(); } }
Tu dois remplacer :
Par :Code:
1
2
3
4
5 if (answer == JOptionPane.YES_OPTION) { sauve(String fichier, Piece p); }
Code:
1
2
3
4
5
6
7 Piece p = getPieceToSave(); if (answer == JOptionPane.YES_OPTION) { sauve("monFichier.svg", p); }
C'est une méthode statique de la classe Jeu donc, on l'apelle de la façon suivante:
Code:
1
2
3
4
5
6
7
8 Jeu.charge(nomDuFichier); Jeu.sauve(nomDuFichier, variableDeLaPiece); // par exemple Jeu.charge("piece1.piece"); Jeu.sauve("piece1.piece", p);
SBSTP n'a pas tort :
la définition de ta méthode n'est pas placée dans la bonne classe : elle n'a rien à faire dans le listener.
Cependant, il faut ajouter que lorsque l'action est déclenchée, tu dois avoir accès à ton objet Piece que tu veux sauver
(à ce propos, pourquoi sauver une pièce et non pas tout le jeu ? Ton architecture n'est peut-être pas clair pour tous ceux qui lisent ce POST, quelques détails de plus seraient utiles).
Merci, et svp pour la méthode getPieceToSave() je dois la déclarer dans la classe piece?
en faite Monsieur moi je veux sauver tt le jeu et non pas seulement la piece. Merci
Alors c'est ta classe Jeu qui doit être sérializable (ainsi que toutes les classes des objets contenus dans Jeu, comme Piece, par exemple).
Et ta méthode save peut être placée dans la classe Jeu.
Elle ne sera pas static, mais juste public(accessible de l'extérieur). Dedans, tu sérialise this (le jeu courant). Et donc tu ne passes plus que le nom de fichier en paramètre.
Laisse tomber la méthode getPieceToSave
Tu n'as qu'à implémenter "serializable" à ta classe Jeu et le sauvegarder dans un fichier grâce à un ObjectOutputStream. Comme je l'ai fait dans mon code précédent.
pour avoir une idée des classes que j'ai dans mon jeu, je vous mets en pièce jointe le code complet de mon application. qcq je dois mettre alors dans les listeners?
j'ai implémenté la classe jeu et je l'ai mis en Serialisabe, et depuis le listener de enregistrer j'ai mis le code suivant mais ca marche pas.
Merci
Code:
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 package puzzle; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Jeu implements Serializable { public Piece Charger(String fichier) throws Exception { FileInputStream fis = new FileInputStream(fichier); ObjectInputStream ois = new ObjectInputStream(fis); Piece p = (Piece) ois.readObject(); ois.close(); fis.close(); return p; } public void Sauver(String fichier) throws Exception { FileOutputStream fos = new FileOutputStream(fichier); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(this); oos.close(); fos.close(); } }
Code:
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 package puzzle.gui.listeners; import java.awt.event.ActionEvent; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; import puzzle.OpenGame; import puzzle.gui.*; public class ActionSaveGame extends MenuListener{ public ActionSaveGame(PuzzleIG jigsawFrame) { super(jigsawFrame); } public void actionPerformed(ActionEvent arg0) { int answer = JOptionPane.showConfirmDialog( jigsawFrame, "Etes-vous sûr de vouloir enregistrer?", null, JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { Jeu.Sauver("monFichier.svg"); } }
Ce qu'il faut sauver dans ton fichier, c'est ta classe maître, celle qui détient toutes les données relatives à ton jeu.
c'est la classe Piece qui détient toutes les données. est ce que je dois écrire une méthode aussi ds la classe piece?
Merci
Pourquoi ne pas utiliser XStream? ça t'enregistre un objet avec toutes ses dépendances dans un fichier xml.
Un diagramme de classe, tu as ça sous la main ?
Perso je n'ai pas envie de lire tout ton code.
C'est bizarre. Peut-être justifié, mais bizarre.Citation:
c'est la classe Piece qui détient toutes les données
Quelques éléments de ton analyse seraient super utile.
Dans tous les cas, l'objet que tu sauve doit être de même type que celui que tu load, donc tes 2 fonctions sauver et charger ne correspondent pas l'une à l'autre.
Et ne met pas de majuscule aux fonctions :
http://fr.wikipedia.org/wiki/CamelCase
Bonjour,
qd j'essaie d'ouvrir le fichier que j'ai enregistré, je n'arrive pas à afficher les pièces sur l’écran!!!!!
Code:
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
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531 import java.awt.*; import java.awt.image.*; import java.util.*; import java.io.*; import java.util.logging.Level; import java.util.logging.Logger; /** * dans chaque piece on sait comment les bords doivent êtres dessiner et les pieces aussi voisines */ public class Piece implements Serializable { //un id qui represente l'id de la piece suivante private static int nextId = 0; //une piece doit être proche de ca voisine par ce nombre de pixel public static final int posClose = 7; //une piece doit être comprise dans cette marge pour être considere comme alignée avec sa voisine public static final int rotClose = 5; /* * creation de nouveau piece * @param data image data * @param imageX position X de l'image par rapport au puzzle entier * @param imageY position Y de l'image par rapport au puzzle entier * @param imageWidth la largeur de l'image de la piece * @param imageHeight la hauteur de l'image de la piece * @param totalWidth la largeur de l'image entiere * @param totalHeight la heuteur de l'image entiere */ protected Piece(int[] data, int imageX, int imageY, int imageWidth, int imageHeight, int totalWidth, int totalHeight) { id = nextId++; neighbors = new HashSet(); this.curWidth = this.origWidth = imageWidth; this.curHeight = this.origHeight = imageHeight; origData = data; this.imageX = imageX; this.imageY = imageY; this.totalWidth = totalWidth; this.totalHeight = totalHeight; // calculer le hash code: if (data != null) { int temp = 0; for(int i = 0; i < data.length; i++) { temp += data[i]; } this.hash = temp; } else { this.hash = 0; } } /** * @param rotation initial rotation */ public Piece(int[] data, int imageX, int imageY, int imageWidth, int imageHeight, int totalWidth, int totalHeight, int rotation) { this (data, imageX, imageY, imageWidth, imageHeight, totalWidth, totalHeight); forceSetRotation (rotation); } //constructeur de copie public Piece(Piece p) { this(p.getOrigData(), p.getImageX(), p.getImageY(), p.getImageWidth(), p.getImageHeight(), p.getTotalWidth(), p.getTotalHeight(), p.getRotation()); } /* public static void sauve(String fichier, Piece p) throws Exception { FileOutputStream fos = new FileOutputStream(fichier); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); oos.close(); fos.close(); }*/ //Id de la piece protected int id; //Emplacement dans l'image int imageX, imageY; // Taille de l'image. int totalWidth, totalHeight; //Emplacement dans l'image ajuster par la rotation actuel int rotatedX, rotatedY; //les pieces considerés comme voisin de celle-ci //Seulement les pieces qui peuvent être collée protected Set neighbors; //la taille de l'image original protected int origWidth, origHeight; int[] origData; //la taille actuel apres totation protected int curWidth, curHeight; int[] curData; //emplacement dans le pannel int puzzleX, puzzleY; //dernier point cliquer int transX, transY; /** constante hash code de la piece. */ protected int hash; //image de la piece Image image; //une rotation entre 0-359 dans le sens horlogique int rotation; //------------------------------------------------------------ //retourner l'id de la piece public int getId() {return id;} //retourne la rotation actuelle de la piece public int getRotation() { return rotation; } /**si la rotation actuelle est differente, le data de l'image sera recalculer * @throws IllegalArgumentException si la rotation n'est pas entre [0,359] */ public void setRotation (int rot) { if (rot == rotation) return; forceSetRotation (rot); } /** definir la rotation de la piece * cette methode force le recalcule de l'image * @throws IllegalArgumentException si la rotation n'est pas entre [0,359] */ protected void forceSetRotation (int rot) { if ((rot < 0) || (rot > 359)) throw new IllegalArgumentException("rotation invalide: "+rot); // ne permettre qu'une roation de 0, 90, 180, 270. if (rot % 90 != 0) { int newRot = rot / 90; System.out.println ("rotation invalide "+rot+"; utiliser plutot "+newRot); rot = newRot; } rotation = rot; recomputeImageData(); if (image != null) image.flush(); image = Toolkit.getDefaultToolkit().createImage ( new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth)); } // Fulshe sert a vider le buffer public void flushImage() { if (image!= null) { image.flush(); } image = Toolkit.getDefaultToolkit().createImage ( new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth)); } /* * la position des pieces par rapport au puzzle */ public void setPuzzlePosition (int x, int y) { this.puzzleX = x; this.puzzleY = y; } //************************ // Save Game //************************ public static void saveGame(Piece p, String filePath) throws IOException { ObjectOutputStream outputStream = null; try { outputStream = new ObjectOutputStream(new FileOutputStream(filePath)); outputStream.writeObject(p); } catch(FileNotFoundException ex) { ex.printStackTrace(); } catch(IOException ex) { ex.printStackTrace(); } finally { try { if(outputStream != null) { outputStream.flush(); outputStream.close(); } } catch(IOException ex) { ex.printStackTrace(); } } } //******************** // load Game //******************** public static Piece loadGame(String fichier) throws Exception { FileInputStream fis = new FileInputStream(fichier); ObjectInputStream ois = new ObjectInputStream(fis); Piece p = (Piece) ois.readObject(); ois.close(); fis.close(); return p; } /* * retourne la hauteur actuelle de la piece en pixel */ public int getCurrentHeight() { return curHeight; } /* * retourne la largeur actuelle de la piece en pixel */ public int getCurrentWidth() { return curWidth; } /** Retourne la largeur de toute l'image dans son orientation actuelle . */ public int getTotalWidth() { return totalWidth; } /** Retourne la hauteur de toute l'image dans son orientation actuelle */ public int getTotalHeight() { return totalHeight; } /* * Retourne la hauteur de la piece dans son orientation original. */ public int getImageHeight() { return origHeight; } /* * Retourne la largeur de la piece dans son orientation original. */ public int getImageWidth() { return origWidth; } /**Retourne la position X de la piece dans l'image originale.*/ public int getImageX() { return imageX; } /**Retourne la position Y de la piece dans l'image originale.*/ public int getImageY() { return imageY; } /**Retourne la position X de la piece dans l'image originale modifier par sa rotation actuelle.*/ public int getRotatedX() { return rotatedX; } /**Retourne la position Y de la piece dans l'image originale modifier par sa rotation actuelle.*/ public int getRotatedY() { return rotatedY; } /*Retourne la position X dans l'image originale modifier par la rotation donnée*/ public int getRotatedX(int rotation) { return rotatedX; } /*Retourne la position Y dans l'image originale modifier par la rotation donnée*/ public int getRotatedY(int rotation) { return rotatedY; } /*Retourne la position X dans le puzzle*/ public int getPuzzleX() { return puzzleX; } /*Retourne la position Y dans le puzzle*/ public int getPuzzleY() { return puzzleY; } /** Retourne thie Piece's transX */ public int getTransX() {return transX; } //retourne la derniere position X du clique sur la piece public void setTransX(int x) {transX = x;} /** Retourne Piece's transY */ public int getTransY() {return transY; } //retourne la derniere position Y du clique sur la piece public void setTransY(int y) {transY = y;} public HashSet getNeighbors() { return (HashSet)neighbors; } public void setNeighbors(HashSet neighbors) { this.neighbors = neighbors; } /* * retourne l'image de la piece actuelle. */ public Image getImage () { return image; } /*Retourne le data de la piece actuelle*/ public int[] getCurrData() {return curData; } public void setCurrData(int[] data) { curData = data; } /** retourne le data original de la piece */ public int[] getOrigData() { return this.origData; } public void setOrigData(int[] data) { this.origData = data; } public int hashCode() { return hash+rotation; } /** * ajouter une piece au voisinage de ces pieces * @throws NullPointerException s il n existe pas de voisin */ public void addNeighbor (Piece neighbor) { if (neighbor == null) throw new NullPointerException ("pas de voisins"); neighbors.add (neighbor); } //supprimer la piece donnée des voisins de la piece public void removeNeighbor (Piece neighbor) { neighbors.remove (neighbor); } // deplacer la piece en cours a la position indiquée sur le jpannel public void moveTo (int x, int y) { setPuzzlePosition (x, y); } //dessiner la piece dans dans l'objet graphique donné //cette image sera dessiner dans la position en cours de la piece. protected void draw (Graphics g) { Image img = getImage(); if (img != null) g.drawImage (img, getPuzzleX(), getPuzzleY(), null); } //retourn si la piece en cours contient le point donné public boolean contains (int x, int y) { int puzX = getPuzzleX(); int puzY = getPuzzleY(); int w = getCurrentWidth(); int h = getCurrentHeight(); return (puzX <= x) && (x <= (puzX+w-1)) && (puzY <= y) && (y <= (puzY+h-1)) && (getAlpha(x-puzX, y-puzY) != 0); } //retourne la valeur de alpha (transparence) du point donné de l'image en cours protected int getAlpha (int x, int y) { int pixel = curData[y*curWidth + x]; return (pixel >> 24) & 0xff; } //verifier si la piece en cours est situé et orienté assez proche de la piece donnée pour se coller public boolean isCloseTo (Piece piece) { //verifier si les pieces sont allignées int rot = getRotation(); int rotD = Math.abs (piece.getRotation() - getRotation()); rotD = Math.min (rotD, 360-rotD); if (rotD > rotClose) return false; //si on est ici alors c que les pieces sont bien allignées int puzXD = getPuzzleX() - piece.getPuzzleX(); int puzYD = getPuzzleY() - piece.getPuzzleY(); int rotXD = getRotatedX() - piece.getRotatedX(rot); int rotYD = getRotatedY() - piece.getRotatedY(rot); return (Math.abs(puzXD-rotXD) <= posClose) && (Math.abs(puzYD-rotYD) <= posClose) ; } // joindre les pieces ------------------------------------------------------- /* * Vérifie si l'un des voisins de cette pièce sont situées et orientées * suffisament pour être joint à celui-ci. * @ retourne un tableau des pièces, ou nulle s'ils n'étaient pas assez de voisins proches; * si le tableau est non-nul, la premiere piece sera la nouvelle. */ public Piece[] join () { ArrayList close = new ArrayList(); Iterator iter = neighbors.iterator(); while (iter.hasNext()) { Piece piece = (Piece) iter.next(); if (piece.isCloseTo (this)) { close.add (piece); } } if (close.size() == 0) return null; Piece newPiece = MultiPiece.join (this, close); Piece[] ret = new Piece[close.size()+2]; ret[0] = newPiece; ret[1] = this; this.image.flush(); for (int i = 0; i < close.size(); i++) { Piece piece = (Piece) close.get(i); ret[i+2] = piece; piece.image.flush(); } System.gc(); return ret; } /* * 4 position de rotation * definir la position d'une piece en se basant sur sa rotaton actuelle * */ protected void setRotatedPosition() { int rot = getRotation(); switch (rot) { case 0: rotatedX = imageX; rotatedY = imageY; curWidth = origWidth; curHeight = origHeight; break; case 90: rotatedX = totalHeight-imageY-origHeight; rotatedY = imageX; curWidth = origHeight; curHeight = origWidth; break; case 180: rotatedX = totalWidth -imageX-origWidth; rotatedY = totalHeight-imageY-origHeight; curWidth = origWidth; curHeight = origHeight; break; case 270: rotatedX = imageY; rotatedY = totalWidth -imageX-origWidth; curWidth = origHeight; curHeight = origWidth; break; default: System.out.println ("rotation non permise: "+rot); } } /* * recalculer les pixels de l'image et sa taille a partir des données original de l'image et sa rotation */ public void recomputeImageData() { setRotatedPosition(); if (rotation == 0) { curData = (int[]) origData.clone(); } else if (rotation == 90) { curData = new int[origData.length]; for (int i = 0; i < curWidth; i++) { for (int j = 0; j < curHeight; j++) { try { curData[j*curWidth+i] = origData[(origHeight-i-1)*origWidth + j]; } catch (ArrayIndexOutOfBoundsException ex) { throw new NullPointerException(); } } } } else if (rotation == 180) { curData = new int[origData.length]; for (int i = 0; i < curWidth; i++) { for (int j = 0; j < curHeight; j++) { curData[j*curWidth+i] = origData[(origHeight-j-1)*origWidth + (origWidth-i-1)]; } } } else if (rotation == 270) { curData = new int[origData.length]; for (int i = 0; i < curWidth; i++) { for (int j = 0; j < curHeight; j++) { curData[j*curWidth+i] = origData[i*origWidth + (origWidth-j-1)]; } } } image = Toolkit.getDefaultToolkit().createImage ( new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth)); } }
j'appel les méthodes save et loadGame définies dans Pièce par:
etCode:
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 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package puzzle.gui.listeners; import java.awt.event.ActionEvent; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; import puzzle.Piece; import puzzle.gui.*; public class ActionSaveGame extends MenuListener{ Piece p; public ActionSaveGame(PuzzleIG jigsawFrame) { super(jigsawFrame); } public void actionPerformed(ActionEvent arg0) { int answer = JOptionPane.showConfirmDialog( jigsawFrame, "Etes-vous sûr de vouloir enregistrer?", null, JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { try { Piece.saveGame(p, "monFichier.svg"); } catch (IOException ex) { Logger.getLogger(ActionSaveGame.class.getName()).log(Level.SEVERE, null, ex); } } } }
Code:
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 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package puzzle.gui.listeners; import java.awt.event.ActionEvent; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; import puzzle.Piece; import puzzle.gui.*; / public class ActionOpenGame extends MenuListener{ Piece p; public ActionOpenGame(PuzzleIG jigsawFrame) { super(jigsawFrame); } public void actionPerformed(ActionEvent arg0) { int answer = JOptionPane.showConfirmDialog( jigsawFrame, "Etes-vous sûr de vouloir ouvrir le jeu?", null, JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { Piece.loadGame("monFichier.svg"); } } }
j'ai trouvé la méthode suivante pour écrire et lire mon objet mais je ne sais pas comment l'utiliser à partir d'un listener pour que ça soit enregistrer.
Merci
Code:
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 private class PieceData implements Serializable { public int[] origData; public int[] curData; } private void writeObject(ObjectOutputStream out) throws IOException { out.writeInt(this.getId()); out.writeInt(this.getImageX()); out.writeInt(this.getImageY()); out.writeInt(this.getTotalWidth()); out.writeInt(this.getTotalHeight()); out.writeInt(this.getRotatedX()); out.writeInt(this.getRotatedY()); out.writeInt(this.origWidth); out.writeInt(this.origHeight); out.writeInt(this.curWidth); out.writeInt(this.curHeight); // #$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%# // That is the way I found to send the int[] piece's data: PieceData pd = new PieceData(); pd.origData = this.origData; pd.curData = this.curData; out.writeObject(pd); // #$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%# out.writeInt(this.puzzleX); out.writeInt(this.puzzleY); out.writeInt(this.transX); out.writeInt(this.transY); out.writeInt(this.rotation); out.writeInt(this.hash); out.writeObject(this.neighbors); return; } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { this.id = in.readInt(); this.imageX = in.readInt(); this.imageY = in.readInt(); this.totalWidth = in.readInt(); this.totalHeight = in.readInt(); this.rotatedX = in.readInt(); this.rotatedY = in.readInt(); this.origWidth = in.readInt(); this.origHeight = in.readInt(); this.curWidth = in.readInt(); this.curHeight = in.readInt(); // #$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%# // That is the way I found to send the int[] piece's data: PieceData pd = (PieceData)in.readObject(); this.origData = pd.origData; this.curData = pd.curData; // #$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%#$%# this.puzzleX = in.readInt(); this.puzzleY = in.readInt(); this.transX = in.readInt(); this.transY = in.readInt(); this.rotation = in.readInt(); this.hash = in.readInt(); this.neighbors = (Set)in.readObject(); this.image = Toolkit.getDefaultToolkit().createImage( new MemoryImageSource (curWidth,curHeight, curData, 0, curWidth)); if(image!=null) image.flush(); }
Tu as défini :
Méthode qui charge ta pièce depuis un fichier et la retourne comme résultat.Code:public static Piece loadGame(String fichier) throws Exception
Et tu l'utilise de cette façon :
Où est passé le résultat de ta fonction ? Pourquoi n'utilises-tu pas la Piece retournée ? Ne devrais-tu pas avoir :Code:
1
2
3 if (answer == JOptionPane.YES_OPTION) { Piece.loadGame("monFichier.svg"); }
Code:
1
2
3
4
5
6
7
8 if (answer == JOptionPane.YES_OPTION) { Piece loadPiece = Piece.loadGame("monFichier.svg"); if(loadPiece != null) { p = loadPiece; } else { //Afficher un Alert : problème au loading } }
Merci Monsieur pour votre réponse, est ce que c'est possible d'utiliser la méthode writeobjet() et readobjet() ci-dessus à partir d'un listener alors qu'elles ne sont pas static? je pense que c'est ce qu'il me faut enregistrer dans le fichier.
grand Merci.
Voici un tutoriel complet sur la sérialisation binaire en Java qui devrait vous être utile.
Bonsoir, je veux savoir svp est ce que je suis obligé de passer par un listener pour exécuter le writeobjet() et le readobjet(), pcq le listener demande que les méthodes soit static alors que mes deux méthodes ne le sont pas.
Merci