在java中动画两个图像

时间:2014-03-23 18:41:33

标签: java swing object animation keylistener

我对java很新。我需要在java游戏上制作两个图像的动画。它意味着是一个太空飞船游戏,允许两个用户使用键盘控制对象。我已经部分实现了这个,但是我无法理解如何允许两个键盘控件,而且通过键盘输入移动的一个对象也会闪烁很多。

public class MainFrame extends JFrame implements KeyListener {

    MainPanel mPanel;
        MainPanel secondss;
         MainPanel thirdss;
        int speed = 5;
        //ss facing north
        int direction = 0;

    MainFrame() {
        setTitle("spaceship Game");
        mPanel = new MainPanel("C:/img");
                secondss = new MainPanel("C:/img");

        setSize(1024, 768);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(mPanel); // add MainPanel JPanel to JFrame
        setVisible(true); // show class

                add(secondSs);
                add(thirdSs);
                seconds.currentSs.setX(400);
                secondSS.currentSs.setY(100);
    }

   public void actionPerformed( ActionEvent e )
   {
     if( e.getSource() == mPanel)
     {
     }
   }

        @Override
        public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == e.VK_LEFT) {

         int x = mPanel.currentSs.getX() - speed;
         mPanel.currentSs.setX(x);
        }

        if (e.getKeyCode() == e.VK_RIGHT) {
         int x = mPanel.currentSs.getX() + speed;
         mPanel.currentSs.setX(x);
        }
        if (e.getKeyCode() == e.VK_DOWN) {
         int y = mPanel.currentSs.getY() + speed;
         mPanel.currentSs.setY(y);
        }
        if (e.getKeyCode() == e.VK_UP) {
         int y = mPanel.currentSs.getY() - speed;
         mPanel.currentSs.setY(y);
        }
        //change image direction    
        mPanel.frame = direction;
        }

    public static void main(String[] args) {
        MainFrame mainFrame = new MainFrame();
                mainFrame.addKeyListener(mainFrame);
    }

如果有人可以提供帮助或者如果没有指出我正确的方向,我将不胜感激。

4 个答案:

答案 0 :(得分:4)

  • JFrame不能专注于KeyEvents,默认情况下永远不会对KeyEvents做出反应

  • 调用setVisible(真);将所有JComponents添加到JFrame后,应该是最后一行代码行,

  • 为什么有公共无效actionPerformed(ActionEvent e),必须生成expetion形式compilier


  • 将JFrame创建为局部变量

  • 将JPanel放入JFrame

  • 覆盖JPanel的getPreferredSize,针对JFrame的setSize的instesad

  • 然后调用pack()和setVisble(true)


  • 将图像放入Java包

  • 将图片放入JLabel

  • 将NullLayout设置为JPanel(否则动画不可能)

  • 将KeyBindings添加到JPanel,覆盖所需/必需的KeyEvents


  • 使用自定义绘画有另一种方法,通过覆盖paintComponent for JPanel,KeyEvents在此处保留KeyBindings作为与KeyListener比较的更好的侦听器

答案 1 :(得分:3)

  

它意味着是一个太空飞船游戏,允许两个用户使用键盘控制对象

不要使用KeyListener。 Swing旨在与Key Bindings一起使用。

有关更多信息和示例,请参阅Motion Using the Keyboard

KeyboardAnimation示例演示了两个用户如何控制单个图像。

答案 2 :(得分:0)

嗯,你应该在这里改变很多:

  1. 游戏中的图形很少使用组件完成。请记住,组件对它们有很大的影响(例如UI委托,听众,同行等)。你应该做的是创建一个自定义组件,作为游戏板。这个组件的绘画方法将绘制成太空飞船的图像。这也将消除闪烁(在该组件上调用setDoubleBuffered(true)
  2. 船舶的位置应独立于绘画而改变,即位置应计算并保存在成员变量中,并且绘画应根据swing的绘画经理的意愿进行。但是,您仍然可以使用paintImmediately(...)在船舶移动时绘制船舶图像来强制执行更严格的绘画
  3. 没有办法(至少不是我知道的)处理两个键盘或任何类型的键盘。如果你想让2个用户同时玩,他们应该使用相同的键盘,你应该有2个独立的(希望是遥远的)键组,每个玩家一个。就像过去一样: - )

答案 3 :(得分:0)

根据我对这个问题的理解,玩家需要使用不同的键组与游戏进行交互,具体取决于你是玩家1还是玩家2.如果是这种情况,请实现KeyListener并覆盖以下方法,就像以下代码确实:

@Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W)
            playerOne_up = true;
        if (e.getKeyCode() == KeyEvent.VK_S)
            playerOne_down = true;
        if (e.getKeyCode() == KeyEvent.VK_UP)
            playerTwo_up = true;
        if (e.getKeyCode() == KeyEvent.VK_DOWN)
            playerTwo_down = true;
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W)
            playerOne_up = false;
        if (e.getKeyCode() == KeyEvent.VK_S)
            playerOne_down = false;
        if (e.getKeyCode() == KeyEvent.VK_UP)
            playerTwo_up = false;
        if (e.getKeyCode() == KeyEvent.VK_DOWN)
            playerTwo_down = false;

        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (!isStarted()) {
                doInitializations();
                setStarted(true);
            }
        }

        if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
            if (isStarted()) {
                setStarted(false);
            } else {
                frame.dispose();
            }

                }

        }

但是,在我的例子中,只允许上下移动(乒乓游戏)。玩家一使用W代表向上,S代表向下,而玩家二使用向上箭头键和向下箭头键。 booleans playerOne_up,playerOne_down等是其他方法的开关,用于查看对象是否需要在哪个方向上移动。