Salve allora sto cercando di sviluppare un piccolo giochino in java però mi ritrovo con un problema ke mi sta dando non pochi problemi. Praticamente quando cliccho su un tasto direzionale non sempre viene letto il movimento, ovvero se ne accorge che ho cliccate il pulsante ma non avviene l'aggiornamento della posizione dell'immagine sullo schermo, questo xò non sempre capita. Adesso pubblico il codice, nn fateci caso al codice perckè è solo una Classe di prova:
codice:
package Immagini; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; public class MovimentoFrame extends JFrame{ public static final int MILLISECONDI = 100; public static final int SPRITE_DIM = 32; public static final int COLONNE = 20; public static final int RIGHE = 20; public static final int APPLET_WIDTH = RIGHE*SPRITE_DIM; public static final int APPLET_HEIGHT = COLONNE*SPRITE_DIM; public static final int JUMP = SPRITE_DIM; private JLabel[] arraylabel; private ImageIcon imgPers; private JLabel labelPers; private JPanel jp; private boolean isControlled=true; private int x; private int y; private int inc_x; private int inc_y; private Timer timer; private Image image; private ImageIcon immagine; private ImageIcon imgTexture; public MovimentoFrame(int x0, int y0){ x=x0; y=y0; inc_x=inc_y=0; try { image = ImageIO.read(new File("/home/vincenzo/Scrivania/grass09.jpg")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } getContentPane().setLayout(null); //tolgo il LayoutManager predefinito getContentPane().setPreferredSize(new Dimension(APPLET_WIDTH, APPLET_HEIGHT)); imgPers = new ImageIcon("/home/vincenzo/Scrivania/persT.PNG"); labelPers = new JLabel(imgPers); labelPers.setBounds(0, 0, 32, 32); // Imposto posizione e dimensione del mio JTextPane labelPers.setOpaque(false); jp = new BackgroundPanel(image); jp.setLayout(null); jp.setBounds(0, 0, APPLET_WIDTH, APPLET_HEIGHT); // Imposto posizione e dimensione del mio JPanel //getContentPane().add(labelPers); jp.add(labelPers);// createImageIcon(); createPanelImage(); getContentPane().add(jp); addKeyListener(new DirectionKeyListener()); timer = new Timer(MILLISECONDI, new ActionListener() { public void actionPerformed(ActionEvent evt) { int x1 = x + inc_x; int y1 = y + inc_y; if ((x1>=0) && (x1<APPLET_WIDTH)) x=x1; if ((y1>=0) && (y1<APPLET_HEIGHT)) y=y1; aggiorna(); } }); } private class DirectionKeyListener extends KeyAdapter { //Spostiamo l'immagine a seconda dell'evento della tastiera public void keyPressed(KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.VK_UP: inc_y=-JUMP; isControlled=false; break; case KeyEvent.VK_DOWN: inc_y=JUMP; isControlled=false; break; case KeyEvent.VK_LEFT: inc_x=-JUMP; isControlled=false; break; case KeyEvent.VK_RIGHT: inc_x=JUMP; isControlled=false; break; default: break; } } public void keyReleased(KeyEvent event) { / switch (event.getKeyCode()) { case KeyEvent.VK_UP: case KeyEvent.VK_DOWN: inc_y=0; break; case KeyEvent.VK_LEFT: case KeyEvent.VK_RIGHT: inc_x=0; break; } } } public void aggiorna() { labelPers.setBounds(x, y,32,32); if(!isControlled) controll(); repaint(); } public void controll(){ for(int i=0;i<RIGHE;i++) if(labelPers.getLocationOnScreen().equals(arraylabel[i].getLocationOnScreen())){ System.out.println(arraylabel[i].getX()+" "+arraylabel[i].getY()); break; } isControlled = true; } class BackgroundPanel extends JPanel { private Image img; public BackgroundPanel (Image img) { super (new BorderLayout ()); this.img = img; } public void paintComponent (Graphics g) { super.paintComponent (g); g.drawImage (img, 0, 0, this); } } private void createImageIcon() { int i; int j; arraylabel = new JLabel[RIGHE]; imgTexture = new ImageIcon("/home/vincenzo/Scrivania/erbaTR.PNG"); for(i=0;i<RIGHE;i++){ arraylabel[i]= new JLabel(imgTexture); arraylabel[i].setSize(32,32); //arraylabel[i].setBounds(i*JUMP, JUMP*4, 32, 32); } } private void createPanelImage(){ //for(int i=0;i<RIGHE;i++) // jp.add(arraylabel[i]); for(int i=0;i<RIGHE;i++){ arraylabel[i].setBounds(i*JUMP, JUMP*5, 32, 32); jp.add(arraylabel[i]); } } public static void main(String[] args) { MovimentoFrame c= new MovimentoFrame(0,0); c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c.pack(); c.setResizable(false); c.setVisible(true); c.timer.start(); c.setLocationRelativeTo(null); System.out.println(c.getSize()); } }