Adding Start, Stop, Reset button to simple java game

前端 未结 1 2013
一向
一向 2020-12-22 11:11

I am a new coder. I am having trouble adding a start and stop button for this piece of example code that i am working off. I\'m sure i have to mess with with Th

相关标签:
1条回答
  • 2020-12-22 11:33

    This is an mcve demonstrating the structure outlined in Hovercraft Full Of Eels comment :

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.event.ActionListener;
    import java.awt.geom.Area;
    import java.awt.geom.Ellipse2D;
    import java.awt.image.BufferedImage;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class AnimationUsingTimer {
    
        private Timer timer;
    
        AnimationUsingTimer() {
    
            JFrame window = new JFrame();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            AnimationPanel animationPanel = new AnimationPanel();
            window.add(animationPanel);
    
            JButton start = new JButton("Start");
            start.addActionListener(e -> animationPanel.start());
            window.add(start, BorderLayout.PAGE_START);
    
            JButton stop = new JButton("Stop");
            stop.addActionListener(e -> animationPanel.stop());
            window.add(stop, BorderLayout.PAGE_END);
            window.pack();
            window.setVisible(true);
        }
    
        class AnimationPanel extends JPanel{
    
            private BufferedImage img;
            private Area ball, walls;
            private final static int W = 450,  H = 300,  DIAMETER = 20;
            private int x = W/2,  y = H/2, xDelta = 3,  yDelta = 2;
    
            AnimationPanel() {
                img = new BufferedImage(W, H, BufferedImage.TYPE_INT_RGB);
                JLabel imageLabel = new JLabel(new ImageIcon(img));
                add(imageLabel);
                walls = new Area(new Rectangle(0,0,W,H));
    
                ActionListener animate = e -> {
                    animate();
                    repaint();
                };
                timer = new Timer(50, animate);
            }
    
            public void animate() {
                x+=xDelta;      y+=yDelta;
                ball = new Area(new Ellipse2D.Double(x, y, DIAMETER, DIAMETER));
    
                if (checkCollision(ball,walls)) {
                    if ( x+DIAMETER>img.getWidth() || x<0 ) {
                        xDelta *= -1;
                    }
                    if(y+DIAMETER>img.getHeight() || y<0 ) {
                        yDelta *= -1;
                    }
                }
            }
    
            @Override
            protected void paintComponent(Graphics g){
                super.paintComponent(g);
    
                Graphics2D g2D = img.createGraphics();
                g2D.setRenderingHint(
                        RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
    
                g2D.setColor(Color.CYAN);
                g2D.fillRect(0, 0, img.getWidth(), img.getHeight());
    
                if(ball != null){
                    g2D.setColor(Color.RED);
                    g2D.fill(ball);
                }
                g2D.dispose();
            }
    
            void start(){
                timer.start();
            }
    
            void stop(){
                timer.stop();
            }
    
            private boolean checkCollision(Area area1, Area area2) {
    
                return area1.getBounds().intersects(area2.getBounds());
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> new AnimationUsingTimer());
        }
    }
    
    0 讨论(0)
提交回复
热议问题