当前位置: 首页 > 知识库问答 >
问题:

Java游戏精灵卡住了

刘胜泫
2023-03-14

当我通过卡布局切换到另一个JPanel时,我遇到了一个卡住的精灵的问题。

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.Rectangle;import java.awt.event.KeyEvent;

import java.util.ArrayList;

导入javax . swing . image icon;

公共类播放器 {

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

共有1个答案

谢叶五
2023-03-14

< code>KeyListener要求它们注册的组件是可聚焦的并且具有焦点,这意味着当您单击像< code>JButton这样的东西时,焦点移动到按钮,并且具有< code>KeyListener的组件不再具有键盘焦点,因此不再接收按键事件。

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

 类似资料:
  • 在get_hit=pyGame.sprite的第82行,我检查sprite碰撞的移动时,它会给出错误提示:“:File”c:\Users\pc\VS_PYTHON_PY\pyGame.PY“。”。spritecollide(Player,敌方,True)文件“C:\python py\lib\site packages\pygame\sprite.py”,第1682行,位于spritecrolli

  • 本文向大家介绍pygame学习笔记(5):游戏精灵,包括了pygame学习笔记(5):游戏精灵的使用技巧和注意事项,需要的朋友参考一下 据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽、魂斗罗,却对精灵一点也不知。pygame.sprite.Sprite就是Pygame里面用来实现精灵的一个类,使用时,并不需要对它实例化,只需要继承他,然后按需写出自己的类就好了,因此非常简

  • 我希望代码能够检测岩石和玩家之间的碰撞。但不知何故,程序会一直检测到碰撞。我尝试调试它,并尝试寻找此问题的解决方案,但没有成功。这只是我或这是非常常见的。 也许是矩形大小?当我尝试尽我所能时,问题仍在继续。自己尝试代码。帮帮我! 请回答! 代码:

  • 我是java新手,我正在尝试创建一个基本的刽子手游戏,我已经为这一轮创建了方法,但我一直在创建一个布尔值,该值将使游戏进入下一轮(如果玩家输入了错误的字母,他将失去一次猜测字母的尝试;他可能只会出错10次;如果猜测,他将继续游戏)。我的代码到目前为止,我甚至尝试通过if/else语句排除布尔值,但对我来说它似乎非常愚蠢。任何帮助都是有用的。非常感谢。

  • 我将如何在无休止的跑步游戏中使用精灵套件物理? 一个无尽的跑步者通过保持玩家静止,但以设定的速度移动背景和所有其他物体来假装运动。 但是,我想模拟物理。 如果我让我的播放器随着物理引擎移动,通过播放器从原始位置的位移来移动背景,然后将播放器移动回它的原始位置,会怎么样? 这样会不会光滑好看?如果是这样的话,那么我应该使用什么样的sprite kit方法来避免向用户显示视觉错误呢? 正确的解决方案是

  • 问题内容: 目前,每次按键时,精灵仅移动1个像素。按住左右键时,如何使水暖工精灵不断移动? 问题答案: 您可以使用pygame.key.get_pressed来做到这一点。 例: