2011-06-03 5 views
5

में कई bufferedImages का उपयोग करके मैं जावा एप्लेट में एक गेम बना रहा हूं और मैं झटके को कम करने के लिए अपने कोड को अनुकूलित करने की कोशिश कर रहा हूं।जावा

मैं पहले से ही डबल बफरिंग को क्रियान्वित किया है, इसलिए मैं आदेश खेल की पृष्ठभूमि के तत्वों है कि परिवर्तन नहीं करते की एक तस्वीर स्टोर करने के लिए में एक और BufferedImage उपयोग करने के लिए कोशिश कर रहा हूँ। यहाँ मेरी कोड के संबंधित भाग है ...

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

} 

तो मैं इन आकर्षित paintGameScreen में आदेश() विधि यह ठीक काम करता है, एक तरफ अस्थिर से है, लेकिन सभी को है, जब जब मैं इसे इस तरह विभाजित, प्रारंभिक DiffVars() में खींची गई छवियों में से कोई भी दिखाई नहीं देता है, लेकिन पाठ करता है। अगर कोई मदद कर सकता है तो इसकी सराहना की जाएगी।

+1

मेरा अनुमान है: प्रश्न में छवियों समय initializeDiffVars चलाता द्वारा लोड नहीं किया है। लेकिन जब चित्रकला को फिर से हटा दिया जाता है तो वे चित्रित होते हैं क्योंकि वे जल्दी से लोड होते हैं। यह देखने के बिना मुश्किल है कि इन छवियों को कैसे लोड किया जाता है। –

उत्तर

3

मैं JApplet का विस्तार करूंगा और JPanel का उपयोग करूंगा, जो सामग्री के लिए डिफ़ॉल्ट रूप से डबल buffered है। यदि आप अद्यतन क्षेत्र को सीमित करने का प्रयास कर रहे हैं, तो आप getSubimage() देख सकते हैं, here दिखाया गया है।

+0

ठीक है, तो क्या मैं अनिवार्य रूप से एक ही चीज़ को jfomponent के साथ buffered छवि के स्थान पर करूँगा। क्या आप एक jcompnent को उसी तरह से पेंट कर सकते हैं जिस तरह से आप एक buffered छवि कर सकते हैं? और क्या मैं अभी भी JApplet() की पेंट() विधि का उपयोग करता हूं या क्या मैं अद्यतन() का उपयोग करता हूं, और क्या अंतर है? इतने सारे प्रश्न पूछने के लिए खेद है, मैं सिर्फ जंपपेंट्स और इसी तरह से अपरिचित हूं। –

+0

मैं, सामग्री फलक के लिए 'JPanel' (एक' JComponent' के उपवर्ग) पसंद करते हैं के रूप में यह मंच के 'PanelUI' उपयोग करता है। या तो के लिए, paintComponent() '' बजाय रंग की() ', उल्लेख किया [यहां] (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks) और ओवरराइड' इस [उदाहरण] में दिखाया गया है (https://sites.google.com/site/drjohnbmatthews/subway)। – trashgod