2015-11-02 25 views
0

我正在研究一个Sprite移动器,但它似乎没有工作,任何人都可以看看并告诉我什么是错的?它应该是通过KeyListener工作以便用箭头键移动精灵,但是,我的移动功能只能向上移动,而不是其他方向,请帮助。我正在用Java中的keyListener制作一个Sprite Mover

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); 

     } 

    } 

} 

回答

3
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) { 

摆脱所有静态变量的一种方法。这不是设计应用程序的正确方法。

结帐Motion Using the Keyboard。它解释了使用KeyListener的常见问题,并提出了一个更好的方法,即使用Key Bindings。提供了工作示例。

+0

谢谢,我会看看它。 –