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

我正在尝试使用JavaApplet开发一个游戏,球的运动会停止整个游戏?,java,applet,thread-safety,awt,Java,Applet,Thread Safety,Awt,这只是游戏的开始,其中有两个方块,一个可以用箭头键控制,另一个可以用鼠标控制,它们可以相互发射球,同时可以被保存,命中率最高的方块将获胜。。。 在这段代码中,当我从第二个广场开火时,有一条长线朝着第二个玩家走去,整个游戏必须停止 package raship; import java.awt.*; import java.awt.event.*; import java.applet.*; import java.io.IOException; public class raship

这只是游戏的开始,其中有两个方块,一个可以用箭头键控制,另一个可以用鼠标控制,它们可以相互发射球,同时可以被保存,命中率最高的方块将获胜。。。 在这段代码中,当我从第二个广场开火时,有一条长线朝着第二个玩家走去,整个游戏必须停止

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;
            }
        }
    }
}
package-raship;
导入java.awt.*;
导入java.awt.event.*;
导入java.applet.*;
导入java.io.IOException;
公共类raship扩展小程序实现KeyListener、MouseMotionListener、MouseStener、Runnable
{
整数宽度,flag1=0,flag2=0,高度,x1,y1,x2,y2,calc1,calc2x,calc2y;
线程t=null;
公共void init()
{
//Toolkit=Toolkit.getDefaultToolkit();
t=新螺纹();
宽度=getSize().width;
高度=getSize()。高度;
x1=0;y1=高度/2;
x2=宽度-10;y2=高度/2;
addMouseListener(这个);
addMouseMotionListener(此);
addKeyListener(此);
挫折背景(颜色:灰色);
重新油漆();
}
按下公共无效键(按键事件e)
{
int c=e.getKeyCode();
系统输出打印ln(c);
if(c==KeyEvent.VK_左)
{
System.out.println(“是的,它是开着的”);
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;
如果(x1>=0&&y1>=0&&y1从不在绘制方法中使用
Thread.sleep(…)
。这会使所有绘图处于休眠状态。实际上,只需调用
Thread.sleep(…)
在GUI线程中足以使GUI进入睡眠状态,但在绘制方法中更糟糕,因为该方法必须反复调用,并且需要在眨眼或更短的时间内快速重复调用

相反:

  • 创建Swing JApplet,而不是AWT小程序
  • 重写JPanel的paintComponent方法以进行绘图
  • 使用挥杆计时器进行游戏循环。
编辑
您在评论中声明:


@如果你能写出swing定时器和swing小程序的语法,那将非常有帮助

您似乎希望我为您编写教程。我希望我有所有的时间来这样做,但是,唉,我没有,而且我觉得您和我都可以更有效地查看包含示例代码的体面教程,这些示例代码已经存在,正等着您学习。例如,请查看以下内容链接:


+1似乎非常模糊,你甚至需要一个
线程。睡眠(…)
在一种绘画方法中,因为它严格用于绘画。而且,
while
循环似乎也有点奇怪。因为我是java小程序的新手,对此不太了解…实际上我想在这段代码中生成多个移动球…这将通过单击鼠标来实现…如果可能的话请提前帮助…thanx。!!@aka_007:对于具体的答案,您需要提出具体的问题。@HovercraftFullOfEels如果您能编写swing定时器和swing小程序的语法,将非常有帮助。@HovercraftFullOfEels-okae-thanx!!