2011-07-28 24 views
5

मुझे आम में एक एक्सएनए + सिल्वरलाइट गेम मिला है: शीर्ष पर कुछ सिल्वरलाइट यूआई के साथ अधिकतर एक्सएनए। मेरी समस्या यह है कि जब आप एक बटन दबाते हैं या सिल्वरलाइट नियंत्रण के साथ बातचीत करते हैं, तो स्पर्श जानकारी अभी भी एक्सएनए गेम लूप के साथ पास की जाती है। आप इसे कैसे दबाते हैं?WP7: Silverlight द्वारा संभाले जाने पर XNA स्पर्श इनपुट को दबाने?

+0

'windows-phone-mango' टैग को 'विंडोज-फोन-7.1' के लिए स्वत: हल क्यों किया गया है, यदि वास्तव में यह नहीं है? – RandomEngy

+0

यह एक समानार्थी है। 7.1 वास्तव में आम (7.5) ओएस के लिए एसडीके का संस्करण है। –

+0

नए ओएस का आधिकारिक नाम 7.5 है। कृपया देखें: http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2011/07/26/windows-phone-mango-released-to-manufacturing.aspx –

उत्तर

4

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

आयताकार तत्वों को बदलने, आकार बदलने या ढहने/विस्तार करने के लिए काम करना चाहिए।

public class ControlTouchTracker 
{ 
    private List<FrameworkElement> controls = new List<FrameworkElement>(); 
    private Dictionary<FrameworkElement, ControlRegion> controlBounds = new Dictionary<FrameworkElement, ControlRegion>(); 

    public ControlTouchTracker(FrameworkElement rootElement) 
    { 
     rootElement.LayoutUpdated += this.OnLayoutUpdated; 
    } 

    public void RegisterControl(FrameworkElement control) 
    { 
     controls.Add(control); 
    } 

    public void RemoveControl(FrameworkElement control) 
    { 
     controls.Remove(control); 
     controlBounds.Remove(control); 
    } 

    private void OnLayoutUpdated(object sender, EventArgs e) 
    { 
     foreach (Control control in this.controls) 
     { 
      this.RefreshControlBounds(control); 
     } 
    } 

    private void RefreshControlBounds(FrameworkElement control) 
    { 
     if (this.ControlIsVisible(control)) 
     { 
      try 
      { 
       GeneralTransform controlTransform = control.TransformToVisual(Application.Current.RootVisual); 
       Point offset = controlTransform.Transform(new Point(0, 0)); 

       this.controlBounds[control] = new ControlRegion 
       { 
        Left = (float)offset.X, 
        Right = (float)(offset.X + control.ActualWidth), 
        Top = (float)offset.Y, 
        Bottom = (float)(offset.Y + control.ActualHeight) 
       }; 
      } 
      catch (ArgumentException) 
      { 
      } 
     } 
     else 
     { 
      if (this.controlBounds.ContainsKey(control)) 
      { 
       this.controlBounds.Remove(control); 
      } 
     } 
    } 

    private bool ControlIsVisible(FrameworkElement control) 
    { 
     // End case 
     if (control == null) 
     { 
      return true; 
     } 

     if (control.Visibility == Visibility.Collapsed) 
     { 
      return false; 
     } 

     return this.ControlIsVisible(control.Parent as FrameworkElement); 
    } 

    public bool TouchesControl(Vector2 touchPosition) 
    { 
     foreach (ControlRegion region in this.controlBounds.Values) 
     { 
      if (touchPosition.X >= region.Left && touchPosition.X <= region.Right && 
       touchPosition.Y >= region.Top && touchPosition.Y <= region.Bottom) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    public class ControlRegion 
    { 
     public float Left { get; set; } 
     public float Right { get; set; } 
     public float Top { get; set; } 
     public float Bottom { get; set; } 
    } 
} 

(संपादित) अपडेट किया गया उदाहरण माता पिता तत्वों Visibility में बदलाव के साथ काम करने के लिए।

+0

अभी भी स्थान की जांच कर रहा है, लेकिन कुडोस - आपको यह विचार मिला है! –

3

एक्सएनए कार्यों के साथ इंटरऑप के तरीके के कारण, आप हमेशा एक्सएनए और सिल्वरलाइट द्वारा संसाधित स्पर्श इनपुट प्राप्त करेंगे - कुछ हद तक, एक्सएनए को प्राथमिकता मिलती है, इसलिए सिल्वरलाइट इसके शीर्ष पर कार्य करता है। क्या आप, कर सकता है यदि आप विशिष्ट इशारा स्थानों (जैसे जहां सिल्वरलाइट बटन स्थित हैं) को नजरअंदाज करने की जरूरत है, तो आप की जांच कर सकता इशारा स्थिति:

if (TouchPanel.IsGestureAvailable) 
{ 
    if (TouchPanel.ReadGesture().GestureType == GestureType.Tap) 
    { 
     if (TouchPanel.ReadGesture().Position == new Vector2(120, 120)) 
     { 

     } 
    } 
} 
+0

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

+0

बस एसएल नियंत्रण के लिए एक विशिष्ट क्षेत्र है और इसके खिलाफ जांचें। या, खेल के दौरान एसएल नियंत्रणों का उपयोग करने के तरीके को फिर से सोचें ताकि एक साधारण स्पर्श प्रक्रिया को प्रभावित नहीं करेगा। –

+0

मैं कुछ "सिल्वरलाइट" क्षेत्र को बंद करके अपने खेल को बाधित नहीं करना चाहता हूं। मैं उन्हें पंजीकृत करने के अपने दृष्टिकोण की कोशिश करने जा रहा हूं और उन क्षेत्रों में स्पर्शों को स्वचालित रूप से अनदेखा कर रहा हूं जहां नियंत्रण हैं। आखिरी चीज जो मैं चाहता हूं वह एक बग है जहां मैंने नियंत्रण को स्थानांतरित कर दिया है और जादू रजत-केवल क्षेत्र को अपडेट करना भूल गया है। – RandomEngy