2011-11-02 15 views
6

मैं कुछ साधारण 2 डी गेम प्रोग्रामिंग का अभ्यास कर रहा हूं, और एक सिद्धांत के साथ आया कि एनीमेशन के दौरान (छवि स्थिति में वास्तविक परिवर्तन सबसे अच्छी तरह से फ़्लोटिंग पॉइंट नंबरों के साथ गणना की जाती है)। मुझे एहसास है कि यदि आप इन्ट्स के साथ एक छवि को स्थानांतरित करते हैं तो एनीमेशन उतना आसान नहीं होगा।क्या होता है जब डबल (या फ्लोट) को इन्स में परिवर्तित किया जाता है?

जावा में ऐसा लगता है कि आप छवि को स्थिति देने के लिए फ़्लोटिंग पॉइंट नंबरों के साथ एक छवि नहीं खींच सकते हैं। लेकिन स्पष्ट रूप से जब आप शुरुआत में अपने x और y की घोषणा करते हैं, तो आप उन्हें डबल, या फ़्लोट के रूप में घोषित कर सकते हैं, और जब वास्तव में छवि को चित्रित करने की बात आती है तो आपको उन्हें इनट्स पर डालना होता है। जैसे मुझे HERE:

/** 
* Draw this entity to the graphics context provided 
* 
* @param g The graphics context on which to draw 
*/ 
public void draw(Graphics g) { 
    sprite.draw(g,(int) x,(int) y); 
} 

मेरा प्रश्न यह है कि जावा रूपांतरण को कैसे प्रबंधित करता है? यदि कोड आखिरी मिनट में इन युगल को रोकता है, तो उन्हें पहले स्थान पर दोगुनी क्यों है? क्या जावा दशमलव के बाद संख्याओं को छुपाता है?

मुझे सी और सी ++ में दशमलव के कट होने के बाद संख्याओं में पता है और आप केवल इससे पहले क्या देखते हैं। जावा इस कास्टिंग को कैसे संभालता है?

+2

यह सी, सी ++ के समान दशमलव को छोड़ देता है। http://www.fluffycat.com/Java/Casting/ – dmcnelis

+0

आपको जितना संभव हो उतना दोगुनी गणना करना चाहिए, और जब आप अंततः इसे स्वीकार करने वाली विधि में पास करते हैं, तो आप Math.round() करते हैं। – Stephan

उत्तर

4

डिस्प्ले पर पिक्सल अलग-अलग हैं और संख्या में सीमित हैं; इसलिए प्रदर्शित निर्देशांक को पूर्णांक संख्या होने की आवश्यकता होती है - फ़्लोटिंग पॉइंट नंबरों को कोई समझ नहीं आता है, क्योंकि आपके पास शारीरिक रूप से पिक्सेल नहीं है। (341.4, 234,7)

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

a = 1; 
x = (a/2) * 2; 

a हैं और x, x अंत में 1 की उम्मीद नंबर होगा। यदि वे पूर्णांक हैं, तो आपको 0 मिल जाएगा।

बेसलाइन: भौतिकी कंप्यूटेशंस के लिए फ़्लोटिंग पॉइंट प्रकारों का उपयोग करें और ड्राइंग समय पर int में कनवर्ट करें। इससे आपको आवश्यकतानुसार उतना सटीकता के साथ भौतिकी गणना करने की अनुमति मिल जाएगी।

संपादित करें:

जहां तक ​​पूर्णांक के लिए एफपी संख्या से रूपांतरण का संबंध है, जबकि एफपी संख्या एक बड़ी रेंज है, मानों अपने भौतिकी गणना द्वारा अपने ड्राइंग क्षेत्र आकार सामान्य रूप से एक अतिप्रवाह नहीं करना चाहिए करने के लिए सामान्यीकरण के बाद उत्पादन int प्रकार। जब एक पूर्णांक प्रकार है, जो कलाकृतियों बना सकते हैं करने के लिए परिवर्तित (जैसे सबसे दायीं ओर पिक्सेल स्तंभ में कोई पिक्सल के साथ एक एनीमेशन, कारण उदा 639.9639 बजाय 640 में बदला जा रहा)

जिसके अनुसार, जावा चल बिन्दु संख्या ट्रंकेटस। आप अधिक उचित परिणामों के लिए जावा द्वारा प्रदत्त Math.round() या जावा द्वारा प्रदान की जाने वाली कुछ अन्य राउंडिंग विधियों को देखना चाहेंगे।

2

जावा दशमलव को छोड़कर int को तैरता है। लेकिन मुझे नहीं लगता कि फ्लोट्स में एक्स और वाई निर्देशांक होने से कोई समझ आती है। आपके पास स्क्रीन पर पिक्सेल है जिसे एक पिक्सेल से कम में प्रस्तुत नहीं किया जा सकता है। उदाहरण के लिए आप एक पिक्सेल .5px x .5px नहीं खींच सकते हैं क्योंकि स्क्रीन पर यह केवल 1px x 1px पिक्सेल होगा। मैं कंप्यूटर गेम प्रोग्रामर नहीं हूं लेकिन मैंने जावा में एक एनीमेशन इंजन लिखा है और यह बहुत आसान था। यदि आप चाहें तो मैं इसे साझा कर सकता हूं।

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

+1

फ़्लोट्स विभिन्न कारणों से उपयोगी हैं - उनमें से, 'पाप'/'कोस' (सभ्य रोटेशन के लिए लगभग एक आवश्यकता) व्यावहारिक रूप से उनकी आवश्यकता होती है, और कई मैट्रिक्स ऑप्स संख्यात्मक आंशिक मूल्यों पर संख्याओं को लेने की क्षमता से लाभ उठा सकते हैं। आप उन्हें इनट्स में बदल देते हैं, आप बहुत लचीलापन खो देते हैं (जब तक कि आप अपना खुद का पूर्णांक ट्रिग फ़ंक्शन और ऐसा नहीं लिखना चाहते)। बहुत से लोग उन्हें दोगुनी या तैरते रहेंगे जब तक कि उन्हें पूरी तरह से स्याही नहीं होनी चाहिए। – cHao

+0

यह सच है। मैं इनट्स में अपनी गणना करने का मतलब नहीं था। मेरे आवेदन में मैं अभी भी दो गणना में सभी गणना करता हूं और इनट्स का उपयोग करके आकर्षित करता हूं। मैं इस नोट को प्रतिबिंबित करने के लिए अद्यतन करूंगा। –

+0

@AmirRaminfar क्या मैं इसे देख सकता हूं? – mastrgamr

3

जावा decimals truncates। उदाहरण के लिए:

(int) 2.34 == 2 
(int) 2.90 == 2 

एक अस्थायी स्थिति में आकर्षित करने के लिए सक्षम नहीं होने के लिए कारण बस कोई आधा पिक्सल आदि उपलब्ध न हो :)

+0

मैं देखता हूं। इनपुट के लिए धन्यवाद, यह – mastrgamr

1

कारण x और y जरूरत युगल होने के लिए जब वे करने की आवश्यकता के लिए है गणितीय गणना की, उदाहरण के लिए:

x += (delta * dx)/1000; 

आप अतिप्रवाह और सटीक अप के नुकसान से बचने के लिए जब तक आप पिक्सेल रंग चाहते हैं।

+0

समझ में आता है, इसलिए मुझे लगता है कि डबल को कास्ट करने से पहले अनुमान लगाया जाता है कि यह निकटतम सटीक int के करीब जितना संभव हो सके? (यदि यह समझ में आता है O_o) – mastrgamr

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

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