2009-11-06 3 views
16

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

public event EventHandler<PlayerIndexEventArgs> Selected; 

^- कैसे इस घटना घोषित किया जाता है जहां PlayerIndexEventArgs EventArgs से विरासत। क्या मैं PlayerIndexEventArgs को छोड़ सकता हूं, या कोई तर्क भेजने के लिए यहां उपयोग करने के लिए कोई डिफ़ॉल्ट प्रकार है? (हो सकता है कि सिर्फ EventArgs आधार वर्ग?)

उत्तर

0

(हो सकता है कि सिर्फ EventArgs आधार वर्ग?)

आप वास्तव में क्या करना चाहिए।

MSDN डॉक्स से EventArgs पर:

इस वर्ग के किसी भी स्थिति डेटा शामिल हैं; यह उन घटनाओं द्वारा उपयोग किया जाता है जो किसी ईवेंट को उठाए जाने पर किसी ईवेंट हैंडलर को राज्य जानकारी पास नहीं करते हैं।

8

प्रयास करें:

public event EventHandler Selected; 

तो कॉल करने के लिए ..

Selected(null, EventArgs.Empty); 

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

+0

इस लड़के को वास्तव में एक्शन वैरिएबल का उपयोग करना चाहिए क्योंकि वे परेशानी से कम हैं और ज्यादातर मामलों में ठीक काम करते हैं। – RCIX

2

तुम बस लिख सकते हैं:

public event EventHandler Selected; 
0

PlayerIndexEventArgs प्रकार आप का उल्लेख द्वारा जा रहे हैं, मैं तुम्हें, XNA का उपयोग कर रहे सही मानते हुए कर रहा हूँ? यदि ऐसा है, तो Game State Management नमूना देखें। यदि कोड आपको यह समझने में सहायता नहीं कर सकता है कि वैसे भी इसे कैसे किया जाए।

40

आप कार्य प्रतिनिधि का उपयोग कर सकते हैं। यह उस डेटा का उपयोग करके अधिक सुंदरता से है जहां आपको कभी आवश्यकता नहीं होगी (मेरा मतलब EventArgs) है।

यहाँ आप गतिविधि को परिभाषित:

public event Action EventWithoutParams; 
public event Action<int> EventWithIntParam; 

और यहाँ आप घटनाओं आग:

EventWithoutParams(); 
EventWithIntParam(123); 

आप सभी जानकारी की Action या Action<T> में की जरूरत है पा सकते हैं।

इनमें से किसी भी घटना को नो-ऑप प्रतिनिधि ... = delegate { }; के साथ शुरू किया जा सकता है ताकि आपको ईवेंट को फायर करने से पहले शून्य की जांच करने की आवश्यकता न हो।

+0

स्मार्ट विचार, कोई सुराग नहीं है कि क्यों लोग अपने फायदे बर्बाद करने के लिए घटनाओं के सभी अनावश्यक काम करना चाहते हैं! – RCIX

+4

दुर्भाग्य से, नहीं, बस 'EventWithoutParams()' को कॉल करना ईवेंट को आग लगाने का सबसे अच्छा तरीका नहीं है। कारण, एरिक लिपर्ट बताते हैं, कि आप एक NullReferenceException के साथ समाप्त कर सकते हैं। आपको क्या करने की आवश्यकता है प्रतिनिधि संदर्भ की प्रतिलिपि बनाएँ: 'एक्शन इवेंट विथआउट पैराम्सटेम्प = इवेंट विथआउट पैराम्स;' और फिर एक शून्य जांच करें: 'अगर (eventWithoutParamsTemp! = Null) eventWithoutParamsTemp(); 'संदर्भ: http://blogs.msdn.com/ ericlippert/संग्रह/200 9/04/2 9/घटनाओं और दौड़ .aspx – jasonh

+1

धन्यवाद, जेसन, आपकी टिप्पणी के लिए। मैंने घटना प्रतिनिधि का उपयोग करने पर ध्यान केंद्रित करने के लिए इसे छोड़ दिया, घटनाओं के सही उपयोग पर नहीं। मैंने सोचा कि हर कोई पहले से ही घटनाओं का उपयोग करने के बारे में जानता है :) यदि नहीं - तो उन्हें जेफरी रिचटर की पुस्तक पढ़नी चाहिए। –

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