2011-09-01 15 views
7

मैं एक साधारण बॉल गेम लिखने की कोशिश कर रहा हूं, और कई मोड़ हैं (यानी, गेंद जीवन)। जब स्क्रीन स्क्रीन की निचली सीमा से गुज़रती है तो गेंद "मर जाती है"। -> विराम (50) -> light_grayक्या कोई वस्तु स्वयं को हटा सकती है? कैसे?

if (ball.getY() > bottomOfScreen) { 
    ball.die(); 
    remove(ball); 
} 

मरने() विधि मूल रूप से गेंद के रंग धीरे-धीरे fades (dark_gray: क्या मैं अब तक काम करता है है, लेकिन नहीं लगता है काम करने के लिए उचित तरीके से होना करने के लिए -> रोकें (50)), लेकिन वास्तव में कुछ भी उपयोगी नहीं है।

स्पष्ट रूप से, स्क्रीन से गेंद से छुटकारा पाता है, जो मैं चाहता हूं। यह इस निकालने के लिए मुझे समझ में आता है() बॉल की मर() विधि का हिस्सा बनने के लिए, मुख्य कार्यक्रम में एक अलग विधि कॉल होने के विपरीत - लेकिन मुझे यकीन नहीं है कि इस बारे में कैसे जाना है?

क्या कोई वस्तु स्वयं को हटा सकती है? और, यदि यह कर सकता है, तो दार्शनिक/पद्धतिपरक दृष्टिकोण से, ऑब्जेक्ट हत्या से बेहतर आत्महत्या कर रहा है?

धन्यवाद!

+0

केवल एक सुझाव। निकालने से पहले आश्वस्त होना चाहिए कि गेंद की मृत्यु हो गई है, अगर नहीं तो विधि मर जाए() और फिर इसे हटा दें। –

उत्तर

4

ऑब्जेक्ट स्वयं को हटा सकता है क्योंकि इसे दृश्य प्रतिपादन तंत्र के संदर्भ में कुछ प्रकार का संदर्भ दिया गया है।

public class Ball { 
    private ViewRenderer view; 

    public void remove() { 
     view.remove(this); 
    } 
} 

न तो आत्महत्या है और न ही हत्या बेहतर या बदतर है: आपके नमूना तो मैं एक तरह से यह करने के लिए उदाहरण देना देंगे पर्याप्त जानकारी नहीं देता है। यह आपके डिजाइन और आवश्यकताओं पर निर्भर करता है।

इस नमूने हालांकि, हत्याबेहतर इस तरह Ball वस्तु पता करने के लिए जो संदर्भ में उसका उपयोग किया गया की जरूरत नहीं है के बाद से हो सकता है।

+1

क्षमा करें मुझे इसे कम करना है। यह काम करेगा, लेकिन यह एक परिपत्र संदर्भ प्रस्तुत करता है - बॉल में ViewRenderer का संदर्भ है, और (संभवतः) ViewRenderer गेंद का संदर्भ है। ऐसी चीजें परीक्षण करने की अपेक्षा की तुलना में अधिक जटिल बनाती हैं। – DJClayworth

+0

आपके तर्क को समझाने के लिए धन्यवाद। आप सही हैं, हालांकि एक और जटिल परिदृश्य में (यानी, एमवीसी/पर्यवेक्षक पैटर्न का उपयोग करके) ऑब्जेक्ट को हटाने का अनुरोध कर सकता है, उदाहरण के लिए, नियमित परिवर्तन हैंडलर के माध्यम से। –

2

ऑब्जेक्ट को स्मृति से हटाने की भावना में: नहीं, जावा में जिसे कचरा कलेक्टर द्वारा विशेष रूप से संभाला जाता है।

आप जो कर सकते हैं वह ऑब्जेक्ट को उस संग्रह से निकालने के लिए कर सकता है, लेकिन इस ऑब्जेक्ट को उन संग्रहों तक पहुंचने की आवश्यकता होगी (जो ज्यादातर मामलों में व्यवहार्य नहीं होंगे, क्योंकि वहां बहुत सारे संग्रह हो सकते हैं)।

मैं निहित वस्तु (गेंद के) राज्य के लिए मतदान करने के लिए युक्त ऑब्जेक्ट (आपके मामले में स्क्रीन) का सुझाव दूंगा और वास्तव में मृत होने के बाद इसे हटा दूंगा।

3

गेंद बनाने के लिए एक विधि बनाना संभव है, लेकिन यह करना एक बुरी चीज है। स्क्रीन से खुद को हटाने के लिए, बॉल में स्क्रीन का संदर्भ होना चाहिए। यह संदर्भों की एक गोलाकार श्रृंखला बनाता है (बॉल में स्क्रीन का संदर्भ है, स्क्रीन में बॉल का संदर्भ है) जो आपके डिजाइन को और अधिक जटिल बनाने जा रहा है और आपका परीक्षण अधिक जटिल है।

आत्महत्या ठीक है - स्क्रीन गेंद को मरने के लिए कहती है, और गेंद मर जाती है। लेकिन यह एक रिश्ते को हटाने के बारे में है, मर नहीं रहा है। रिश्ते को बनाए रखने की बात स्क्रीन है, और इसलिए इसे हटाने की बात होनी चाहिए।

यह भी याद रखें कि दोनों को एक साथ होने की आवश्यकता नहीं है। स्क्रीन किसी कारण से चारों ओर एक मृत गेंद को रखना चाहती है, और हो सकता है कि वह ऐसी गेंद को हटाना चाहें जो मृत नहीं है। यहां तक ​​कि यदि यह अभी आपके ऐप में नहीं होता है, तो संभावना की अनुमति दें।

1

संभवतः कुछ वस्तु (उदा।स्क्रीन, या जोहान के उदाहरण में व्यू रेंडरर) जिसमें गेंद का संदर्भ है, और इस संदर्भ को हटाने के लिए स्क्रीन ("ऑब्जेक्ट हत्या") द्वारा किया जाना है। "ऑब्जेक्ट आत्महत्या" गेंद को स्क्रीन पर एक संदेश गुजरने के लिए "हत्या" होने के लिए कहा जाता है।

चूंकि यह गेंद है जो जानता है कि सीमा पार हो जाने पर, यह गेंद द्वारा शुरू किए जाने के निष्कासन के लिए मुझे समझ में आता है (आपके डिजाइन के ब्योरे को जानने के बिना)। फिर स्क्रीन कई तरीकों से इस परिवर्तन के बारे में पता लगा सकती है:

  • स्क्रीन गेंद को मतदान कर सकती है।
  • गेंद स्क्रीन पर प्रत्यक्ष पिछड़ा संदर्भ रख सकती है, जो एक दुर्भाग्यपूर्ण परिपत्र निर्भरता बनाता है।
  • गेंद BallObserver इंटरफ़ेस के माध्यम से स्क्रीन का संदर्भ रख सकती है। यह observer pattern का एक आवेदन है।

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

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

0

नहीं, वस्तुएं आत्महत्या नहीं कर सकती हैं। खुद का कोई संदर्भ सिर्फ एक संदर्भ है।

ऑब्जेक्ट को "स्पष्ट" करने के लिए, केवल सभी इंस्टेंस चर को साफ़ कर देगा।

अपने आप के बाहर ऑब्जेक्ट को "साफ़" करने के लिए एक चर वैरिएबल बराबर सेट करेगा।

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