我正在用Java中的keyListener制作一个Sprite Mover。



我正在开发一个精灵移动器,但它似乎不起作用,有人能看看并告诉我出了什么问题吗?它应该通过KeyListener来使用箭头键移动精灵,但是,我的移动功能只能向上移动,不能向其他方向移动,请帮忙。

package moving.sprite;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SpringLayout;

/**
 *
 * @author c
 */
public class MovingSprite implements KeyListener,
        ActionListener{
    /**
     * @param args the command line arguments
     * 
     */
    // Make a sprite movable around the window by using the arrow keys
    // Data : Used for paths for the File object
    // Stills
    private static String fstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Front.png";
    private static String bstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Back.png";
    private static String lstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Left.png";
    private static String rstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Right.png";
    //
    // Walking
    private static String fwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Front.png";
    private static String bwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Back.png";
    private static String lwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Left.png";
    private static String rwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Right.png";
    //
    // Movement position
    private static int moved = 0;
    private static int xa = 0;
    private static int ya = 0;
    private static String j;
    private static String direction;
    // 0 = front
    // 1 = back
    // 2 = left
    // 3 = right
    //
    // Gui Constructors
    private static JFrame mainframe;
    private static Container contentPane;
    private static SpringLayout layout;
    private static Component frame;
    private static BufferedImage img;
    private static ImageIcon iconb;
    private static JLabel lab;
    private static JFrame mainframeb;
    private static JButton upb;
    private static JButton downb;
    private static JButton leftb;
    private static JButton rightb;
    public static void main(String[] args) {
        runthis();

    }
    private static void messagep ( String message ) {
        JOptionPane.showMessageDialog(frame,
    message);
    }
    private static void changesprite(String pos) {
        j = pos;
        img = null;
        try {
        img = ImageIO.read(new File(j));
        } catch (IOException e) {
        }
        iconb = new ImageIcon(img, "Sprite");
        lab.setIcon(iconb);
    }
    private static void reset() {
        xa = 0;
        ya = 0;
        lab.setLocation(xa, ya);
        System.out.println("Reset!");
    }
    private static void move() {
        lab.setLocation(xa, ya);
        if ( moved == 1 ) {
            // Down, works
            changesprite(fstill);
            ya = (lab.getLocationOnScreen().y);
            xa = (lab.getLocationOnScreen().x*2*(-(1)));
            lab.setLocation(xa, ya);
            System.out.println("Down : (" + xa + " , " + ya +  " ) ");
        }
        if ( moved == 0 ) {
            // Backwards, 
            changesprite(bstill);
            ya = (lab.getLocationOnScreen().y)-2;
            xa = (lab.getLocationOnScreen().x);
            lab.setLocation(xa, ya);
            System.out.println("Up : (" + xa + " , " + ya +  " ) ");
        }
        if ( moved == 2 ) {
            changesprite(lstill);
        }
        if ( moved == 3 ) {
            changesprite(rstill);
        }
        lab.setLocation(xa, ya);
    }
    private static void runthis() {
        messagep("Disclaimer : Sprite's are originally by Nintendo, sprites were ripped by : Silentninja.");
        messagep("Program made by : c");
        mainframe = new JFrame("Fire Red Sprite");
        mainframe.setSize(100, 100);
        contentPane = mainframe.getContentPane();
        layout = new SpringLayout();

        j = fstill;
        img = null;
        try {
        img = ImageIO.read(new File(j));
        } catch (IOException e) {
        }
        iconb = new ImageIcon(img, "Sprite");
        lab = new JLabel(iconb);
        mainframe.add(lab);
        lab.setLocation(100, 100);
        mainframeb = new JFrame("Fire Red Moving");
        mainframeb.setSize(300, 70);
        upb = new JButton("Up");
        downb = new JButton("Down");
        leftb = new JButton("Left");
        rightb = new JButton("Right");
        upb.setSize(50, 50);
        downb.setSize(50, 50);
        leftb.setSize(50, 50);
        rightb.setSize(50, 50);
        mainframeb.add(upb);
        mainframeb.add(downb);
        mainframeb.add(leftb);
        mainframeb.add(rightb);
        contentPane.setLayout(layout);
        mainframe.pack();
        mainframe.setVisible(true);
        mainframeb.setLayout(new FlowLayout (FlowLayout.LEADING));
        mainframeb.setVisible(true);

        reset();
    }
    private static void directionassign() {
        if ( moved == 2 ) {
            direction = "LEFT";
        }
        if ( moved == 3 ) {
            direction = "RIGHT";
        }
        if ( moved == 1 ) {
            direction = "UP";
        }
        if ( moved == 0 ) {
            direction = "DOWN";
        }
    }
    @Override
    public void keyTyped(KeyEvent ke) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public void keyPressed(KeyEvent ke) {
        if(ke.getKeyCode()  == KeyEvent.VK_LEFT) moved = 2;
        else if(ke.getKeyCode()  == KeyEvent.VK_RIGHT) moved = 3;
        else if(ke.getKeyCode()  == KeyEvent.VK_UP) moved = 1;
        else if(ke.getKeyCode()  == KeyEvent.VK_DOWN) moved = 0;
        move();
        directionassign();
        System.out.println(moved + " " + direction);
    }
    @Override
    public void keyReleased(KeyEvent ke) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public void actionPerformed(ActionEvent ae) {
        move();
    }
    private void displayInfo(KeyEvent e, String keyStatus){
        int id = e.getID();
        if (id == KeyEvent.KEY_PRESSED) {
            char c = e.getKeyChar();
            System.out.println(c);
        }
    }
}/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package moving.sprite;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SpringLayout;

/**
 *
 * @author c
 */
public class MovingSprite implements KeyListener,
        ActionListener{
    /**
     * @param args the command line arguments
     * 
     */
    // Make a sprite movable around the window by using the arrow keys
    // Data : Used for paths for the File object
    // Stills
    private static String fstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Front.png";
    private static String bstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Back.png";
    private static String lstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Left.png";
    private static String rstill = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Stills\Right.png";
    //
    // Walking
    private static String fwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Front.png";
    private static String bwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Back.png";
    private static String lwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Left.png";
    private static String rwalk = "C:\Users\c\Documents\NetBeansProjects\Moving Sprite\src\Sprite Images\Walking\Right.png";
    //
    // Movement position
    private static int moved = 0;
    private static int xa = 0;
    private static int ya = 0;
    private static String j;
    private static String direction;
    // 0 = front
    // 1 = back
    // 2 = left
    // 3 = right
    //
    // Gui Constructors
    private static JFrame mainframe;
    private static Container contentPane;
    private static SpringLayout layout;
    private static Component frame;
    private static BufferedImage img;
    private static ImageIcon iconb;
    private static JLabel lab;
    private static JFrame mainframeb;
    private static JButton upb;
    private static JButton downb;
    private static JButton leftb;
    private static JButton rightb;
    public static void main(String[] args) {
        runthis();

    }
    private static void messagep ( String message ) {
        JOptionPane.showMessageDialog(frame,
    message);
    }
    private static void changesprite(String pos) {
        j = pos;
        img = null;
        try {
        img = ImageIO.read(new File(j));
        } catch (IOException e) {
        }
        iconb = new ImageIcon(img, "Sprite");
        lab.setIcon(iconb);
    }
    private static void reset() {
        xa = 0;
        ya = 0;
        lab.setLocation(xa, ya);
        System.out.println("Reset!");
    }
    private static void move() {
        lab.setLocation(xa, ya);
        if ( moved == 1 ) {
            // Down, works
            changesprite(fstill);
            ya = (lab.getLocationOnScreen().y);
            xa = (lab.getLocationOnScreen().x*2*(-(1)));
            lab.setLocation(xa, ya);
            System.out.println("Down : (" + xa + " , " + ya +  " ) ");
        }
        if ( moved == 0 ) {
            // Backwards, 
            changesprite(bstill);
            ya = (lab.getLocationOnScreen().y)-2;
            xa = (lab.getLocationOnScreen().x);
            lab.setLocation(xa, ya);
            System.out.println("Up : (" + xa + " , " + ya +  " ) ");
        }
        if ( moved == 2 ) {
            changesprite(lstill);
        }
        if ( moved == 3 ) {
            changesprite(rstill);
        }
        lab.setLocation(xa, ya);
    }
    private static void runthis() {
        messagep("Disclaimer : Sprite's are originally by Nintendo, sprites were ripped by : Silentninja.");
        messagep("Program made by : c");
        mainframe = new JFrame("Fire Red Sprite");
        mainframe.setSize(100, 100);
        contentPane = mainframe.getContentPane();
        layout = new SpringLayout();

        j = fstill;
        img = null;
        try {
        img = ImageIO.read(new File(j));
        } catch (IOException e) {
        }
        iconb = new ImageIcon(img, "Sprite");
        lab = new JLabel(iconb);
        mainframe.add(lab);
        lab.setLocation(100, 100);
        mainframeb = new JFrame("Fire Red Moving");
        mainframeb.setSize(300, 70);
        upb = new JButton("Up");
        downb = new JButton("Down");
        leftb = new JButton("Left");
        rightb = new JButton("Right");
        upb.setSize(50, 50);
        downb.setSize(50, 50);
        leftb.setSize(50, 50);
        rightb.setSize(50, 50);
        mainframeb.add(upb);
        mainframeb.add(downb);
        mainframeb.add(leftb);
        mainframeb.add(rightb);
        contentPane.setLayout(layout);
        mainframe.pack();
        mainframe.setVisible(true);
        mainframeb.setLayout(new FlowLayout (FlowLayout.LEADING));
        mainframeb.setVisible(true);

        reset();
    }
    private static void directionassign() {
        if ( moved == 2 ) {
            direction = "LEFT";
        }
        if ( moved == 3 ) {
            direction = "RIGHT";
        }
        if ( moved == 1 ) {
            direction = "UP";
        }
        if ( moved == 0 ) {
            direction = "DOWN";
        }
    }
    @Override
    public void keyTyped(KeyEvent ke) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public void keyPressed(KeyEvent ke) {
        if(ke.getKeyCode()  == KeyEvent.VK_LEFT) moved = 2;
        else if(ke.getKeyCode()  == KeyEvent.VK_RIGHT) moved = 3;
        else if(ke.getKeyCode()  == KeyEvent.VK_UP) moved = 1;
        else if(ke.getKeyCode()  == KeyEvent.VK_DOWN) moved = 0;
        move();
        directionassign();
        System.out.println(moved + " " + direction);
    }
    @Override
    public void keyReleased(KeyEvent ke) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public void actionPerformed(ActionEvent ae) {
        move();
    }
    private void displayInfo(KeyEvent e, String keyStatus){
        int id = e.getID();
        if (id == KeyEvent.KEY_PRESSED) {
            char c = e.getKeyChar();
            System.out.println(c);
        }
    }
}
if ( moved == 1 )

不要使用"幻数"。没有人知道"1"是什么意思,在代码中可能需要引用该变量的其他地方很容易出现键入错误。

private static JFrame mainframe;
private static Container contentPane;
private static SpringLayout layout;
private static Component frame;
private static void messagep ( String message ) {

去掉所有的静态变量和方法。这不是设计应用程序的正确方式。

使用键盘检查运动。它解释了使用KeyListener的常见问题,并提出了一种更好的方法,即使用Key Bindings。提供了工作实例。

最新更新