Java Swing小程序:如何在不减慢整个程序的情况下减慢或延迟paint()

Java Swing小程序:如何在不减慢整个程序的情况下减慢或延迟paint(),java,swing,applet,Java,Swing,Applet,我正在java swing小程序上创建一个“打鼹鼠”游戏,但我在计时鼹鼠出现时遇到了麻烦。我似乎无法避免paint()在我身上循环,从而太快地随机化了鼹鼠的坐标。如果鼹鼠没有被击中,我怎么能推迟它们上来停留一段时间,然后再下去呢?如何在不延迟整个程序的情况下创建此延迟 请帮忙 import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.Timer

我正在java swing小程序上创建一个“打鼹鼠”游戏,但我在计时鼹鼠出现时遇到了麻烦。我似乎无法避免paint()在我身上循环,从而太快地随机化了鼹鼠的坐标。如果鼹鼠没有被击中,我怎么能推迟它们上来停留一段时间,然后再下去呢?如何在不延迟整个程序的情况下创建此延迟

请帮忙

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;
import javax.swing.Timer;

public class Game extends JApplet
{

    boolean titleScreen = true;
    boolean gameBegin = false;

    // /////////////////////////////////
    // ///// IMAGE /////////
    // /////////////////////////////////

    Dimension dim;
    Image offscreen;
    static Graphics bufferGraphics;
    static Image h1, h2, bg, gamebg, button1a, button1b, button2a, button2b;
    static Image m1, m1a, m1b, m2a, m2b;
    static Image[] mk = new Image [9];

    // /////////////////////////////////
    // ///// MOUSE /////////
    // /////////////////////////////////

    Cursor c;
    boolean myButtonPressed = false;
    boolean myButtonEntered = false;
    int myMouseX = 0, myMouseY = 0;
    int myRow = -1, myCol = -1;

    // /////////////////////////////////
    // / GAME VARIABLES ///
    // /////////////////////////////////

    private static final int[] mX = {5, 170, 335, 5, 170, 335, 5, 170, 335};
    private static final int[] mY = {5, 5, 5, 170, 170, 170, 335, 335, 335};
    int rand, randm;

    static int[] t = new int [9];

    static boolean mhhit = false;
    static boolean[] mhit = {false, false, false, false, false, false, false, false, false};
    private int[] respawnCounter = {0, 0, 0, 0, 0, 0, 0, 0, 0};
    private int[] removeCounter = {0, 0, 0, 0, 0, 0, 0, 0, 0};

    static int score = 0;

    public JFrame window;
    // /////////////////////////////////
    // ///// BUTTON /////////
    // /////////////////////////////////

    GameScreen g1 = new GameScreen ();
    Timer repaintTimer = null;
    // GameTime m1 = new GameTime (t[]);
    // GameTime m2 = new GameTime (t[]);
    // GameTime m3 = new GameTime (t[]);
    // GameTime m4 = new GameTime (t[]);
    // GameTime m5 = new GameTime (t[]);
    // GameTime m6 = new GameTime (t[]);
    // GameTime m7 = new GameTime (t[]);
    // GameTime m8 = new GameTime (t[]);
    // GameTime m9 = new GameTime (t[]);

    public Game ()
    {
        window = new JFrame ("Monkeying Around");
        window.setResizable (false);
        window.setSize (800, 400);
        window.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    }


    public void init ()
    {
        // /////////////////////////////////
        // ///// IMAGE /////////
        // /////////////////////////////////
        dim = getSize ();
        setBackground (Color.white);
        offscreen = createImage (dim.width, dim.height);
        bufferGraphics = offscreen.getGraphics ();

        // Getting all the images
        m1a = getImage (getCodeBase (), "m1a.gif");
        m1b = getImage (getCodeBase (), "m1b.gif");
        m1 = getImage (getCodeBase (), "m1.gif");

        h1 = getImage (getCodeBase (), "hammer.gif");
        h2 = getImage (getCodeBase (), "hammer2.gif");
        bg = getImage (getCodeBase (), "mainbg.gif");
        gamebg = getImage (getCodeBase (), "gbg.gif");
        button1a = getImage (getCodeBase (), "button1a.gif");
        button1b = getImage (getCodeBase (), "button1b.gif");
        button2a = getImage (getCodeBase (), "button2a.gif");
        button2b = getImage (getCodeBase (), "button2b.gif");

        for (int mnum = 0 ; mnum < 9 ; mnum++)
        {
            mk [mnum] = m1;
        }
        ///////////////////////
        /////// MOUSE /////////
        ///////////////////////

        Toolkit tk = Toolkit.getDefaultToolkit ();
        c = tk.createCustomCursor (tk.getImage (""), new Point (0, 0), "invisible");
        setCursor (c);

        addMouseListener (new MyMouseListener ());
        addMouseMotionListener (new MyMouseMotionListener ());

        repaintTimer = new Timer (500, new RepaintAction (this));
        // start the timer.

    } // end init method


    public void start ()
    {
    }


    public Image getMouseImage ()
    {
        if (myButtonPressed)
        {
            return h2;
        }
        return h1;
    }


    public void handleMouseEvents ()
    {
        int nCol = myMouseX - 50;
        int nRow = myMouseY - 50;
        if (!myButtonEntered) // assumed to be: if myButtonEntered is
            // not = true i.e. false
            nCol = nRow = -1;
        if (nCol != myCol || nRow != myRow)
        {
            myRow = nRow;
            myCol = nCol;
        }

        repaint ();
    } // end handleMouseEvents method


    /////////////////////////////////////
    /////// MOUSELISTENER CLASS /////////
    /////////////////////////////////////

    public class MyMouseListener implements MouseListener
    {
        public void mousePressed (MouseEvent me)
        {
            myButtonPressed = true;
            myMouseX = me.getX ();
            myMouseY = me.getY ();
            handleMouseEvents ();
        }

        public void mouseReleased (MouseEvent me)
        {
            myButtonPressed = false;
            myMouseX = me.getX ();
            myMouseY = me.getY ();
            handleMouseEvents ();
        }

        public void mouseEntered (MouseEvent me)
        {
            myButtonEntered = true;
            myMouseX = me.getX ();
            myMouseY = me.getY ();
            handleMouseEvents ();
        }

        public void mouseExited (MouseEvent me)
        {
            myButtonEntered = false;
            myMouseX = me.getX ();
            myMouseY = me.getY ();
            handleMouseEvents ();
        }

        public void mouseClicked (MouseEvent me)
        {
            myMouseX = me.getX ();
            myMouseY = me.getY ();
            handleMouseEvents ();
        }
    } // end MyMouseListener class


    public class MyMouseMotionListener implements MouseMotionListener
    {
        public void mouseMoved (MouseEvent me)
        {
            myMouseX = me.getX ();
            myMouseY = me.getY ();
            handleMouseEvents ();
        } // end mouseMoved method

        public void mouseDragged (MouseEvent me)
        {
            myMouseX = me.getX ();
            myMouseY = me.getY ();
            handleMouseEvents ();
        } // end mouseDragged method
    } // end MyMouseListener class


    public void mouse ()
    {
        // logic to render mouse...
        if (myRow != -1 && myCol != -1)
        { // if you do not hit co-ordinates -1
            // (out of bounds) then
            Image mouseImage = getMouseImage ();
            bufferGraphics.drawImage (mouseImage, myCol, myRow, 100, 100, null, this);
        } // end if
    }


    public void paint (Graphics g)
    {
        bufferGraphics.clearRect (0, 0, dim.width, dim.height);
        repaint ();
        if (titleScreen == true)
        {
            // System.out.println("drawing the main screen");
            mainScreen ();
        }
        if (gameBegin == true)
        {
            game (g);
        }
        mouse ();
        g.drawImage (offscreen, 0, 0, this);
    } // end Paint method


    public void update (Graphics g)
    {
        paint (g);
    }


    public void mainScreen ()
    {
        bufferGraphics.drawImage (bg, 0, 0, 600, 500, Color.red, this);
        bufferGraphics.drawImage (button1a, 427, 384, 159, 49, Color.red, this);
        bufferGraphics.drawImage (button2a, 427, 440, 159, 49, Color.red, this);
        mouse ();
        if (myButtonPressed == true)
        {
            if (myRow > (384 - 50) && myRow < (433 - 50) && myCol > (427 - 50)
                    && myCol < (586 - 50))
            {
                titleScreen = false;
                gameBegin = true;
            }
            else if (myRow > (340 - 50) && myRow < (489 - 50)
                    && myCol > (427 - 50) && myCol < (586 - 50))
            {
                titleScreen = false;
            }
        }
    }





    public void game (Graphics g)
    {
        // new ReminderBeep (5);
        bufferGraphics.drawImage (gamebg, 0, 0, 600, 500, Color.red, this);
        for (int i = 0 ; i < 9 ; i++)
        {
            bufferGraphics.drawImage (mk [i], mX [i], mY [i], 160, 160, Color.red, this);
        }

        g.drawString ("har", 520, 140);
    }


    public void monkeyhit ()
    {
        if (myButtonPressed == true)
        {
            for (int hit = 0 ; hit < 9 ; hit++)
                if (mhit [hit] == true && myRow > (mY [hit] - 50) && myRow < (mY [hit] + 160 - 50)
                        && myCol > (mX [hit] - 50) && myCol < (mX [hit] + 160 - 50))
                {
                    mk [hit] = m1b;
                    mhhit = true;
                    mhit [hit] = false;
                    score += 10;
                }
        }
        // reset ();
    }


    public void run ()
    {
        monkey ();
    }


    // public void reset ()
    // {
    //     mhhit = false;
    //     for (int x = 0 ; x < 9 ; x++)
    //     {
    //         mk [x] = m1;
    //         mhit [x] = false;
    //
    //     }
    //
    // }


    public void monkey ()
    {
        rand = ((int) (Math.random () * 100000000)) + 10000000;
        randm = ((int) (Math.random () * 100));


        if (randm <= 8)
        {
            for (int a = 0 ; a < 9 ; a++)
            {
                if (randm == a)
                {
                    mhit [randm] = true;
                    mk [randm] = m1a;
                }
                else if (randm != a)
                {
                    mhit [a] = false;
                    mk [a] = m1;
                }
            }

            for (int i = 0 ; i < rand * 100 ; i++)
            {
                monkeyhit ();
                if (mhit [randm] = false)
                    mk [randm] = m1;
                break;
            }
        }
    }



    // Timer
    class GameTime
    {
        Toolkit toolkit;
        Timer timer;

        public GameTime (int seconds)
        {
            toolkit = Toolkit.getDefaultToolkit ();
            timer = new Timer (seconds, new MTask ());
            timer.start ();
        }


        /*
        public void delay(int seconds) {
                toolkit = Toolkit.getDefaultToolkit();
                timer = new Timer();
                timer.schedule(new Mdelay(), seconds * 1000);
        }
        */

        class MTask implements ActionListener
        {
            public void actionPerformed (ActionEvent ae)
            {
                /*
                for (int tsec = 0; tsec < 9; tsec++) {
                        t[tsec] = ((int) (Math.random() * 11)) * 5;
                }
                */

            }
        }
    }


    class RepaintAction implements ActionListener
    {
        Game game;
        public RepaintAction (Game game)
        {
            this.game = game;
        }


        public void actionPerformed (ActionEvent e)
        {
            game.repaint ();
        }
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.Timer;
公共类游戏扩展JApplet
{
布尔标题屏幕=真;
布尔gameBegin=false;
// /////////////////////////////////
/////IMAGE/////////
// /////////////////////////////////
尺寸标注;
屏幕外图像;
静态图形;
静态图像h1、h2、bg、gamebg、button1a、button1b、button2a、button2b;
静态图像m1、m1a、m1b、m2a、m2b;
静态图像[]mk=新图像[9];
// /////////////////////////////////
////鼠标/////////
// /////////////////////////////////
光标c;
布尔值myButtonPressed=false;
布尔值myButtonEntered=false;
int-myMouseX=0,myMouseY=0;
int myRow=-1,mycl=-1;
// /////////////////////////////////
///游戏变量///
// /////////////////////////////////
私有静态final int[]mX={5170335,5170335,5170335};
私有静态final int[]mY={5,5,5,170,170,335,335,335};
国际兰特,兰特;
静态int[]t=新int[9];
静态布尔值mhhit=false;
静态布尔值[]mhit={false,false,false,false,false,false,false,false,false,false};
私有int[]respawnCounter={0,0,0,0,0,0,0,0};
私有int[]removeCounter={0,0,0,0,0,0,0,0,0};
静态智力得分=0;
公共框架窗口;
// /////////////////////////////////
////按钮/////////
// /////////////////////////////////
GameScreen g1=新GameScreen();
计时器重新绘制计时器=null;
//游戏时间m1=新游戏时间(t[]);
//游戏时间m2=新游戏时间(t[]);
//游戏时间m3=新游戏时间(t[]);
//游戏时间m4=新游戏时间(t[]);
//游戏时间m5=新游戏时间(t[]);
//游戏时间m6=新游戏时间(t[]);
//游戏时间m7=新游戏时间(t[]);
//游戏时间m8=新游戏时间(t[]);
//游戏时间m9=新游戏时间(t[]);
公共游戏()
{
窗口=新的JFrame(“装模作样”);
window.setresizeable(false);
window.setSize(800400);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
公共void init()
{
// /////////////////////////////////
/////IMAGE/////////
// /////////////////////////////////
dim=getSize();
挫折地面(颜色:白色);
屏幕外=创建图像(尺寸宽度、尺寸高度);
bufferGraphics=offscreen.getGraphics();
//获取所有图像
m1a=getImage(getCodeBase(),“m1a.gif”);
m1b=getImage(getCodeBase(),“m1b.gif”);
m1=getImage(getCodeBase(),“m1.gif”);
h1=getImage(getCodeBase(),“hammer.gif”);
h2=getImage(getCodeBase(),“hammer2.gif”);
bg=getImage(getCodeBase(),“mainbg.gif”);
gamebg=getImage(getCodeBase(),“gbg.gif”);
button1a=getImage(getCodeBase(),“button1a.gif”);
button1b=getImage(getCodeBase(),“button1b.gif”);
button2a=getImage(getCodeBase(),“button2a.gif”);
button2b=getImage(getCodeBase(),“button2b.gif”);
对于(int-mnum=0;mnum<9;mnum++)
{
mk[mnum]=m1;
}
///////////////////////
///////老鼠/////////
///////////////////////
Toolkit tk=Toolkit.getDefaultToolkit();
c=tk.createCustomCursor(tk.getImage(“”),新点(0,0),“不可见”);
设置光标(c);
addMouseListener(新的MyMouseListener());
addMouseMotionListener(新的MyMouseMotionListener());
重新绘制计时器=新计时器(500,新重新绘制(此));
//启动计时器。
}//end init方法
公共无效开始()
{
}
公共映像getMouseImage()
{
如果(按下我的按钮)
{
返回h2;
}
返回h1;
}
公共无效handleMouseEvents()
{
int-nCol=myMouseX-50;
int nRow=myMouseY-50;
if(!myButtonEntered)//假定为:if myButtonEntered为
//非=真,即假
nCol=nRow=-1;
如果(nCol!=myCol | | nRow!=myRow)
{
myRow=nRow;
myCol=nCol;
}
重新油漆();
}//end handleMouseEvents方法
/////////////////////////////////////
///////鼠标听器类/////////
/////////////////////////////////////
公共类MyMouseStener实现了MouseStener
{
public void mousePressed(MouseEvent me)
{
myButtonPressed=true;
myMouseX=me.getX();
myMouseY=me.getY();
handleMouseEvents();
}
公共无效MouseEvent me(MouseEvent me)
{
myButtonPressed=false;
myMouseX=me.getX();
myMouseY=me.getY();
handleMouseEvents();
}
公共无效mouseenterned(MouseEvent me)
{
myButtonEntered=true;
myMouseX=me.getX();
myMouseY=me.getY();
handleMouseEvents();
}
public void mouseexitted(MouseEvent me)
{
myButtonEntered=false;
myMouseX=me.getX();
myMouseY=me.getY();
handleMouseEvents();
}
公共无效mouseClicked(MouseEvent me)
{
myMouseX=me.getX();
M
for(Mole mole : this.moles) {
    if(System.currentTimeMillis() - mole.getStartTime() >= mole.getUpTime()) {
        this.moles.remove(mole); 
    }
}