Mam grę XNA + Silverlight w Mango: głównie XNA z niektórymi interfejsami Silverlight na wierzchu. Problem, który mam, polega na tym, że po naciśnięciu przycisku lub interakcji z kontrolką Silverlight informacje dotyku są nadal przekazywane do pętli gry XNA. Jak to tłumisz?WP7: Tłumienie wejścia dotykowego XNA podczas obsługi przez Silverlight?
Odpowiedz
Wrote klasę, aby wykonać śledzenie dla mnie. Po załadowaniu strony (w obsadzie Loaded) utwórz ją i nadaj jej element główny (aby mógł dołączyć do zdarzenia LayoutUpdated). Zarejestruj wszystkie kontrolki, które mogą nakładać się na powierzchnię gry podczas gry. Następnie zadzwoń do TouchesControl i podaj w pozycji dotykowej, aby dowiedzieć się, czy powinieneś zignorować ten punkt, czy nie. Buforuje regiony kontrolek i aktualizuje je, gdy pojawia się aktualizacja układu.
Powinny pracować dla elementów prostokątnych przesuwających się, zmieniających rozmiar lub zwijających/powiększających.
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; }
}
}
(edit) Zaktualizowany przykład do pracy z dominujących elementów zmieniających Visibility
.
Nadal sprawdzam lokalizację, ale kudos - wpadłeś na pomysł! –
Ze względu na sposób współdziałania z XNA, zawsze otrzymasz dane wejściowe dotyku przetworzone zarówno przez XNA, jak i Silverlight - do pewnego stopnia XNA dostaje priorytet, więc Silverlight działa na nim. Co można zrobić, jeśli trzeba ignorować konkretne lokalizacje gestów (np, gdzie znajdują się przyciski Silverlight), można sprawdzić położenie gest:
if (TouchPanel.IsGestureAvailable)
{
if (TouchPanel.ReadGesture().GestureType == GestureType.Tap)
{
if (TouchPanel.ReadGesture().Position == new Vector2(120, 120))
{
}
}
}
Nie ma sposobu, aby rozwiązać ten problem w ogóle? Czy muszę ręcznie utrzymywać te "martwe strefy"? Może mógłbym napisać coś tam, gdzie zarejestrujesz kontrolki Silverlight do śledzenia i może ci powiedzieć, czy punkt dotykowy jest ważny (na podstawie tego, gdzie jest kontrola, czy jest widoczna czy zwinięta). Następnie pętla XNA wykonuje tę kontrolę przed przetworzeniem dotyku. – RandomEngy
Wystarczy mieć określoną strefę dla elementów sterujących SL i sprawdzić to. Lub przemyśl sposób, w jaki używasz elementów sterujących SL w trakcie gry, aby prosty dotyk nie wpłynął na proces. –
Nie chcę ograniczać mojej gry, usuwając obszar "Silverlight". Zamierzam wypróbować moje podejście do ich rejestrowania i automatycznie ignorować dotknięcia w obszarach, w których są kontrole. Ostatnią rzeczą, której chcę, jest błąd, w którym przeniosłem kontrolę i zapomniałem zaktualizować magiczną strefę tylko dla srebra. – RandomEngy
- 1. Czy gra XNA może korzystać z IsolatedStorageSettings dla WP7?
- 2. Wyświetlanie GIF w aplikacji WP7 z Silverlight
- 3. Windows Phone 7 - Silverlight - Wprowadzanie dotykowe - TouchPoint.Size jest zawsze 1,1
- 4. Zrób zrzut ekranu przy użyciu silverlight 5/xna
- 5. TIZEN SDB Shell - komenda wejścia lub ekranu dotykowego
- 6. Czy mogę zmniejszyć obciążenie rysika/wejścia dotykowego w aplikacji WPF?
- 7. Jak mogę zmienić kolor obrazu w silverlight/WP7 (Color Mask)?
- 8. Nie można znaleźć HttpWebRequest.GetResponse() w projekcie WP7
- 9. Dlaczego strona panoramiczna WP7 przeskakuje podczas aktualizacji?
- 10. Omówienie rozwoju Windows Phone 7. (.net, C#, silverlight, xna) w jaki sposób współdziałają ze sobą?
- 11. Jak znaleźć pozycję ekranu kontrolki w silverlight na WP7?
- 12. Zestaw narzędzi Silverlight dla WP7, DatePicker \ TimePicker problem z fontsize
- 13. Silverlight obsługi naciśnij klawisz wiele kombinacji
- 14. Czego można użyć do odtwarzania efektów dźwiękowych w silverlight na wp7
- 15. Wyświetlanie HTML Divs przez Silverlight
- 16. Wykryj DesignTime w kodzie WP7
- 17. Zatrzymaj tłumienie błędów JavaScript
- 18. WP7 Wiązanie z lokalną zmienną
- 19. tłumienie drukowania każde zadanie
- 20. UIButton - zmiana obrazu dotykowego
- 21. Dlaczego System.Core nie ładuje się podczas dodawania obsługi kodowanego interfejsu użytkownika dla aplikacji Silverlight 5?
- 22. Wyłącz przewijanie w sterowaniu przeglądarki dla WP7?
- 23. Następca/alternatywy dla 2D XNA?
- 24. Tłumienie moreNavigationController w niestandardowym UITabBarController
- 25. Wybierz wejścia z typem numeru przez jQuery
- 26. Silverlight POCO zwrócony przez usługi RIA
- 27. Jak zmienić domyślną czcionkę używaną przez Silverlight?
- 28. Flaga "SingleInstanceHost" dla aplikacji Silverlight
- 29. Tłumienie śledzenia stosu w karmie (AngularJS)
- 30. XNA - Symulowany śnieg
Dlaczego tag 'windows-phone-mango' automatycznie przekształcił się w' windows-phone-7.1', jeśli tak nie jest? – RandomEngy
Jest to synonim. 7.1 jest rzeczywiście wersją zestawu SDK dla systemu operacyjnego Mango (7.5). –
Oficjalna nazwa nowego systemu operacyjnego to 7.5. Zobacz: http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2011/07/26/windows-phone-mango-released-to-manufacturing.aspx –