我正在尝试使用java applet开发游戏,球的运动会停止整个游戏?

时间:2013-09-10 02:06:06

标签: java applet thread-safety awt

这只是游戏的开始,有两个方块,一个可以通过箭头键控制,另一个可以通过鼠标控制,它们可以互相发射球同时可以保存,获得最大命中的一个将获胜... 在这个代码中,当我从第二个方格开火时,有一条长线朝向第二个玩家,整个游戏都要停止..

package raship;

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import java.io.IOException;

public class raship extends Applet implements KeyListener, MouseMotionListener, MouseListener, Runnable
{

    int width,flag1=0,flag2=0,height,x1,y1,x2,y2,calc1,calc2x,calc2y;

    Thread t=null;

    public void init()

    {
        //Toolkit toolkit=Toolkit.getDefaultToolkit();
        t=new Thread();
        width=getSize().width;
        height=getSize().height;
        x1=0;y1=height/2;
        x2=width-10;y2=height/2;
        addMouseListener(this);
        addMouseMotionListener(this);
        addKeyListener(this);
        setBackground(Color.gray);
        repaint();
    }
    public void keyPressed(KeyEvent e) 
    {
        int c=e.getKeyCode();
        System.out.println(c);
        if(c==KeyEvent.VK_LEFT)
        {
            System.out.println("yeah it's on");
            x1-=10;
        }
        else if(c==KeyEvent.VK_UP)
            y1-=10;
        else if(c==KeyEvent.VK_RIGHT)
            x1+=10;
        else if(c==KeyEvent.VK_DOWN)
            y1+=10;
        if(x1>=0 && y1>=0 && y1<=height-20 && x1<=3*width/4)
            repaint();
    }
    public void keyReleased(KeyEvent arg0) {

    }
    public void keyTyped(KeyEvent arg0) {

    }
    public void mouseDragged(MouseEvent e) {

    }
    public void mouseMoved(MouseEvent e) 
    {
        x2=e.getX();
        y2=e.getY();
        if(x2>=5*width/8 && x2<=width-20)
            repaint();
    }
    public void mouseClicked(MouseEvent e) 
    {
        flag2=1;
        calc2x=x2;
        calc2y=y2;
        System.out.println(calc2x);
    }
    public void mouseEntered(MouseEvent arg0) {

    }
    public void mouseExited(MouseEvent arg0) {

    }
    public void mousePressed(MouseEvent arg0) {

    }
    public void mouseReleased(MouseEvent arg0) {

    }
    public void paint(Graphics g)
    {
        width=getSize().width;
        height=getSize().height;
        g.setColor(Color.green);
        g.fillRect(x1, y1, 20, 20);
        g.setColor(Color.red);
        g.fillRect(x2, y2, 20, 20);
        if(flag2==1)
        {
            g.setColor(Color.yellow);
            while(true)
            {
                calc2x-=1;
                System.out.println(calc2x); 
                g.fillOval(calc2x,calc2y,10,10);
                try {
                    Thread.sleep(4);
                } catch (InterruptedException e) {e.printStackTrace();}
                if(calc2x<10)
                {
                    flag2=0;
                    break;
                }
            }
        }
    }
    @SuppressWarnings("static-access")
    public void run()
    {
        if(flag2==1)
        while(true)
        {
            {
                repaint();
                System.out.println("calc2x="+calc2x);
                if(calc2x<10)
                {
                    flag2=0;
                }
                try 
                {
                    t.sleep(4);
                } catch (InterruptedException e) {e.printStackTrace();}
                calc2x-=1;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

从不 在paint方法中有Thread.sleep(...)。 EVER。这会让你的所有绘画都入睡。实际上,简单地在GUI线程中调用Thread.sleep(...)就足以让GUI进入休眠状态,但是更糟糕的是仍然在绘制方法中,因为必须反复调用该方法,并且需要快速且快速地完成眨眼之间或更少。

相反:

  • 创建Swing JApplet,而不是AWT Applet
  • 覆盖JPanel的paintComponent方法以进行绘制
  • 使用Swing Timer进行游戏循环。

修改
您在评论中说明:

  

@HovercraftFullOfEels如果你能写出swing计时器和swing applet的语法,那将会有很大的帮助....

您似乎想要我为您编写教程。我希望我有足够的时间来做到这一点,但是唉,我没有,而且我觉得你和我一起使用已经存在的示例代码查看合适的教程会更有效率等着你学习。例如,请查看以下链接: