0

我正在创建一个简单的射击场类型游戏。我已经创建了一个鼠标运动侦听器,并正在使用它在鼠标的当前位置绘制图像。这很好用,但是当我移动光标时,图像会闪烁很多。我已经尝试了几个双缓冲教程,但是这些都不起作用。

这是我的代码

    public class ShootingGallery extends JApplet implements MouseMotionListener {

        //VARIABLES
        int mouseXPos;
        int mouseYPos;
        Image myImage;
        private Image dbImage;
        private Graphics dbg;

        @Override
        public void init() {            
            setSize(800, 600);//SET UP CURSOR IMAGE
            myImage = getImage(getDocumentBase(),"spongebob.gif");
            addMouseMotionListener(this);//ADD ACTION LISTENERS
        }

        @Override
        public void mouseDragged(MouseEvent e) {            
            moveMouse(e); 
        }        

        @Override
        public void mouseMoved(MouseEvent e) {            
            moveMouse(e);
        }        

        public void moveMouse(MouseEvent e){            
              Graphics g = getGraphics();             
              mouseXPos = e.getX() - (myImage.getWidth(null) / 2);
              mouseYPos = e.getY() - (myImage.getHeight(null) / 2);     
              repaint();
        } 

        public void paint(Graphics g)
        {
              super.paint(g);            
              g.drawImage(myImage, mouseXPos, mouseYPos, this);
        }
   }

非常感谢您对此问题的任何帮助

4

2 回答 2

0

当鼠标经过屏幕时,鼠标运动侦听器将被非常频繁地调用,可能与每个经过的像素一样频繁。如果您经常绘制图像,您的代码可能无法跟上,导致它闪烁。

于 2013-06-15T07:13:55.353 回答
0

Swing 已经支持缓冲。只需在另一个容器上绘制而不是顶级容器,请在此处查看代码:

public class ShootingGallery extends JApplet implements MouseMotionListener {

// VARIABLES
int mouseXPos;
int mouseYPos;
Image myImage;

@Override
public void init() {
    setSize(800, 600);// SET UP CURSOR IMAGE
    myImage = getImage(getDocumentBase(), "spongebob.gif");
    addMouseMotionListener(this);// ADD ACTION LISTENERS
    this.add(new PaintContainer());

}
@Override
public void mouseDragged(MouseEvent arg0) {
}

@Override
public void mouseMoved(MouseEvent e) {
    moveMouse(e);
    repaint();
}

public void moveMouse(MouseEvent e) {
    mouseXPos = e.getX() - (myImage.getWidth(null) / 2);
    mouseYPos = e.getY() - (myImage.getHeight(null) / 2);
}

public class PaintContainer extends JPanel {

     protected void paintComponent(Graphics g) {
         g.drawImage(myImage, mouseXPos, mouseYPos, this);
     }
}
}
于 2013-06-15T09:27:10.040 回答