Java游戏精灵卡住了

Java游戏精灵卡住了,java,2d,cardlayout,Java,2d,Cardlayout,当我通过CardLayout切换到另一个JPanel时,我遇到了一个sprite卡住的问题 import java.awt.CardLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JFrame; import javax.sw

当我通过CardLayout切换到另一个JPanel时,我遇到了一个sprite卡住的问题

import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList;
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel;

public class Game extends JFrame implements Runnable {

    private viewA v1;
    private viewB v2;
    private viewC v3;
    private viewD v4;
    private Player player;
    private CardLayout c1;
    private JPanel contPanel;

    // ############## VIEW A BUTTONLISTENER
    public class ViewAButtonList implements ActionListener{

        public void actionPerformed(ActionEvent ev){
            try{
            c1.show(contPanel, "1");

            } catch (Exception ex){

            ex.printStackTrace();
            }

        }


    }
    // ############## VIEW B BUTTON LISTENER
    public class ViewBButtonList implements ActionListener{

        public void actionPerformed(ActionEvent ev){
            try{
            c1.show(contPanel, "2");

            } catch (Exception ex){

            ex.printStackTrace();
            }

        }


    }
    // ############## VIEWC BUTTON ACTIONEVENT
    public class ViewCButtonList implements ActionListener{

        public void actionPerformed(ActionEvent ev){
            try{
            c1.show(contPanel, "3");

            } catch (Exception ex){

            ex.printStackTrace();
            }

        }


    }
    // ############## VIEW D BUTTON ACTION EVENT
    public class ViewDButtonList implements ActionListener{

        public void actionPerformed(ActionEvent ev){
            try{
            c1.show(contPanel, "4");

            } catch (Exception ex){

            ex.printStackTrace();
            }

        }


    }





    public Game() {
        player = new Player();
        // load player settings from server
        //  ..
        //    contPanel = new JPanel();
     //load views    v1 = new ViewA(Player); v2=new ViewB(Player); v3 = new ViewC(Player); v4 =new ViewD(Player);

     c1 = new CardLayout();

     contPanel.setLayout(c1);


     contPanel.add(v1,"1");

     contPanel.add(v2,"2");

     contPanel.add(v3"3");

     contPanel.add(v4,"4");

        c1.show(contPanel, "2");
        currPos =2;

        this.add(contPanel);

        setSize(652, 480);
        setLocationRelativeTo(null);
        setTitle("GAME");
        setResizable(false);
        setVisible(true);//go to end of view B (x=0), change to View A, close view B


       // Create 4 of each button to place in each seperate view (to swtich back and forth)
      // ................


    }

    public static void main(String[] args) {
         javax.swing.SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                 new Game();
             }
         });
    }

    @Override   public void run() {         // TODO Auto-generated method stub
    } }
现在。。从屏幕切换的角度来看,一切都是可行的。。但我的播放器精灵在切换后会卡在屏幕上,但在初始加载时,我可以用箭头键移动精灵。我不确定在新视野中传球的球员是否是罪魁祸首。。但我有一种感觉,那就是。。不知道我做错了什么

这是本书的作者:

导入java.awt.Image;导入java.awt.Rectangle;进口 java.awt.event.KeyEvent

导入java.util.ArrayList

导入javax.swing.ImageIcon

公开课选手{

private String playersprite = "playersprite.png";

private int dx;
private int dy;
private int x;
private int y;
private int width;
private int height;
private boolean isFired;
private boolean visible;
private Image image;
private ArrayList missiles;


public Player() {
    ImageIcon ii = new ImageIcon(this.getClass().getResource(playersprite));
    image = ii.getImage();
    width = image.getWidth(null);
    height = image.getHeight(null);
    missiles = new ArrayList();
    visible = true;
    isFired=false;
    //default spawn location
    x = 600;
    y = 400;
}


public void move() {

    x += dx;
    y += dy;


  if(x<=0){x=0;}      if(x>=640-20){x=640-20;}        if(y<=0){y=0;}
  if(y>=400){y=400;}
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public void setX(int x){
  this.x=x;
}
public void setY(int y){
  this.y=y;
}

public Image getImage() {
    return image;
}

public ArrayList getMissiles() {
    return missiles;
}

public void setVisible(boolean visible) {
    this.visible = visible;
}

public boolean isVisible() {
    return visible;
}

public Rectangle getBounds() {
    return new Rectangle(x, y, 32, 32);
}


public void keyPressed(KeyEvent e) {

  System.out.println("X: "+x+",Y: "+y);


    int key = e.getKeyCode();

    if (key == KeyEvent.VK_SPACE) {
      if(isFired==false){
          isFired=true;
        fire();
      } else return;
    }

    if (key == KeyEvent.VK_LEFT) {
        dx = -2;
    }

    if (key == KeyEvent.VK_RIGHT) {
        dx = 2;
    }

    if (key == KeyEvent.VK_UP) {
        dy = -2;
    }

    if (key == KeyEvent.VK_DOWN) {
        dy = 2;
    }
}

public void fire() {

  System.out.println("Player used weapon");
  // missiles.add(new Missile(x, y));
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {
        dx = 0;
    }

    if (key == KeyEvent.VK_RIGHT) {
        dx = 0;
    }

    if (key == KeyEvent.VK_UP) {
        dy = 0;
    }

    if (key == KeyEvent.VK_DOWN) {
        dy = 0;
    }
    if (key == KeyEvent.VK_SPACE) {
        isFired=false;
    }
} }
私有字符串playersprite=“playersprite.png”; 私人int dx; 私家侦探; 私人INTX; 私营企业; 私有整数宽度; 私人内部高度; 私有布尔值被激发; 私有布尔可见; 私有图像; 私人ArrayList导弹; 公共玩家(){ ImageIcon ii=新的ImageIcon(this.getClass().getResource(playersprite)); image=ii.getImage(); 宽度=image.getWidth(null); 高度=image.getHeight(null); 导弹=新阵列列表(); 可见=真实; isFired=false; //默认繁殖位置 x=600; y=400; } 公开作废动议(){ x+=dx; y+=dy; 如果(x=640-20){x=640-20;}如果(y=400){y=400;} } 公共int getX(){ 返回x; } 公共int getY(){ 返回y; } 公共无效集合x(整数x){ 这个.x=x; } 公共空间设置(整数y){ 这个。y=y; } 公共映像getImage(){ 返回图像; } 公共ArrayList getfilms(){ 返回导弹; } 公共void集合可见(布尔可见){ 可见的;可见的; } 公共布尔值可见(){ 返回可见; } 公共矩形getBounds(){ 返回新矩形(x,y,32,32); } 按下公共无效键(按键事件e){ System.out.println(“X:+X+”,Y:+Y); int key=e.getKeyCode(); if(key==KeyEvent.VK_空间){ if(isFired==false){ isFired=true; 火(); }否则返回; } if(key==KeyEvent.VK_左){ dx=-2; } if(key==KeyEvent.VK_RIGHT){ dx=2; } if(key==KeyEvent.VK_UP){ dy=-2; } if(key==KeyEvent.VK_DOWN){ dy=2; } } 公共场所火灾(){ System.out.println(“玩家使用的武器”); //增加(新导弹(x,y)); } 公共无效密钥已释放(密钥事件e){ int key=e.getKeyCode(); if(key==KeyEvent.VK_左){ dx=0; } if(key==KeyEvent.VK_RIGHT){ dx=0; } if(key==KeyEvent.VK_UP){ dy=0; } if(key==KeyEvent.VK_DOWN){ dy=0; } if(key==KeyEvent.VK_空间){ isFired=false; } } }
KeyListener
要求他们注册的组件是可聚焦的并且具有焦点,这意味着当您单击类似于
JButton
的按钮时,焦点移动到按钮,并且具有
KeyListener
的组件不再具有键盘焦点,因此将不再接收按键事件


相反,建议您使用,因为此API有能力克服这些限制

播放器的
组件在哪里?我假设您正在使用
keylister
移动播放器?这会给您带来问题。EA,我正在为PlayerComponent使用KeyListener。。现在补充原来的问题