Borrar parte de los gráficos con la imagen subyacente

Estoy haciendo un 'juego' de tipo en el que el jugador tiene que hacer clic en una imagen que rebota alrededor de la pantalla. El problema es que la pantalla está en oscuridad y el cursor del mouse es una 'linterna' que 'ilumina' un pequeño círculo a su alrededor.

tengo unJFrame en una clase que consiste en:

public class GameFrame {

public static void main(String[] args) throws IOException {

    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    JFrame jf = new JFrame("Flashlight Game");
    jf.setVisible(true);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setSize(d);
    jf.setLocationRelativeTo(null);
    GamePanel gp = new GamePanel();
    jf.add(gp);
}

}

Tengo otra clase queextends JPanel. Aquí están sus campos relevantes a mis problemas:

private Point mouse; //location set by a MouseMotionListener
private BufferedImage myImage;
private int imageX;
private int imageY;
private int imageSpeedX;
private int imageSpeedY;

Mi primer problema radica en la linterna. En mipaint Método, establezco el color de fondo de los gráficos al color de fondo del panel y utilizo elclearRect Método para borrar un área alrededor del cursor del mouse.

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    super.paint(g2);
    checkBounce();
    move();
    g2.drawImage(myImage, imageX, imageY, null);
    g2.setColor(Color.BLACK);
    g2.fillRect(0, 0, this.getWidth(), this.getHeight());
    g2.setBackground(Color.WHITE);
    g2.clearRect((int) mouse.getX() - 25, (int) mouse.getY() - 25, 50, 50);
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    repaint();
}

En realidad hay dos problemas aquí. 1.) ¿Cómo puedo crear unclearOval efecto ya que una linterna no brilla en un rectángulo, y 2.) ¿Cómo puedo hacer que la imagen que rebota aparezca a través del haz de la linterna? Yo se que llamog2.setBackground(Color.WHITE) utilizará el color establecido como el 'fondo' para el área despejada, pero necesito una forma de borrar todos los gráficos, excepto el de fondoJFrame oJPanel color de fondo.

Mi último problema es bastante raro, pero ocasionalmente cuando cambio el valor de unint, la ventana aparecerá en blanco y se debe cambiar el tamaño antes de que se ejecute cualquiera de los códigos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta