public void Update(GameTime game_time) { mCurrentGameTime = game_time; // cache touches every update in case it's expensive to get mTouches = Microsoft.Xna.Framework.Input.Touch.TouchPanel.GetState(); // gather what is needed to update triggers first eContactChange count_change = UpdateTouchCount(); // update state machine last, possibly in new state mStateMachine.Update(count_change); }
private eContactChange State_SingleDrag() { // we can go quickly to multidrag but if in single drag deliberately, then no const double k_thresh_seconds = 0.1; if (mContactCount == eContactCount.Two) { double elapsed = mCurrentGameTime.TotalGameTime.TotalSeconds - mSingleDragStartTimeSec; eContactChange change = (elapsed > k_thresh_seconds) ? eContactChange.SingleDragToMultiDragTooSlow : eContactChange.SingleDragToMultiDrag; return(change); } return(eContactChange.NoChange); }
// state/transition helper functions private eContactChange UpdateTouchCount() { int num_touches = mTouches.Count(); eContactCount prev_contact_count = mContactCount; eContactChange count_change = eContactChange.NoChange; eContactCount new_count = num_touches == 5 ? eContactCount.Five : num_touches == 4 ? eContactCount.Four : num_touches > 2 ? eContactCount.Many : num_touches > 1 ? eContactCount.Two : num_touches > 0 ? eContactCount.One : eContactCount.Zero; if (prev_contact_count == eContactCount.Zero) { count_change = new_count == eContactCount.One ? eContactChange.ZeroToOne : new_count == eContactCount.Two ? eContactChange.ZeroToTwo : new_count == eContactCount.Many ? eContactChange.ZeroToMany : new_count == eContactCount.Four ? eContactChange.AnyToFour : new_count == eContactCount.Five ? eContactChange.AnyToFive : eContactChange.NoChange; } else if (prev_contact_count == eContactCount.One) { count_change = new_count == eContactCount.Zero ? eContactChange.OneToZero : new_count == eContactCount.Two ? eContactChange.OneToTwo : new_count == eContactCount.Many ? eContactChange.OneToMany : new_count == eContactCount.Four ? eContactChange.AnyToFour : new_count == eContactCount.Five ? eContactChange.AnyToFive : eContactChange.NoChange; } else if (prev_contact_count == eContactCount.Two) { count_change = new_count == eContactCount.Zero ? eContactChange.TwoToZero : new_count == eContactCount.One ? eContactChange.TwoToOne : new_count == eContactCount.Many ? eContactChange.TwoToMany : new_count == eContactCount.Four ? eContactChange.AnyToFour : new_count == eContactCount.Five ? eContactChange.AnyToFive : eContactChange.NoChange; } else if (prev_contact_count == eContactCount.Many) { count_change = new_count == eContactCount.Zero ? eContactChange.ManyToZero : new_count == eContactCount.One ? eContactChange.ManyToOne : new_count == eContactCount.Two ? eContactChange.ManyToTwo : new_count == eContactCount.Four ? eContactChange.AnyToFour : new_count == eContactCount.Five ? eContactChange.AnyToFive : eContactChange.NoChange; } else if (prev_contact_count == eContactCount.Four) { count_change = new_count == eContactCount.Four ? eContactChange.NoChange : new_count == eContactCount.Zero ? eContactChange.FourToZero : eContactChange.FourToAnyPositive; } else if (prev_contact_count == eContactCount.Five) { count_change = new_count == eContactCount.Five ? eContactChange.NoChange : new_count == eContactCount.Zero ? eContactChange.FiveToZero : eContactChange.FiveToAnyPositive; } else if (prev_contact_count == eContactCount.Unknown) { count_change = (new_count == eContactCount.Zero) ? eContactChange.NoInitialContacts : eContactChange.InitialContacts; } else { XUtils.Assert(false); } mContactCount = new_count; return(count_change); }