Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaSwing中制作平滑的动画_Java_Swing_Animation - Fatal编程技术网

如何在JavaSwing中制作平滑的动画

如何在JavaSwing中制作平滑的动画,java,swing,animation,Java,Swing,Animation,嗨,我正在为JPanel使用Timer类和repaint方法,但是每当我击中屏幕,太空船在屏幕上移动一半时,它就会缩小并保持在原位。它永远不会到达窗户的底部。当我把它移到右边时也是一样的 另外,当我尝试将其放置在不同的位置时,背景不再是黑色。有人能帮我吗?以下是我的代码示例: package javapaint; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.aw

嗨,我正在为JPanel使用Timer类和repaint方法,但是每当我击中屏幕,太空船在屏幕上移动一半时,它就会缩小并保持在原位。它永远不会到达窗户的底部。当我把它移到右边时也是一样的

另外,当我尝试将其放置在不同的位置时,背景不再是黑色。有人能帮我吗?以下是我的代码示例:

package javapaint;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
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.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class SpaceShipFlight 
{
    private JFrame windowFrame;
    private BufferedImage shipSprite;
    private BufferedImage spaceBackground;


    /** MAIN METHOD **/

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    SpaceShipFlight window = new SpaceShipFlight();
                    window.windowFrame.setVisible(true);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }



    /** CONSTRUCTOR **/

    public SpaceShipFlight() throws IOException
    {
        /*************************************************************************
                               SPACE SHIP FLIGHT JFRAME
        *************************************************************************/

        windowFrame = new JFrame("Space Ship Flight");


        windowFrame.setBounds(0, 0, 950, 700);


        windowFrame.setBackground(Color.BLACK);





        /*************************************************************************
                           SPACE SHIP FLIGHT SPRITES (FOR DRAWING)
        *************************************************************************/

        spaceBackground = ImageIO.read(new File("Space (Medium).png")); 
        // 450 x 374


        shipSprite = ImageIO.read(new File("Ship Sprite.png"));
        // 64 x 64 png of space ship





        /*************************************************************************
                           SPACE SHIP FLIGHT JPANEL (FOR DRAWING)
        *************************************************************************/

        SpacePanel spacePanel = new SpacePanel();



        windowFrame.add(spacePanel);



        /*************************************************************************
                                 SPACE SHIP FLIGHT TIMER 
        *************************************************************************/

        Timer timer = new Timer(10, new AnimationListener(spacePanel));
        timer.start();






        /*************************************************************************
                           EVENT HANDLER TO MOVE SPACE SHIP
        *************************************************************************/
        /*
        EventHandler <KeyEvent> moveShip = new EventHandler<KeyEvent> ()
        {
            @Override
            public void handle(KeyEvent event) 
            {
                if (event.getCharacter().equalsIgnoreCase("X"))
                {
                    spacePanel.setX( spacePanel.getX() + 1 );
                }
            }

        };

        */

        KeyListener moveShip = new KeyListener()
        {

            @Override
            public void keyTyped(KeyEvent e) 
            {

            }

            @Override
            public void keyPressed(KeyEvent e) 
            {
                if (e.getKeyCode() == KeyEvent.VK_RIGHT && spacePanel.getX() < 375)
                {
                    spacePanel.setX( spacePanel.getX() + 5 );
                    spacePanel.repaint();
                }

                if (e.getKeyCode() == KeyEvent.VK_LEFT && spacePanel.getX() > 0)
                {
                    spacePanel.setX( spacePanel.getX() - 5);
                    spacePanel.repaint();
                }

                if (e.getKeyCode() == KeyEvent.VK_UP && spacePanel.getY() > 0)
                {
                    spacePanel.setY( spacePanel.getY() - 5);
                    spacePanel.repaint();
                }

                if (e.getKeyCode() == KeyEvent.VK_DOWN && spacePanel.getY() < 700)
                {
                    spacePanel.setY( spacePanel.getY() + 5 );
                    spacePanel.repaint();
                }

                if (e.getKeyCode() == KeyEvent.VK_X)
                {
                    System.out.printf("X: %d, Y: %d\n", spacePanel.getX(),
                                                            spacePanel.getY());
                }
            }

            @Override
            public void keyReleased(KeyEvent e) 
            {

            }

        };





        windowFrame.addKeyListener(moveShip);




    }





    /** ANIMATION LISTENER CLASS **/

    public static class AnimationListener implements ActionListener
    {
        private SpacePanel panel;
        private Graphics graphics;


        public AnimationListener(SpacePanel panel)
        {
            this.panel = panel;
            this.graphics = panel.getGraphics();
        }


        @Override
        public void actionPerformed(ActionEvent e) 
        {
            panel.repaint();
        }

    }





    /** SPACE PANEL SUBCLASS **/

    public class SpacePanel extends JPanel
    {
        // Variables for the space ship's position temporarily placed here
        private int x;
        private int y;


        // Constructor
        public SpacePanel()
        {
            super();

            x = 0;
            y = 0;
        }


        // Getters
        public int getX()
        {
            return x;
        }

        public int getY()
        {
            return y;
        }


        // Setters
        public void setX(int newX)
        {
            x = newX;
        }

        public void setY(int newY)
        {
            y = newY;
        }






        @Override
        public void paint(Graphics g)
        {
            g.drawImage(spaceBackground, 0, 0, this);
            g.drawImage(shipSprite, x, y, this);
        }
    }









}
包javapaint;
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共级宇宙飞船飞行
{
私有JFrame窗口框架;
私有缓冲映像shipSprite;
私有缓冲图像空间背景;
/**主要方法**/
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
尝试
{
太空飞船飞行窗口=新太空飞船飞行();
window.windowFrame.setVisible(true);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
});
}
/**建造师**/
公共宇宙飞船飞行()引发异常
{
/*************************************************************************
宇宙飞船飞行框架
*************************************************************************/
windowFrame=新的JFrame(“太空船飞行”);
窗框.立根(0,0,950,700);
窗框。背景(颜色。黑色);
/*************************************************************************
太空船飞行精灵(用于绘图)
*************************************************************************/
spaceBackground=ImageIO.read(新文件(“Space(Medium.png”));
//450 x 374
shipSprite=ImageIO.read(新文件(“shipSprite.png”);
//太空船的64 x 64 png
/*************************************************************************
太空船飞行JPANEL(用于绘图)
*************************************************************************/
SpacePanel SpacePanel=新建SpacePanel();
windowFrame.add(spacePanel);
/*************************************************************************
宇宙飞船飞行计时器
*************************************************************************/
计时器计时器=新计时器(10,新的AnimationListener(spacePanel));
timer.start();
/*************************************************************************
事件处理程序移动太空船
*************************************************************************/
/*
EventHandler moveShip=新的EventHandler()
{
@凌驾
公共无效句柄(KeyEvent事件)
{
if(event.getCharacter().equalsIgnoreCase(“X”))
{
spacePanel.setX(spacePanel.getX()+1);
}
}
};
*/
KeyListener moveShip=新的KeyListener()
{
@凌驾
public void keyTyped(KeyEvent e)
{
}
@凌驾
按下公共无效键(按键事件e)
{
如果(例如getKeyCode()==KeyEvent.VK_RIGHT&&spacePanel.getX()<375)
{
spacePanel.setX(spacePanel.getX()+5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_LEFT&&spacePanel.getX()>0)
{
setX(spacePanel.getX()-5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_UP&&spacePanel.getY()>0)
{
setY(spacePanel.getY()-5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_DOWN&&spacePanel.getY()<700)
{
setY(spacePanel.getY()+5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_X)
{
System.out.printf(“X:%d,Y:%d\n”,spacePanel.getX(),
spacePanel.getY());
}
}
@凌驾
公共无效密钥已释放(密钥事件e)
{
}
};
windowFrame.addKeyListener(moveShip);
}
/**动画侦听器类**/
公共静态类AnimationListener实现ActionListener
{
私人空间小组;
私有图形;
公共动画监听器(SpacePanel面板)
{
this.panel=面板;
this.graphics=panel.getGraphics();
}
@凌驾
已执行的公共无效操作(操作事件e)
{
panel.repaint();
}
}
/**空间面板子类**/
公共类SpacePanel扩展了JPanel
{
//太空船位置的变量暂时放在这里
私人INTX;
私营企业;
//建造师
公共空间小组()
{
超级();
x=0;
y=0;
}