|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Probleme de keylistener sur Jframe et clipping [ Archives / Java2D et java3D ] (superjoe3)
Informations & options pour cette discussion
|
jeudi 23 mars 2006 à 11:34:12 |
Probleme de keylistener sur Jframe et clipping

superjoe3
|
Bonjour,
je suis en train de faire un pacman dans le cadre d'un projet de
programmation, et j'ai un souci à propos des Keylistener sur la Frame
qui doivent écouter les directions que je rentre au clavier pour
diriger le pacman.
En effet, lorsque j'appuie sur le clavier, j'ai le code clavier
correspondant à la touche appuyée qui apparait sur le terminal, mais
cela n'est pas pris en compte par le jeu, et le pacman continue a
avancer tout droit.
De plus, qui je clique autre part que sur la fenetre de jeu, et
que je reviens ds cette derniere, les keylisteners ne sont plus actifs!
par ailleurs, la fenetre a un probleme de clipping, j'ai bien
essayé d'y intégrer un double buffer(maladroitement je suppose) mais
n'a pas sensiblement amélioré le rendu.
Pouvez vous m'aider?
| Code: |
import fr.jussieu.script.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
class Pacman implements Runnable {
public int[][] lab;
public int i,j;
public int x,y;
public char direction;
public Thread t;
public decor d;
public KeyListener k;
public Pacman(int[][] v, decor d) {
this.i=0;
this.j=0;
this.lab=v;
this.direction='d';
this.t = new Thread();
this.d = d;
this.run();
}
public void run() {
this.d.start("Pacman");
this.d.getf().addKeyListener(this.d);
while(this.t.isAlive() || !this.t.isInterrupted()){
Deug.println(this.d.directionPressed);
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
switch(this.direction) {
case 'h':
for (int x=this.i+1;x<0;x--){
if(!this.updatePacman(x,this.j) || this.updateDirection()) break;
Deug.println("haut");
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
break;
case 'b':
for (int x=this.i+1;x<this.lab.length;x++){
if(!this.updatePacman(x,this.j) || this.updateDirection()) break;
Deug.println("bas");
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
}
break;
case 'd':
for (int y=this.j+1;y<this.lab[0].length;y++){
if(!this.updatePacman(this.i,y) || this.updateDirection()) break;
Deug.println("droite");
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
}
break;
case 'g':
for (int y=this.j+1;y<0;y--){
if(!this.updatePacman(this.i,y) || this.updateDirection()) break;
Deug.println("haut");
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
}
break;
default:
}
if( this.d.directionPressed != 's') {
this.updateDirection(); //change direction
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
}
public boolean updatePacman(int w,int t) {
if (this.direction=='g'){
if (this.lab[w][t] != 1 || this.lab[w][t] != 2 ) {
this.x=this.i;
this.y=this.j;
this.d.traceVide(this.i,this.j);
this.j--;
this.d.tracePacman(this.i,this.j);
return true;
}
else { this.d.tracePacman(this.i,this.j); return false;}
}
else if (this.direction=='d') {
if (this.lab[w][t] != 1 || this.lab[w][t] != 2 ) {
this.x=this.i;
this.y=this.j;
this.d.traceVide(this.i,this.j);
this.j++;
this.d.tracePacman(this.i,this.j);
return true;
}
else { this.d.tracePacman(this.i,this.j); return false;}
}
else if (this.direction=='h') {
if (this.lab[w][t] != 1 || this.lab[w][t] != 2 ) {
this.x=this.i;
this.y=this.j;
this.d.traceVide(this.i,this.j);
this.i--;
this.d.tracePacman(this.i,this.j);
return true;
}
else { this.d.tracePacman(this.i,this.j); return false;}
}
else if (this.direction=='b') {
if (this.lab[w][t] != 1 || this.lab[w][t] != 2 ) {
this.x=this.i;
this.y=this.j;
this.d.traceVide(this.i,this.j);
this.i++;
this.d.tracePacman(this.i,this.j);
return true;
}
else { this.d.tracePacman(this.i,this.j);return false;}
}
return false;
}
public boolean updateDirection() {
Deug.println(this.d.directionPressed);
if(this.d.directionPressed == 'h' &&
this.lab[this.i-1][this.j] != 1 && this.lab[this.i-1][this.j]
!= 2 && this.i>-1 && this.i<this.lab[0].length
&& this.j>-1 && this.j<this.lab.length) {
this.direction = 'h';
this.d.directionPressed = 's';
return true;
}
if(this.d.directionPressed == 'b' &&
this.lab[this.i+1][this.j] != 1 && this.lab[this.i+1][this.j]
!= 2 && this.i>-1 && this.i<this.lab[0].length
&& this.j>-1 && this.j<this.lab.length) {
this.direction = 'b';
this.d.directionPressed = 's';
return true;
}
if(this.d.directionPressed == 'g' &&
this.lab[this.i][this.j-1] != 1 && this.lab[this.i][this.j-1]
!= 2 && this.i>-1 && this.i<this.lab[0].length
&& this.j>-1 && this.j<this.lab.length) {
this.direction = 'g';
this.d.directionPressed = 's';
return true;
}
if(this.d.directionPressed == 'd' &&
this.lab[this.i][this.j+1] != 1 && this.lab[this.i][this.j+1]
!= 2 && this.i>-1 && this.i<this.lab[0].length
&& this.j>-1 && this.j<this.lab.length) {
this.direction = 'd';
this.d.directionPressed = 's';
return true;
}
return false;
}
}
|
et aussi
| Code: |
import fr.jussieu.script.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
/**
* @author humel
*
*/
public class decor extends Canvas implements KeyListener {
public int[][] lab;
// private static Drawable d = null;
private static JFrame f=null;
private int width, height, x, y;
private Image Im;
private Graphics Gr;
private Image[][] Images;
public char directionPressed;
// private TexturePaint texture;
private Pacman pacman;
public decor(int[][] t,int h, int l){
this.lab=t;
this.width=l;
this.height=h;
Images = new Image[t.length][t[0].length];
}
public void setDirectionPressed(int i) {
if (i == 37) this.directionPressed='g';
if (i == 38) this.directionPressed='h';
if (i == 39) this.directionPressed='d';
if (i == 40) this.directionPressed='b';
}
public void keyPressed(KeyEvent e){
this.setDirectionPressed(e.getKeyCode());
Deug.println(e.getKeyCode());
}
public void keyReleased(KeyEvent e){ }
public void keyTyped(KeyEvent e){ }
public Dimension getPreferredSize() {
return new Dimension(width,height);
}
public JFrame getf() { return f;}
public void paint(Graphics g) {
if (this.Im==null) {
Im = createImage(this.width,this.height);
this.Gr = Im.getGraphics();
}
g.drawImage(Im,this.x,this.y,this);
}
public void update(Graphics g) {
paint(g);
}
public void start(String s) {
if (f!=null) return;
f = new JFrame(s);
f.setResizable(false);
f.getContentPane().add(this);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
try {
Thread.sleep(3000);
} catch(Exception e) {}
for(int j=0;j<lab.length;j++){
for(int i=0;i<lab[0].length;i++){
if(lab[i][j]==1){
traceBloc(i,j);
}
if (lab[i][j]==0){
traceVide(i,j);
}
f.getContentPane().add(this);
}
f.getContentPane().add(this);
}
// this.f.setVisible(true);
// this.t.start();
}
public void traceBloc(int i,int j){
this.Images[i][j]= f.getToolkit().getImage("brick.gif");
this.Gr.drawImage(this.Images[i][j],25*i,25*j,this.f);
/*// d.getGr().drawImage(f.getToolkit().getImage("brick.gif"),x,y,this.f);
this.bufferedImage = this.toBufferedImage(Toolkit.getDefaultToolkit().getImage("brick.gif"));
this.texture = new TexturePaint(Image,new Rectangle(0, 0, 25, 25));
Graphics2D g2d = (Graphics2D)this.Gr;
g2d.setPaint(texture);
g2d.fillRect(x,y,25,25);
f.getContentPane().add(); */
f.getContentPane().add(this);
}
public void traceVide(int i,int j){
this.Images[i][j]= f.getToolkit().getImage("vide.gif");
this.Gr.drawImage(this.Images[i][j],i*25,j*25,this.f);
// d.getGr().drawImage(f.getToolkit().getImage("brick.gif"),x,y,this.f);
/* this.x=x;
this.y=y;
this.Im = f.getToolkit().getImage("vide.gif");
this.Gr.drawImage(Im,x,y,this.f);
// this.Gr.drawImage(b,x,y,this.f); */
f.getContentPane().add(this);
}
public void tracePacman(int i,int j){
this.Images[i][j]= f.getToolkit().getImage("pacman.gif");
this.Gr.drawImage(this.Images[i][j],i*25,j*25,this.f);
f.getContentPane().add(this);
}
}
|
|
|
|
|
jeudi 23 mars 2006 à 13:52:10 |
Re : Probleme de keylistener sur Jframe et clipping

tucobouch
|
1ere remarque :
c'est quoi tout ces this !! c'est trés lourd a lire et surtout inutile...
2eme remarque :
avec quelques lignes de commentaires dans ton code assez peu lisible ça aurait été cool!
Sinon, pour répondre a tes probleme, en regardant 5 min ton code : -Prb de ton pacman qui va tout droit : t'es sur que tes tests de direction dans updateDirection() sont corrects ?! Si c'est buggué, ton pacman ne changera jamais de direction -Pour ton KeyListener : essaye de l'attacher a ton Canvas au lieu de ta JFrame
|
|
|
|
jeudi 23 mars 2006 à 15:36:10 |
Re : Probleme de keylistener sur Jframe et clipping

superjoe3
|
Dsl pour le grand nombre de this, je suis débutant de porg et on m'a dit de les mettre à chaque fois lol. Sinon pour le KeyListener, quel impact cela aura de l'attacher au Canvas plutot qu'a la Frame? Le résultat sera le mème non?
|
|
|
|
jeudi 23 mars 2006 à 17:21:01 |
Re : Probleme de keylistener sur Jframe et clipping

tucobouch
|
En fait je comprends pas trop ton prb de keyListener : ton application "capte" les touches au debut et quand tu quitte la fenetre, les touches ne sont plus captées au retour?
Pour tes this : tu met this quand il peut y avoir une ambiguite avec un atribut de ta classe et un parametre d'une fonction. Par exemple :
public class Test { int a;
public void test(int a) { //modifie l'attribut a de la classe Test this.a=1;
//modifie le parametre a de la fonction a=1; } }
Voila, utilise vraiment this dans ces cas là!
|
|
|
|
jeudi 23 mars 2006 à 22:51:55 |
Re : Probleme de keylistener sur Jframe et clipping

superjoe3
|
L'application capte les touches tant que la fenetre est au 1er plan. Ensuite si je clique ailleurs, sur mon bureau ou une autre fenetre par ex, et que je reclique sur l'application, le keylistener n'est plus actif
|
|
|
|
jeudi 23 mars 2006 à 23:39:16 |
Re : Probleme de keylistener sur Jframe et clipping

tucobouch
|
En fait c'est normal : c'est un probleme de perte de focus. Le focus est le composant qui reçoit les touches (et les evenements liés). Quand ta fenetre s'ouvre, ta fenetre a le focus donc les touches sont captées par ta fenetre. Quand tu clique en dehors de la fenetre, ta fenetre perd son focus au profit d'une autre fenetre (dans celle où tu clique). Quand tu reclique dans ta Frame, le focus n'est pas redonné automatiquement a ta fenetre donc elle ne reçevra toujours pas les touches. Pour remedier a cela, il faut ajouter un listener a ta JFrame, lorsque ta fenetre devient active, tu redemande le focus.
Voici le code a rajouter pour ta Frame :
addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { requestFocusInWindow(); } });
requestFocusInWindow(); demande le focus
En respectant ton code, a l'ouverture de ta frame, met les lignes suivante :
f.addWindowListener(new WindowAdapter() {
public void windowActivated(WindowEvent e) {
f.requestFocusInWindow();
}
});
|
|
|
|
vendredi 24 mars 2006 à 00:05:44 |
Re : Probleme de keylistener sur Jframe et clipping

tucobouch
|
Je viens de relire la partie affichage de ton code : mes commentaires sont en rouge
public void traceBloc(int i,int j){ //evite de faire getImage a chaque affichage : a chaque rafraichissement tu charge un fichier (imagine un jeu a 50 images par secondes!) : tu as un tableau d'Images alors charge y une fois pour toute tes images...meme remarque pour tracePacman et traceVide this.Images[i][j]= f.getToolkit().getImage("brick.gif"); this.Gr.drawImage(this.Images[i][j],25*i,25*j,this.f);
//ligne virer : pas propre! fait plutot un f.repaint() ... en fait, je vois pas a quoi sert cette ligne... f.getContentPane().add(this); }
Pour faire un affichage propre dans les regles de l'art :
Creer un double buffer dans ton Canvas, dans l'initialisation de ton Canvas :
setSize(largeur,hauteur); createBufferStrategy( 2 ); strategy = getBufferStrategy(); buffer = (Graphics2D) strategy.getDrawGraphics(); //ton Graphics où afficher
Change la fonction paint de decor en :
public void paint(Graphics g) { buffer.drawImage(Im,x,y,null); strategy.show(); }
Tu peux meme si tu veux, ça serait mieux meme, virer ton Im (ton double buffer a la main) et n'utiliser pour l'affichage, que le graphics buffer. Le double buffer créé ici est en hardware donc trés rapide. Tu peux voir un petit exemple de rendu en double buffer avec une de mes sources : "Map : Decors Infinis "...
|
|
|
|
vendredi 24 mars 2006 à 11:43:53 |
Re : Probleme de keylistener sur Jframe et clipping

superjoe3
|
Merci pour toutes ces infos! Je viens d'essayer d'ajouter ton code pour la reprise de focus dans la Frame, public void start(String s) { if (f!=null) return; f = new JFrame(s); f.addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { f.requestFocusInWindow(); } }); f.setResizable(false); f.getContentPane().add(this); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); try { Thread.sleep(3000); } catch(Exception e) {} for(int j=0;j<lab.length;j++){ for(int i=0;i<lab[0].length;i++){ if(lab[i][j]==1){ traceBloc(i,j); } if (lab[i][j]==0){ traceVide(i,j); } f.getContentPane().add(this); } f.getContentPane().add(this); } }
Pourtant, lorsque je clique en dehors de la fenetre et que j'y reviens, celle ci ne reprend toujours pas le focus. L'aurai-je ajoutré au mauvais endroit?
|
|
|
|
vendredi 24 mars 2006 à 15:56:49 |
Re : Probleme de keylistener sur Jframe et clipping

superjoe3
|
j'ai corrigé le getImage, et l'affichage est + rapide, merci Par contre :
//ligne virer : pas propre! fait plutot un f.repaint() ... en fait, je vois pas a quoi sert cette ligne... f.getContentPane().add(this);
Si je vire cette ligne, une fenetre vide s'ouvre et le programme continue son éxécution Et si je fais un repaint aussi!
|
|
|
|
vendredi 24 mars 2006 à 18:24:28 |
Re : Probleme de keylistener sur Jframe et clipping

tucobouch
|
Houla.. ton code est tellement un sac de noeud que je m'y perd...  Je comprends pas pourquoi tu fait par exemple dans ta boucle dans la fonction start de decor : f.getContentPane().add(this); Ceci ajoute ton decor dans la fenetre. On doit le faire une fois pour toute! Je viens de voir aussi un truc pas normal dans ta classe Pacman, je pense que pas mal de prb peuvent venir de là... Tu veux faire un Thread non? Pacman fait la heriter de Thread. Dans ton constructeur, ne fait pas run() mais start()! (start() demarre le thread et execute la fonction run() ) class Pacman extends Thread { public Pacman(int[][] v, decor d) { this.i=0; this.j=0; this.lab=v; this.direction='d'; this.t = new Thread(); this.d = d; start(); }
Voila Corrige un peu ton code et rajoute des commentaires, je répondrai a tes nouvelles interrogations uniquement si ton code evolu...
|
|
|
Cette discussion est classé dans : public, int, lab, return, directionpressed
Répondre à ce message
Sujets en rapport avec ce message
Help [ par fredspv ]
Que faire avec les erreurs du ptit prog suivant ?public class Nat{ int n; public Nat(int n){ this.n=n; } public int getValue(){ return n;
ajouter dans cette table des button (JAVA JTABLE JBUTTON) [ par zarziszita ]
salut a toutes le monde mon probleme que j'ai envie ajouter deux button a la fin de table une des button permet ajouter un ligne .le methode main se t
probleme de raffraichissement d'image [ par Azdruyel ]
Bonjour a tous!Aujourd'hui,un nouveau jour, et donc un nouveau probleme!!!Alors voila, mon truc c'est que j'affiche en fond dans un JPanel une image (
JTable éditeur de couleur [ par jc_romeo ]
BonjourJe voudrais faire une JTable avec le fait que quand on clique sur une des cases on puisse changer sa couleur de fond.j'ai donc créer la classe:
Pb avec une JTable et getSelctedRow() [ par gyome314 ]
Salut les jeunes !Voila mon pb...Dans une interface graphique, je cherche éditer une liste de fichiers sous la forme d'une JTable avec une seule colon
JTable : afficher une Date [ par isako ]
Bonjour,Ce sujet n'est pas nouveau dans le forum, mais je n'ai pas trouvé la solution... Je vous soumets mon problème en espérant que l'un de vous pou
JTable et setValueAt [ par anbanb ]
Bonjour a tous je suis en train de créer une jtable mais j ai quelques soucis au niveau de la methode setvalueat .public int getColumnCount() {
Polymorphisme [ par super_toinou ]
Bonjour a tous, y a une ptite question qui me tarraude : j ai l impression que le polymorphisme ne marche pas pour les fonctions statiques. Par e
<html:select> récupérer valeur sélectionnée [ par forcels ]
Hello !Je travaille actuellement sur un site web réalisé en JSP, et j'ai un petit soucis par rapport à une liste .Je souhaite récupérer la valeur séle
salutque fais ce programme java? [ par bluelagoon91 ]
salut! est ce que quelqu'un pourrait m'expliquer ce que fait ce progarmme java!merci<img src="/imgs
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
|