Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <summary>
- /// Dotkl se prstem/myší/prsty displeje...
- /// - naparsujeme logický smysl daných dotyků, pořešíme logiku posunu plánu, zoomování apod.
- /// - inspirováno HexaLines (když se dalo ještě otáčet a vkládat najednou)
- /// - slouží pro výběr obchodů kliknutím + pro drag & drop plánu
- /// - předáváme odkaz na kameru, aby se mohla provést unprojekce
- /// - pro dodatečné dojetí po puštění myši se používá objekt KineticScroll2D (ve world souřadnicích)
- /// </summary>
- public void HandleTouch(List<TouchLocation> tc, TargetCamera camera, GameTime gameTime)
- {
- this.camera = camera;
- var s = TouchHelper.Instance.ParseTouches(tc);
- if (s.Touch1 == null)
- return;
- // A zpracuje dotyky...
- if (s.NowZooming && s.Touch2 != null)
- {
- // TÁHNE 2 PRSTY = provést zoom (dvoudotykové ovládání... dvěma prsty se dá i posouvat okno)
- // - při startu zoomu (při nastavení nowZooming v LoadTouches) se rovnou nastaví lastZoomPoint1 a lastZoomPoint2,
- // pak tady posuzujeme o kolik se změnil ten posun (a pokud se změnil, tak zoomujeme)
- // - posun dvěma prsty je bez dojezdu kineticScroll!
- if (s.LastZoomPoint1 == s.Touch1.Value.Position && s.LastZoomPoint2 == s.Touch2.Value.Position)
- return;
- ZoomPlan(s); // Předá celý objekt s informacemi o stavu dotyků, aby se podle toho zazoomovalo
- s.LastZoomPoint1 = s.Touch1.Value.Position; // (zoom zároveň i posouvá, podle středu obou prstů)
- s.LastZoomPoint2 = s.Touch2.Value.Position;
- return;
- }
- if (!s.NowDragging)
- {
- // KLIKNUL (jedním prstem) / POSUNUL JEN TROŠKU (tj. zatím se plán neposunul)
- // - měří vzdálenost oproti zapamatované startPos1 (vždy při mouseDown se zapamatuje nová)
- // - když přesáhne limit (v těch souřadnicích obrazovky), přepne na posouvání plánu
- if (s.Touch1.Value.State == TouchLocationState.Pressed || s.Touch1.Value.State == TouchLocationState.Moved)
- {
- if (s.Touch1.Value.State == TouchLocationState.Pressed)
- s.TouchPressed = s.Touch1; // Ochrana - kliknutí se bere jen, když vzešlo od tohoto prstu (ne ze zoomu)
- float distance = Vector2.Distance(s.StartPos1, s.Touch1.Value.Position);
- if (distance >= Constants.MAX_NOMOVE_DISTANCE)
- {
- // Start MOVED
- // - začne posouvat plán -> určí nowDragging == true
- s.NowDragging = true;
- s.LastDraggingPoint = s.Touch1.Value.Position;
- camera.UnlockTarget = true;
- KineticStartMove(s); // V rámci tohoto zavolá také kineticScroll.TouchPressed
- }
- }
- else if (s.Touch1.Value.State == TouchLocationState.Released)
- {
- if (s.TouchPressed.HasValue)
- if (s.TouchPressed.Value.Id == s.Touch1.Value.Id)
- {
- // PRESSED = finálně "kliknul"
- // - prst byl puštěn ještě v rámci limitu (plán se neposouvá) -> klikne na daný obchod
- // - nikam se plán neposunul, tady se kineticScroll volat nemusí
- Clicked(s.TouchPressed.Value, camera);
- camera.UnlockTarget = true;
- s.TouchPressed = null;
- }
- s.Touch1 = null;
- }
- }
- if (s.NowDragging) // Zrušení nowDragging je řešeno v ParseTouches
- {
- // MOVED (posouvá s plánem, příp. ukončil posun)
- // - posune plán o přírustek...
- if (Vector2.Distance(s.Touch1.Value.Position, s.LastDraggingPoint) > 0f)
- {
- MoveTouch(s.Touch1.Value, s); // Posune s pohledem kamery (pokud myš popojela)
- s.LastDraggingPoint = s.Touch1.Value.Position;
- }
- KineticMove(); // Příp. zaktualizuje kineticScroll (v každém případě, i s 0)
- if (s.Touch1.Value.State == TouchLocationState.Released)
- {
- // RELEASED (konec posunu)
- // - ukončení tažení... "zvedne prst", zaktualizuje kineticScroll (.TouchReleased)
- KineticEndMove(s);
- s.NowDragging = false;
- s.Touch1 = null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment