una rotar que pelota mueva linea imagen hacer graficos girar como animaciĆ³n java swing rotation keylistener key-bindings

que - rotar imagen java netbeans



RotaciĆ³n de una imagen basada en pulsaciones de teclas (2)

public void keyPressed(KeyEvent ke) { final RotateImage ri = new RotateImage(TestImage); switch (ke.getKeyCode()) { case KeyEvent.VK_RIGHT: { cordX += 5; ri.rotate(); }

Parece que está girando la misma imagen cada vez, por lo que siempre girará solo 5 grados.

editar: zumbar demasiado tarde. . ver publicación de shareef.

Estaba tratando de modificar un código existente para rotar una imagen en función de las pulsaciones de teclas. hasta ahora he logrado hacer lo siguiente y estoy atascado. He utilizado la transformación Affine por primera vez. La imagen gira solo una vez cuando se supone que debe girar tantas veces como se presiona la tecla DERECHA.

package aircraftPackage; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; public class RotateImage extends JFrame implements KeyListener { private static final long serialVersionUID = 1L; private Image TestImage; private BufferedImage bf; private int cordX = 100; private int cordY = 100; private double currentAngle; public RotateImage(Image TestImage) { this.TestImage = TestImage; MediaTracker mt = new MediaTracker(this); mt.addImage(TestImage, 0); try { mt.waitForID(0); } catch (Exception e) { e.printStackTrace(); } setTitle("Testing...."); setSize(500, 500); imageLoader(); setVisible(true); } public void rotate() { //rotate 5 degrees at a time currentAngle+=5.0; if (currentAngle >= 360.0) { currentAngle = 0; } repaint(); } public void imageLoader() { try { String testPath = "test.png"; TestImage = ImageIO.read(getClass().getResourceAsStream(testPath)); } catch (IOException ex) { ex.printStackTrace(); } addKeyListener(this); } public void update(Graphics g){ paint(g); } public void paint(Graphics g){ bf = new BufferedImage( this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB); try{ animation(bf.getGraphics()); g.drawImage(bf,0,0,null); }catch(Exception ex){ } } public void animation(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D)g; AffineTransform origXform = g2d.getTransform(); AffineTransform newXform = (AffineTransform)(origXform.clone()); //center of rotation is center of the panel int xRot = this.getWidth()/2; int yRot = this.getHeight()/2; newXform.rotate(Math.toRadians(currentAngle), xRot, yRot); g2d.setTransform(newXform); //draw image centered in panel int x = (getWidth() - TestImage.getWidth(this))/2; int y = (getHeight() - TestImage.getHeight(this))/2; g2d.drawImage(TestImage, x, y, this); g2d.setTransform(origXform); g.drawImage(TestImage, cordX, cordY, this); } public static void main(String[] args) { new RotateImage(null); } public void keyPressed(KeyEvent ke) { final RotateImage ri = new RotateImage(TestImage); switch (ke.getKeyCode()) { case KeyEvent.VK_RIGHT: { cordX += 5; ri.rotate(); } break; case KeyEvent.VK_LEFT: { cordX -= 5; } break; case KeyEvent.VK_DOWN: { cordY += 5; } break; case KeyEvent.VK_UP: { cordY -= 3; } break; } repaint(); } public void keyTyped(KeyEvent ke) { } public void keyReleased(KeyEvent ke) { } }

Sería útil si alguien pudiera corregirme en donde estoy cometiendo el error. Gracias


El problema es que está creando una nueva imagen de rotación en cada tecla de evento para que parezca que no funciona. Intente cambiar el lugar de esta línea para que no sea modificable en cada evento clave.

public static void main(String[] args) { new RotateImage(null); } public void keyPressed(KeyEvent ke) { final RotateImage ri = new RotateImage(TestImage);

ACTUALIZAR:

la razón es porque el valor del constructor es nulo, debes pasar la imagen

new RotateImage(null);

modifica esto en tu código

1) hacerlo estático

private static Image TestImage;

2) definir

private static RotateImage ri;

3) llamar a main como este

public static void main(String[] args) { ri = new RotateImage(TestImage); }

paso 4 (eliminado)

ACTUALIZAR:

leer estas preguntas sobre la pila se desborda otra pregunta

ACTUALIZACIÓN2:

aquí está el código completo que funciona perfectamente (la tecla derecha) no se te ocurre incluir tu imagen en el mismo paquete y es del mismo tipo .png aquí está el código

package aircraftPackage; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; public class RotateImage extends JFrame implements KeyListener { private static final long serialVersionUID = 1L; private static Image TestImage; private static RotateImage ri; private BufferedImage bf; private int cordX = 100; private int cordY = 100; private double currentAngle; public RotateImage(Image TestImage) { this.TestImage = TestImage; MediaTracker mt = new MediaTracker(this); mt.addImage(TestImage, 0); try { mt.waitForID(0); } catch (Exception e) { e.printStackTrace(); } setTitle("Testing...."); setSize(500, 500); imageLoader(); setVisible(true); } public void rotate() { //rotate 5 degrees at a time currentAngle+=5.0; if (currentAngle >= 360.0) { currentAngle = 0; } repaint(); } public void imageLoader() { try { String testPath = "test.png"; TestImage = ImageIO.read(getClass().getResourceAsStream(testPath)); } catch (IOException ex) { ex.printStackTrace(); } addKeyListener(this); } public void update(Graphics g){ paint(g); } public void paint(Graphics g){ bf = new BufferedImage( this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB); try{ animation(bf.getGraphics()); g.drawImage(bf,0,0,null); }catch(Exception ex){ } } public void animation(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D)g; AffineTransform origXform = g2d.getTransform(); AffineTransform newXform = (AffineTransform)(origXform.clone()); //center of rotation is center of the panel int xRot = this.getWidth()/2; int yRot = this.getHeight()/2; newXform.rotate(Math.toRadians(currentAngle), xRot, yRot); g2d.setTransform(newXform); //draw image centered in panel int x = (getWidth() - TestImage.getWidth(this))/2; int y = (getHeight() - TestImage.getHeight(this))/2; g2d.drawImage(TestImage, x, y, this); g2d.setTransform(origXform); g.drawImage(TestImage, cordX, cordY, this); } public static void main(String[] args) { ri = new RotateImage(TestImage); } public void keyPressed(KeyEvent ke) { switch (ke.getKeyCode()) { case KeyEvent.VK_RIGHT: { cordX += 5; ri.rotate(); } break; case KeyEvent.VK_LEFT: { cordX -= 5; ri.rotate(); } break; case KeyEvent.VK_DOWN: { cordY += 5; ri.rotate(); } break; case KeyEvent.VK_UP: { cordY -= 3; ri.rotate(); } break; } repaint(); } public void keyTyped(KeyEvent ke) { } public void keyReleased(KeyEvent ke) { } }