2011-06-03 13 views
5

Estoy haciendo un juego en un applet de Java y estoy tratando de optimizar mi código para reducir el parpadeo.Uso de varias imágenes en búfer en java

Ya he implementado el almacenamiento en doble buffer, por lo que estoy tratando de utilizar otra imagen almacenada para almacenar una imagen de los elementos del fondo del juego que no cambian. Aquí está la parte relevante de mi código ...

public class QuizApplet extends Applet 
{ 
//The image I'm trying to use to store components of the game's gui that don't change within a game 
private BufferedImage QBuffImg = new BufferedImage(700,550,2); 
private Graphics2D QBuffG2 = QBuffImg.createGraphics(); 

//The image I use to double buffer 
private final BufferedImage drawTo = new BufferedImage(700,550,2); 
private final Graphics2D bufferG2 = drawTo.createGraphics(); 

public void paint(Graphics g) 
{ 
    bufferG2.drawImage(bg, 0, 0, this); 


    if(gamescreen == 1) 
    { 

     paintGameFrame(bufferG2); 
     g.drawImage(drawTo, 0, 0, this); 
    } 
} 

//This paints all of the elements of the gui that change with each question 
private void paintGameFrame(Graphics2D g2) 
{ 
g2.setColor(Color.BLACK); 
g2.setFont(font1); 
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,   RenderingHints.VALUE_ANTIALIAS_OFF); 
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); 

//Drawing the non changing components 
g2.drawImage(QBuffImg, 0, 0, this); 

g2.drawImage(getImage(getCodeBase(),currentQ.getFigure().getImgLoc()),78,177,this); 
printStringInBox(String.valueOf(Qnumber),font2, g2, 6,71,48, 113,true); 
printStringInBox("Score: "+person.getScore(),font1,g2,10,8,210,55,false); 
printStringInBox("Time: "+String.valueOf(qTimer),font1,g2,475,8,675,55,true); 
printStringInBox(currentQ.getQuerry(),font1,g2,80,68,622,118,true); 
printStringInBox(currentQ.getFigName(), font2, g2, 50, 425, 265, 470,true); 
printStringInBox(pos1.getChoice().getText(), font2, g2, pos1.getX1()+20, pos1.getY1(), pos1.getX2()-20, pos1.getY2(),true); 
printStringInBox(pos2.getChoice().getText(), font2, g2, pos2.getX1()+20, pos2.getY1(), pos2.getX2()-20, pos2.getY2(),true); 
printStringInBox(pos3.getChoice().getText(), font2, g2, pos3.getX1()+20, pos3.getY1(), pos3.getX2()-20, pos3.getY2(),true); 
printStringInBox(pos4.getChoice().getText(), font2, g2, pos4.getX1()+20, pos4.getY1(), pos4.getX2()-20, pos4.getY2(),true); 
printStringInBox("Multiplier: x"+String.valueOf(Math.round((difflevel+.10*multiplier)*10)/10.0), font1, g2, 245, 496, 458, 550, true); 
if(waiting) 
{ 
    g2.drawImage(right_wrongPic, lastChoicePos.getX1()-30,lastChoicePos.getY1()-12,this); 
} 
} 

private void initializeDiffVars() 
{ 

QBuffG2.setColor(Color.BLACK); 
QBuffG2.setFont(font1); 
QBuffG2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); 
QBuffG2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); 
QBuffG2.drawImage(frame, 24, 124, null); 
QBuffG2.drawImage(framebg, 29, 130, null); 
QBuffG2.drawImage(stick, (getWidth()/3)-2, -9, null); 
QBuffG2.drawImage(stick, (2*getWidth()/3)-2, -9, null); 
QBuffG2.drawImage(stick, getWidth()/3, getHeight()-54, null); 
QBuffG2.drawImage(stick, (2*getWidth()/3)-2, getHeight()-54, null); 
QBuffG2.drawImage(nameBG, 20, 430, null); 
QBuffG2.drawImage(querrybg, 50,68,null); 
QBuffG2.drawImage(querrybg, 50,68,null); 
QBuffG2.drawImage(Qbg, pos1.getX1(), pos1.getY1(), null); 
QBuffG2.drawImage(Qbg, pos2.getX1(), pos2.getY1(), null); 
QBuffG2.drawImage(Qbg, pos3.getX1(), pos3.getY1(), null); 
QBuffG2.drawImage(Qbg, pos4.getX1(), pos4.getY1(), null); 
printStringInBox(person.getName(),font1,QBuffG2,243,8,451,55,true); 
printStringInBox(String.valueOf(NUMQUESTIONS),font2, QBuffG2, 655,71,697,113, true); 
printStringInBox("High Score: "+highScoreDisp, font1, QBuffG2, 5, 495, 227, 550, true); 
printStringInBox("New Game",font1,QBuffG2,newGame.getX1(),newGame.getY1(),newGame.getX2(),newGame.getY2(),true); 

repaint(); 
} 

} 

Así que cuando tengo todos estos dibujan comandos en el paintGameScreen() método funciona bien, aparte del parpadeo, pero cuando me separé de él de esta manera, ninguna de las imágenes dibujadas en initializeDiffVars() aparece, pero sí el texto. Si alguien pudiera ayudar, sería muy apreciado.

+1

Supongo que las imágenes en cuestión no se han cargado cuando se ejecuta initializeDiffVars. Pero cuando la pintura se rehace, se pintan porque se cargan rápidamente. Difícil de decir sin ver cómo se cargan estas imágenes. –

Respuesta

3

Ampliaré JApplet y usaré JPanel, que es de doble amortiguación por defecto, para el contenido. Si intenta limitar el área de actualización, puede consultar getSubimage(), que se muestra en here.

+0

Ok, entonces esencialmente haría lo mismo con un JComponent en lugar de la imagen almacenada. ¿Puedes pintar a un JCompnent de la misma manera que a una imagen almacenada? ¿Y todavía uso el método paint() de JApplet() o uso update(), y cuál es la diferencia? Lamento hacer tantas preguntas, simplemente no estoy familiarizado con Jcompnents y similares. –

+0

Prefiero 'JPanel' (una subclase de' JComponent') para el panel de contenido, ya que utiliza la 'PanelUI' de la plataforma. Para cualquiera, anule 'paintComponent()' en lugar de 'paint()', como se menciona [aquí] (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks) y que se muestra en este [ejemplo] (https://sites.google.com/site/drjohnbmatthews/subway). – trashgod

Cuestiones relacionadas