2013-06-15 2 views
0

Я создаю простую игру типа тир. Я создал прослушиватель движения мыши и использую для рисования изображения в текущей позиции мыши. Это прекрасно работает, но изображение слегка мерцает, когда я перемещаю курсор. Я попробовал несколько двухбуквенных учебников, но ни одна из них не работает.Java Applet Чрезмерное мерцание

Вот мой код

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); 
     } 
    } 

Любая помощь с этим вопросом очень ценится

+0

Вместо того, чтобы перекрасить весь экран «перекрасить» только часть, которая будет изменена. –

+0

Я довольно новичок в java, как именно я это сделал? – user2488275

+0

@ExtremeCoders Менеджер перерисовки, как правило, неплохо разбирается в этом и создает контекст графического изображения соответственно, но контакты верхнего уровня не являются двойными буферами, которые являются основным источником проблемы. – MadProgrammer

ответ

0

Свинг уже поддерживается буферизацией. Просто нарисуйте на другом контейнере не верхний уровень, пожалуйста, см. Код здесь:

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); 
    } 
} 
} 
+0

Это останавливает мерцание, но не существует способа сделать это, не создавая подкласс – user2488275

0

Движение мыши слушатель будет называться очень часто, как мышь проходит над экраном, возможно, так часто, как раз в транзитный пиксель. Если вы рисуете изображение, которое часто, ваш код может быть не в состоянии идти в ногу, что вызывает его мерцание.

+0

ok есть ли обходной путь? Я попытался использовать инструментарий для фактического изменения курсора на изображение. В то время как это работало, максимальный разрешенный размер был очень мал. Я пытаюсь создать тот же эффект с помощью различных средств, которые позволят мне иметь гораздо больший образ. – user2488275