从JFrame显示和删除BufferedImages(Whack-A-Mole)

时间:2014-05-23 07:45:14

标签: java

主要编辑:我尝试了一种不同的方法,使用1类和Runnable的实现来尝试打印" moles"。我不再有第二堂课了。新问题是将BufferedImage userInterface打印在所需的坐标处,然后打印" moles"随机的正确坐标。当下一个痣被抽出时,痣应该消失。

当前问题:

  1. 如果userInterface是唯一的(在代码中没有看到它下面的for循环),那么它就会出现。如果我从0,0更改坐标,则不再显示。

  2. 当我添加打印" moles"的for-loop时(a.k.a mario,因此是Whack-A-Mario)然后userInterface即使它的坐标仍为0,0也不再出现,并且痣以随机坐标打印。这里的问题是UI不再出现,并且在没有先前的UI消失的情况下继续打印marios。


  3. 我正在为我的计算机编程课程编写一个Whack-A-Mole游戏,然而,我在制作" moles"的图像时遇到了一些麻烦。出现并消失。

    首先,我不想对鼹鼠使用任何种类的JButton系统。我已经看过它,但如果可能的话,我想使用我的.png。

    其次,我得出的结论是,我不知道自己在做什么。一个主要问题是我也不知道如何组织这个程序。鼹鼠将以缓慢增加的速度出现,角色将点击屏幕。如果用户的鼠标点击位于其中一个鼹鼠的区域内,则用户的得分将增加。我不知道我是否应该上一堂课或两门课(我见过人们一起上课)。我也不完全知道我要对更新分数做些什么。我希望得分能够独立于重新绘制痣而更新。

    注意:BufferedImage mario被称为mario,因为我正在制作" Wack-A-Mario"。鼹鼠是我画的马里奥的图像,音乐/效果都来自马里奥。也请原谅我的可怕进口。在我尝试各种各样的事情时,他们在过去几个小时里有所增加。我不再知道什么是什么,他们将被清理。


    主类:

    import java.awt.event.MouseListener;
    import java.awt.event.MouseEvent;
    import javax.swing.JFrame;
    import java.awt.Color;
    
    import javax.swing.*;
    import javax.swing.border.*;
    
    import javax.swing.*; 
    import javax.swing.border.*;
    import java.awt.*;
    import java.util.*;
    import java.awt.event.*;
    import java.lang.reflect.*;
    
    import javax.imageio.*;
    import java.io.*;
    import java.awt.image.*;
    
    import javax.swing.Timer;
    public class WhackAMario extends JFrame implements Runnable
    {
        int xCoord[] = new int[] {25, 171, 317, 463, 609, 25, 171, 317, 463, 609, 25, 171, 317, 463, 609, 25, 171, 317, 463, 609};
        int yCoord[] = new int[] {275, 275, 275, 275, 275, 395, 395, 395, 395, 395, 515, 515, 515, 515, 515, 635, 635, 635, 635, 635,};
        Random coordGen = new Random();
        int x,y,element;
    
        BufferedImage userInterface, mario;
        private Thread thread;
        private static JFrame frame = new JFrame();
        private static Graphics g;
        private static Graphics2D g2;
        public void randomCoord()
        {
            element = coordGen.nextInt(20);
            x = xCoord[element];
            y = yCoord[element];
        }
    
        public void run()
        {
            g = frame.getGraphics();
            try
            {
                userInterface = ImageIO.read(new File("UserInterface.png"));            
            }
            catch(IOException e)
            {    
                e.printStackTrace();
            }
            g.drawImage(userInterface, 0, 0, null);
            for(int i=0; i<25; i++)
            {
                randomCoord();
                try
                {
                    mario = ImageIO.read(new File("Mario Up.png"));
                }
                catch(IOException e)
                {    
                    e.printStackTrace();
                }
                g.drawImage(mario, x, y, null);
                try 
                {
                    Thread.sleep(1000);
                    repaint();
                } 
                catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }
            }
    
        }
    
        public static void main(String[] args)
        {
    
            final WhackComponent whackComponent = new WhackComponent();
            class Mouse implements MouseListener
            {
                public void mouseEntered(MouseEvent e) 
                {
                }
    
                public void mouseExited(MouseEvent e) 
                {
                }
    
                public void mousePressed(MouseEvent e) 
                {
    
                }
    
                public void mouseReleased(MouseEvent e) 
                {
                }
    
                public void mouseClicked(MouseEvent e) 
                {
                }
            }
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(796, 818);
            frame.setVisible(true);
    
            WhackAMario whack = new WhackAMario();
            whack.thread = new Thread(whack);
            whack.thread.start();
    
            MouseListener listener = new Mouse();
            frame.addMouseListener(listener);
    
    
            //Timer t = new Timer(100, whackComponent); 
            //t.start();
    
            //     
            //         ImageIcon img = new ImageIcon("Hole.png");
            //         JLabel label1 = new JLabel(img);
            //         JPanel panel = new JPanel();
            //         panel.setLayout(null);
            //     
            //         label1.setLocation(400, 400);
    
            //frame.add(label1);
            //frame.setVisible(true);
        }
    }
    

    主要课程&#34;主要编辑&#34;

        import java.awt.event.MouseListener;
    import java.awt.event.MouseEvent;
    import javax.swing.JFrame;
    import java.awt.Color;
    
    import javax.swing.*;
    import javax.swing.border.*;
    
    import javax.swing.*; 
    import javax.swing.border.*;
    import java.awt.*;
    import java.util.*;
    import java.awt.event.*;
    import java.lang.reflect.*;
    
    import javax.imageio.*;
    import java.io.*;
    import java.awt.image.*;
    
    import javax.swing.Timer;
    public class WhackAMario extends JFrame implements Runnable
    {
        int xCoord[] = new int[] {25, 171, 317, 463, 609, 25, 171, 317, 463, 609, 25, 171, 317, 463, 609, 25, 171, 317, 463, 609};
        int yCoord[] = new int[] {275, 275, 275, 275, 275, 395, 395, 395, 395, 395, 515, 515, 515, 515, 515, 635, 635, 635, 635, 635,};
        Random coordGen = new Random();
        int x,y,element;
    
        BufferedImage userInterface, mario;
        private Thread thread;
        private static JFrame frame = new JFrame();
        private static Graphics g;
        private static Graphics2D g2;
        public void randomCoord()
        {
            element = coordGen.nextInt(20);
            x = xCoord[element];
            y = yCoord[element];
        }
    
        public void run()
        {
            g = frame.getGraphics();
    
            //         try
            //         {
            //             userInterface = ImageIO.read(new File("UserInterface.png"));            
            //         }
            //         catch(IOException e)
            //         {    
            //             e.printStackTrace();
            //         }       
            //         g.drawImage(userInterface, 0, 50, null);
    
            //         for(int i=0; i<25; i++)
            //         {
            //             randomCoord();
            //             try
            //             {
            //                 mario = ImageIO.read(new File("Mario Up.png"));
            //             }
            //             catch(IOException e)
            //             {    
            //                 e.printStackTrace();
            //             }
            //             g.drawImage(mario, x, y, null);
            //             try 
            //             {
            //                 Thread.sleep(1000);
            //                 repaint();
            //             } 
            //             catch (InterruptedException e) 
            //             {
            //                 e.printStackTrace();
            //             }
            //         }
    
        }
    
        public static void main(String[] args)
        {
    
            final WhackComponent whackComponent = new WhackComponent();
            class Mouse implements MouseListener
            {
                public void mouseEntered(MouseEvent e) 
                {
                }
    
                public void mouseExited(MouseEvent e) 
                {
                }
    
                public void mousePressed(MouseEvent e) 
                {
    
                }
    
                public void mouseReleased(MouseEvent e) 
                {
                }
    
                public void mouseClicked(MouseEvent e) 
                {
                }
            }
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(796, 818);
            frame.setVisible(true);
            frame.add(whackComponent);
    
            //         WhackAMario whack = new WhackAMario();
            //         whack.thread = new Thread(whack);
            //         whack.thread.start();
    
            MouseListener listener = new Mouse();
            frame.addMouseListener(listener);
    
    
    
            //Timer t = new Timer(100, whackComponent); 
            //t.start();
    
            //     
            //         ImageIcon img = new ImageIcon("Hole.png");
            //         JLabel label1 = new JLabel(img);
            //         JPanel panel = new JPanel();
            //         panel.setLayout(null);
            //     
            //         label1.setLocation(400, 400);
    
            //frame.add(label1);
            //frame.setVisible(true);
        }
    }
    

    组件类:

    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    
    import javax.imageio.*;
    import java.io.*;
    import java.awt.image.*;
    
    import java.awt.event.*;
    
    import java.util.concurrent.TimeUnit;
    
    public class WhackComponent extends JComponent
    {    
        int xCoord[] = new int[] {25, 171, 317, 463, 609, 25, 171, 317, 463, 609, 25, 171, 317, 463, 609, 25, 171, 317, 463, 609};
        int yCoord[] = new int[] {275, 275, 275, 275, 275, 395, 395, 395, 395, 395, 515, 515, 515, 515, 515, 635, 635, 635, 635, 635,};
        BufferedImage userInterface, mario;
        Random coordGen = new Random();
        Thread thread;
        int element;
        public void paintComponent(Graphics g)
        {      
            Graphics2D g2 = (Graphics2D) g;
            try
            {
                userInterface = ImageIO.read(new File("UserInterface.png"));
            }
            catch(IOException e)
            {    
                e.printStackTrace();
            }
            g2.drawImage(userInterface, null, 0, 0);
    
            for(int i=0; i<25; i++)
            {
    
                element = coordGen.nextInt(20);
                try
                {
                    mario = ImageIO.read(new File("Mario Up.png"));
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
                g2.drawImage(mario, null, xCoord[element], yCoord[element]);
                try 
                {
                    Thread.sleep(1);
                } 
                catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }
            }
        }
    
        public void enterMove()
        {
        } 
    
        public void releaseMove() 
        {
        }
    
        public void actionPerformed(ActionEvent event)
        {
    
        }
    }
    

1 个答案:

答案 0 :(得分:1)

它应该以这种方式工作:你在paintComponent(Graphics)内提供绘图逻辑,系统会在检测到屏幕需要刷新时回电。在Swing应用程序中,触发器通常是用户与计算机交互,例如通过按键或单击鼠标,而在应用程序中,您需要一个具有自己的主循环的游戏引擎,显示/隐藏痣,与音乐交互引擎和处理输入事件取决于世界的状态。在Swing中,通过调用.invalidate()使布局层次结构无效。

请注意JButton和其他Swing组件只是一种方便的方式来绘制内容(尤其是在布局管理器的帮助下绘制屏幕尺寸)和处理事件,但你当然可以编写一个简单的游戏通过使用像您的示例中的单个JComponent(我认为this可能有帮助)

随机提示:paintComponent必须快,我的意思是非常快,因此您无法从文件系统中读取PNG并将其转换为位图。在游戏初始化时,加载必须恰好发生一次