2012-04-09 17 views
5

मैंने अभी वीडियो गेम कोडिंग शुरू कर दी है और मैंने सुना है कि एक जेपीनल पर अपनी सारी ड्राइंग कर रही है और उस पैनल को जेएफआरएएम पर जोड़ना सिर्फ जेएफआरएएम पर ड्राइंग करने से बेहतर है। मैं बस सोच रहा था कि यह बेहतर क्यों है?जेपीनल को बेहतर क्यों जोड़ रहा है?

+3

आपका स्रोत क्या है? – mre

+0

@mre यह कुछ है जो मैं आमतौर पर अनुशंसा करता हूं (या उसके करीब - मेरा जवाब देखें), लेकिन उस जानकारी पर ओपी के सटीक स्रोत को सुनने में भी दिलचस्पी है। सवाल पूछने वाले व्यक्ति को। यह उस छोटी अतिरिक्त जानकारी के साथ 'अच्छा सवाल' बन जाएगा। –

+0

+1, कुछ जावा प्रश्नों में से एक मुझे जवाब पता है। एक बार [जावा आरपीजी गेम] (https://github.com/intermediate-hacker/Pro_RPG) बनाया, इसे पूरी तरह से आनंद लिया। :) – ApprenticeHacker

उत्तर

9

यह सहित कई कारणों के लिए बेहतर है:

  • सबसे घुमाओ घटकों में, कस्टम चित्रकला paintComponent(Graphics) विधि अधिभावी द्वारा हासिल की है। शीर्ष-स्तरीय स्विंग कंटेनर (उदा। JFrame, JApplet, JWindow) केवल paint(Graphics) है। चित्रकला के लिए सामान्य विधि के परिणामस्वरूप, जो लोग आम तौर पर आम और उच्च-स्तरीय घटकों के बीच इस अंतर को भूल जाते हैं, और इसलिए मूर्ख सलाह देते हैं। ;)
  • एक JComponent एक JFrame करने के लिए एक JApplet, या एक JDialog, या एक JPanel में एक लेआउट के एक बाधा है, या एक JInternalFrame, या एक जोड़ा जा सकता है, या ..जब आपको लगता है कि आपका जीयूआई पूरा हो गया है, तो ग्राहक कहता है, "अरे, टूल-बार & में फेंकना अच्छा नहीं होगा, इसे एक एप्लेट के रूप में भी पेश किया जाए?" JComponent दृष्टिकोण उस पर आसानी से अनुकूलन करता है।
  • समृद्ध द्वारा समझाया गया (कोड के साथ पूर्ण!), कस्टम घटक को चित्रित करने के लिए आवश्यक समन्वय की गणना करना आसान है, और यदि इसका पसंदीदा आकार है, तो JFrame को 'बिल्कुल सही आकार' आकार देने के लिए जीयूआई (pack() का उपयोग करके) को शामिल करने के लिए। यह विशेष रूप से तब होता है जब अन्य घटक भी जोड़े जाते हैं।

अब, सलाह के साथ दो नाबालिग असहमति की पेशकश की।

यदि संपूर्ण घटक कस्टम पेंट किया गया है, तो को ImageIcon/JLabel कॉम्बो के अंदर आसानी से रखना बेहतर हो सकता है। यहां painting to an image का उदाहरण दिया गया है।
जब यह बात आती है इसे अद्यतन करने के लिए समय: एक Graphics या createGraphics() एक Graphics2D

  • के लिए के लिए

    1. कॉल getGraphics() कि ग्राफिक्स उदाहरण के लिए कस्टम चित्र ड्रा
    2. ग्राफिक्स उदाहरण के निपटान
    3. कॉल repaint() पर पर्ची।
  • +1

    पैनल के यूआई प्रतिनिधि को प्राप्त करने के लिए कुछ लाभ है। – trashgod

    +0

    @trashgod मुझे याद दिलाने के लिए धन्यवाद। हालांकि कुछ चीजें हैं, जिन्हें मैं समझ नहीं पा रहा हूं। 1) ऐसा लगता है कि पैनल यूआई ['JPanel.getUI()'] से प्राप्त किया गया है (http://docs.oracle.com/javase/7/docs/api/javax/swing/JPanel.html#getUI%28 % 2 9), क्या यह सही है? 2) एक 'जेकंपोनेंट' क्यों नहीं होगा (यूआई के प्रतिनिधि के पास) है? 3) क्या मुझे इन मामलों पर अपना खुद का प्रश्न शुरू करना चाहिए? –

    +0

    ए 'जेकंपोनेंट' के पास कोई प्रतिनिधि नहीं है, लेकिन यह उप-वर्गों के लिए कुछ बुनियादी आधारभूत संरचना प्रदान करता है। [* एक कस्टम स्विंग घटक कैसे लिखें *] (http://today.java.net/pub/a/today/2007/02/22/how-to-write-custom-swing-component.html) एक है उदाहरण। – trashgod

    6

    डबल बफरिंग करने का यह एक आसान तरीका है।

    मुझे थोड़ा विस्तार करने दें। वीडियो गेम में, चिकना ग्राफिक्स को फिर से चलाने और प्रदर्शित करने के कारण झिलमिलाहट से बचने के लिए, लोग आमतौर पर डबल बफरिंग का उपयोग करते हैं। वे एक ऑफस्क्रीन सतह बनाते हैं, उस पर सब कुछ खींचते हैं और फिर स्क्रीन पर पूरी ऑफ-स्क्रीन सतह को एक बार में प्रदर्शित करते हैं।

    Double Buffering

    Java2D और स्विंग, यह करने के लिए सबसे आसान तरीका में, बस एक JPanel पर अपने खेल स्प्राइट ड्राइंग करते हैं, और फिर एक JFrame को JPanel जोड़ना है।

    दूसरा, जेपीनल पर चीजों को चित्रित करके, आप जेएफआरएम पर गेम लूप में मैन्युअल रूप से पेंट किए बिना अधिक जीयूआई विजेट और अन्य ग्राफिकल ऑब्जेक्ट्स को प्रदर्शित करने की अनुमति देते हैं। उदाहरण के लिए बटन, मेनू, अन्य पैनल, यहां तक ​​कि अन्य प्रतिपादन जेपीनल।

    तीसरा, यह आपको अपने गेम के लिए स्वचालित रूप से अनुवादित समन्वय का उपयोग करने की अनुमति देता है। खिड़की की सीमा-चौड़ाई, कार्य पैनल, शीर्षक इत्यादि जैसे खिड़की प्रबंधक विशिष्ट चीजों के बारे में चिंता किए बिना आप सबकुछ ऊपर-बाएं से नीचे दाएं दाएं खींच सकते हैं!

    translated co-ordinates

    इसके अलावा, यह केवल जावा में खेल प्रोग्रामर्स द्वारा प्रयोग किया जाता सिर्फ एक सम्मेलन नहीं है। एक अलग खेल बोर्ड, रेंडर पैनल या ग्राफिक्स विजेट एक लोकप्रिय मेनलोप जैसे जीयूआई टूलकिट के साथ लाइब्रेरी का उपयोग करते हुए प्रोग्रामिंग गेम काफी लोकप्रिय है। आप जीटीके + में विंडोज फॉर्म में एक फॉर्म फॉर्म और ड्रॉइंग बोर्ड का उपयोग कर सकते हैं।

    +0

    जेपीनल पर एक छवि खींचना और उसके बाद जेफनेल को जेएफआरएएम में जोड़ना डबल-बफरिंग नहीं करना है। मुझे यकीन है कि आप जेएफआरएएम में डबल-बफर कर सकते हैं। – Richante

    +0

    @ रिचांटे मैं बहुत अच्छी तरह से जानता हूं कि आप एक जेएफआरएएम में बफर को दोगुना कर सकते हैं, मैंने जो कहा था वह जेपीनल का उपयोग कर रहा था, _easiest_ तरीका है, _2ly_ तरीका जावा 2 डी और स्विंग के साथ डबल-बफरिंग करने का तरीका नहीं है। – ApprenticeHacker

    +0

    @ रिचांटे भी, डबल-बफरिंग करने का यह तरीका क्यों नहीं है? इसका उपयोग अक्सर उस उद्देश्य के लिए किया जाता है। – ApprenticeHacker

    5

    जेएफआरएएम में मेनू, शीर्षक बार और सीमा जैसी चीजें शामिल हैं। इसलिए, जब आप निर्देशांक का संदर्भ लेते हैं तो आपको इनके लिए जिम्मेदार होना पड़ता है। आप फ्रेम में मेनू बार, या कुछ अन्य घटक जोड़ने का भी निर्णय ले सकते हैं। यदि आपकी पेंटिंग सभी जेपीनल में है, तो यह नहीं बदलेगा कि आपको निर्देशांक को संदर्भित करने की आवश्यकता है।

    उदाहरण के लिए, कोशिश:

    public class Test extends JFrame { 
    
    public Test() { 
        super(); 
        setVisible(true); 
        setBounds(100, 100, 200, 100); 
    } 
    
    @Override 
    public void paint(Graphics g) { 
        g.fillRect(0, 0, 50, 50); 
    } 
    
    public static void main(String[] args) { 
        new Test(); 
    } 
    
    } 
    

    और आपको लगता है कि काला वर्ग वर्ग नहीं है देखेंगे! क्योंकि (0, 0) पूरे फ्रेम का ऊपरी बाएं कोने है, दृश्य क्षेत्र के कोने नहीं।

    संबंधित मुद्दे