tomasslavicek

TouchHelper.Instance.ParseTouches

Nov 5th, 2013
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.32 KB | None | 0 0
  1. /// <summary>
  2. /// Dotkl se prstem/myší/prsty displeje...
  3. /// - naparsujeme logický smysl daných dotyků, pořešíme logiku posunu plánu, zoomování apod.
  4. ///   - inspirováno HexaLines (když se dalo ještě otáčet a vkládat najednou)
  5. /// - slouží pro výběr obchodů kliknutím + pro drag & drop plánu
  6. /// - předáváme odkaz na kameru, aby se mohla provést unprojekce
  7. /// - pro dodatečné dojetí po puštění myši se používá objekt KineticScroll2D (ve world souřadnicích)
  8. /// </summary>
  9. public void HandleTouch(List<TouchLocation> tc, TargetCamera camera, GameTime gameTime)
  10. {
  11.     this.camera = camera;
  12.     var s = TouchHelper.Instance.ParseTouches(tc);
  13.     if (s.Touch1 == null)
  14.         return;
  15.            
  16.     // A zpracuje dotyky...
  17.     if (s.NowZooming && s.Touch2 != null)
  18.     {
  19.         // TÁHNE 2 PRSTY = provést zoom (dvoudotykové ovládání... dvěma prsty se dá i posouvat okno)
  20.         // - při startu zoomu (při nastavení nowZooming v LoadTouches) se rovnou nastaví lastZoomPoint1 a lastZoomPoint2,
  21.         //   pak tady posuzujeme o kolik se změnil ten posun (a pokud se změnil, tak zoomujeme)
  22.         // - posun dvěma prsty je bez dojezdu kineticScroll!
  23.         if (s.LastZoomPoint1 == s.Touch1.Value.Position && s.LastZoomPoint2 == s.Touch2.Value.Position)
  24.             return;
  25.  
  26.         ZoomPlan(s); // Předá celý objekt s informacemi o stavu dotyků, aby se podle toho zazoomovalo
  27.         s.LastZoomPoint1 = s.Touch1.Value.Position; // (zoom zároveň i posouvá, podle středu obou prstů)
  28.         s.LastZoomPoint2 = s.Touch2.Value.Position;
  29.         return;
  30.     }
  31.  
  32.     if (!s.NowDragging)
  33.     {
  34.         // KLIKNUL (jedním prstem) / POSUNUL JEN TROŠKU (tj. zatím se plán neposunul)
  35.         // - měří vzdálenost oproti zapamatované startPos1 (vždy při mouseDown se zapamatuje nová)
  36.         // - když přesáhne limit (v těch souřadnicích obrazovky), přepne na posouvání plánu
  37.         if (s.Touch1.Value.State == TouchLocationState.Pressed || s.Touch1.Value.State == TouchLocationState.Moved)
  38.         {
  39.             if (s.Touch1.Value.State == TouchLocationState.Pressed)
  40.                 s.TouchPressed = s.Touch1; // Ochrana - kliknutí se bere jen, když vzešlo od tohoto prstu (ne ze zoomu)
  41.  
  42.             float distance = Vector2.Distance(s.StartPos1, s.Touch1.Value.Position);
  43.             if (distance >= Constants.MAX_NOMOVE_DISTANCE)
  44.             {
  45.                 // Start MOVED
  46.                 // - začne posouvat plán -> určí nowDragging == true
  47.                 s.NowDragging = true;
  48.                 s.LastDraggingPoint = s.Touch1.Value.Position;
  49.                 camera.UnlockTarget = true;
  50.                 KineticStartMove(s); // V rámci tohoto zavolá také kineticScroll.TouchPressed
  51.             }
  52.         }
  53.         else if (s.Touch1.Value.State == TouchLocationState.Released)
  54.         {
  55.             if (s.TouchPressed.HasValue)
  56.                 if (s.TouchPressed.Value.Id == s.Touch1.Value.Id)
  57.                 {
  58.                     // PRESSED = finálně "kliknul"
  59.                     // - prst byl puštěn ještě v rámci limitu (plán se neposouvá) -> klikne na daný obchod
  60.                     // - nikam se plán neposunul, tady se kineticScroll volat nemusí
  61.                     Clicked(s.TouchPressed.Value, camera);
  62.                     camera.UnlockTarget = true;
  63.                     s.TouchPressed = null;
  64.                 }
  65.             s.Touch1 = null;
  66.         }
  67.     }
  68.  
  69.     if (s.NowDragging) // Zrušení nowDragging je řešeno v ParseTouches
  70.     {
  71.         // MOVED (posouvá s plánem, příp. ukončil posun)
  72.         // - posune plán o přírustek...
  73.         if (Vector2.Distance(s.Touch1.Value.Position, s.LastDraggingPoint) > 0f)
  74.         {
  75.             MoveTouch(s.Touch1.Value, s); // Posune s pohledem kamery (pokud myš popojela)
  76.             s.LastDraggingPoint = s.Touch1.Value.Position;
  77.         }
  78.         KineticMove(); // Příp. zaktualizuje kineticScroll (v každém případě, i s 0)
  79.  
  80.         if (s.Touch1.Value.State == TouchLocationState.Released)
  81.         {
  82.             // RELEASED (konec posunu)
  83.             // - ukončení tažení... "zvedne prst", zaktualizuje kineticScroll (.TouchReleased)
  84.             KineticEndMove(s);
  85.             s.NowDragging = false;
  86.             s.Touch1 = null;
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment