Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > movimiento por teclado

Wuenas.
Me gustaria cambiar este codigo para que en vez de que se mueva sola la imagen se moviese con las flechas del teclado. Se que esta el KeyAdapter() pero no se muy bien como ponerlo.
A ver si alguien me puede echar una mano
gracias

import javax.imageio.ImageIO;
import java.net.URL;
import java.awt.*;
import javax.swing.*;
import UT5.Error;
import java.io.*;

/** Animating image frames. All frames kept in a stripe. */
@SuppressWarnings("serial")
public class AnimatedFramesInStripe extends JPanel {
// Named-constants
static final int CANVAS_WIDTH = 640;
static final int CANVAS_HEIGHT = 480;
public static final String TITLE = "Animated Frame Demo";

private String imgFilename = "images/GhostStripe.png";
private int numRows, numCols, numFrames;
private Image img; // for the entire image stripe
private int currentFrame; // current frame number
private int frameRate = 5; // frame rate in frames per second
private int imgWidth, imgHeight; // width and height of the image
private double x = 100.0, y = 80.0; // (x,y) of the center of image
private double speed =8; // displacement in pixels per move
private double direction = 0; // in degrees
private double rotationSpeed = 1; // in degrees per move

/** Constructor de configurar los componentes GUI */
public AnimatedFramesInStripe() {
// Setup animation
loadImage(imgFilename, 2, 4);
Thread animationThread = new Thread () {
@Override
public void run() {
while (true) {

update();

// TODO Auto-generated catch block

// update the position and image
repaint(); // Refresh the display
try {
Thread.sleep(1000 / frameRate); // delay and yield to other threads
} catch (InterruptedException ex) { }
}
}
};
animationThread.start(); // start the thread to run animation

// Setup GUI
setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
}

/** Helper method to load image. All frames have the same height and width */
private void loadImage(String imgFileName, int numRows, int numCols) {
URL imgUrl = getClass().getClassLoader().getResource(imgFileName);
if (imgUrl == null) {
System.err.println("Couldn't find file: " + imgFileName);
} else {
try {
img = ImageIO.read(imgUrl); // load image via URL
} catch (IOException ex) {
ex.printStackTrace();
}
}
numFrames = numRows * numCols;
this.imgHeight = img.getHeight(null) / numRows;
this.imgWidth = img.getWidth(null) / numCols;
this.numRows = numRows;
this.numCols = numCols;
currentFrame = 0;
}

/** Devuelve la parte superior izquierda coordenada x del número de cuadro dado. */
private int getcurrentFrameX() {
return (currentFrame % numCols) * imgWidth;
}

/** Devuelve la parte superior izquierda coordenada y del número de cuadro dado. */
private int getCurrentFrameY() {
return (currentFrame / numCols) * imgHeight;
}

/** Actualización de la posición basada en la velocidad y dirección del sprite */
public void update() {

x += speed * Math.cos(Math.toRadians(direction)); // x-position
xx += speed * Math.cos(Math.toRadians(direction*2));
if (x >= CANVAS_WIDTH) {
x -= CANVAS_WIDTH;
} else if (x < 0) {
x += CANVAS_WIDTH;
}
y += speed * Math.sin(Math.toRadians(direction)); // y-position
yy += speed * Math.cos(Math.toRadians(direction*2));
if (y >= CANVAS_HEIGHT) {
y -= CANVAS_HEIGHT;
} else if (y < 0) {
y += CANVAS_HEIGHT;
}
direction += rotationSpeed; //dirección actualización basada en la velocidad de rotación
if (direction >= 360) {
direction -= 360;
} else if (direction < 0) {
direction += 360;
}

++currentFrame; // muestra siguiente fotograma
if (currentFrame >= numFrames) {
currentFrame = 0;
}
if(direction+getcurrentFrameX()>=CANVAS_WIDTH){
direction=-direction;
}

if(y+getCurrentFrameY()>=CANVAS_WIDTH){
y=CANVAS_WIDTH-getCurrentFrameY();
}

}

/** Códigos de pintura personalizada sobre este JPanel */
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // paint background
setBackground(Color.WHITE);
Graphics2D g2d = (Graphics2D) g;

int frameX = getcurrentFrameX();
int frameY = getCurrentFrameY();
g2d.drawImage(img,
(int)x - imgWidth / 2, (int)y - imgHeight / 2,
(int)x + imgWidth / 2, (int)y + imgHeight / 2,
frameX, frameY, frameX + imgWidth, frameY + imgHeight, null);
}

}


import javax.swing.JFrame;
import javax.swing.SwingUtilities;
-----------------------------------------------
public class Maneja {

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("titulo");
frame.setContentPane(new AnimatedFramesInStripe());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null); // center the application window
frame.setVisible(true);
}
});

}

}

agosto 23, 2014 | Unregistered Commentermanuzgz

Básicamente es esto:

addKeyListener(new KeyAdapterImpl());

private class KeyAdapterImpl extends KeyAdapter {

@Override
public void keyPressed(final KeyEvent evt) {
switch (evt.getKeyCode()) {
case KeyEvent.VK_DOWN:
break;
case KeyEvent.VK_UP:
break;
case KeyEvent.VK_LEFT:
break;
case KeyEvent.VK_RIGHT:
break;
case KeyEvent.VK_SPACE:
break;
}
}
}

Que puedes completar y adaptar a lo que necesites.

agosto 23, 2014 | Registered Commenterchoces