2011-06-03 37 views
5

Bir java uygulamasında oyun yapıyorum ve titremeyi azaltmak için kodumu optimize etmeye çalışıyorum.Java'da birkaç bufferedImages kullanma

Zaten çift ara belleğe alma uyguladık, o yüzden değişmez oyunun arka plan elemanlarının resmini saklamak için başka BufferedImage kullanmaya çalışıyorum. İşte ...

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

} 

kodumu ilgili kısmı var Bu yüzden bu() yöntemi bir kenara titremesi gelen, çalışıyor, ancak paintGameScreen komutları çizmek tüm varken ben böyle ayrıldığında initializeDiffVars() 'da çekilen resimlerden hiçbiri görünmüyor, ancak metin yok. Biri yardım edebilecek olursa çok takdir edilecektir.

+1

Tahminimce: Söz konusu görüntüler initializeDiffVars'ın çalışması sırasında yüklenmemiş. Ama resim her boyandığında boyanırlar çünkü hızlı bir şekilde yüklenirler. Bu görüntülerin nasıl yükleneceğini görmeden söylemek zor. –

cevap

3

JApplet'u uzatır ve içerik için varsayılan olarak çift tamponlu olan JPanel'u kullanırdım. Güncelleme alanını sınırlandırmaya çalışıyorsanız, here'da gösterilen getSubimage()'a bakabilirsiniz.

+0

Öyleyse, aynı şeyi arabellek görüntüsünün yerine esasen bir JComponent ile yapacağım. Bir Jcompnent'e, tamponlu bir görüntüye aynı şekilde boyayabilir misiniz? Ve hala JApplet'in() paint() yöntemini kullanıyorum veya update() kullanıyorum mı, fark nedir? Birçok soru sorduğum için üzgünüm, sadece Jcompnents ve benzerlerini bilmiyorum. –

+0

Platformun 'PanelUI'sini kullandığı için içerik panosu için '' JComel '' alt sınıfı '' JPanel' tercih ederim. Ya da, (burada) belirtildiği gibi, "paint()" yerine "paintComponent()" i (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks) ve bu [örnek] 'de gösterilmiştir (https://sites.google.com/site/drjohnbmatthews/subway). – trashgod

İlgili konular