protected override void OnUpdate(ref UpdateParams p) { base.OnUpdate(ref p); MoveSpeed = 1.5f; float dx = 0f, dy = 0f; KeyboardState kb = Keyboard.GetState(); if (kb.IsKeyDown(Keys.Up) || kb.IsKeyDown(Keys.W)) { if (pressTime == 0f) { dy = -1.0f; } pressTime += p.Dt; } else if (kb.IsKeyDown(Keys.Down) || kb.IsKeyDown(Keys.S)) { MoveSpeed = 4.5f; if (pressTime == 0f) { dy = +1.0f; } pressTime += p.Dt; } else if (kb.IsKeyDown(Keys.Left) || kb.IsKeyDown(Keys.A)) { if (pressTime == 0f) { dx = -1.0f; } pressTime += p.Dt; } else if (kb.IsKeyDown(Keys.Right) || kb.IsKeyDown(Keys.D)) { if (pressTime == 0f) { dx = +1.0f; } pressTime += p.Dt; } else { pressTime = 0f; } // trigger Toy KeyboardState kbstate = Keyboard.GetState(); bool isTriggerKeyPressed = kbstate.IsKeyDown(Keys.Space) || kbstate.IsKeyDown(Keys.X) || kbstate.IsKeyDown(Keys.LeftControl); Toy t = ParentThing.ToyActive; if (!isTriggerPressed && isTriggerKeyPressed) { isTriggerPressed = true; // use toy if (t != null) { if (!t.IsUsed && t.UsesLeft > 0) { t.StartUsing(); } } } else if (!isTriggerKeyPressed) { isTriggerPressed = false; } // send trigger state to Toy if (t != null) { t.IsTriggered = isTriggerKeyPressed; } // key rep if (pressTime > 0.2f / KEY_REP_VELOCITY) { pressTime = 0f; } // make user's requested motion vector TargetMove = new Vector2(dx, dy); IsTargetMoveDefined = true; }
protected override void OnUpdate(ref UpdateParams p) { base.OnUpdate(ref p); // keep previous loop's control input Vector2 ctrl = Vector2.Zero; ctrlPrev = ctrlCur; KeyboardState kb = Keyboard.GetState(); GamePadState gp = GamePad.GetState(PlayerIndex.One); Vector2 sticks = Vector2.Zero; const float AST = 0.1f; // AST = Analog Stick Threshold if (gp.IsConnected) sticks = gp.ThumbSticks.Left + gp.ThumbSticks.Right; if (kb.IsKeyDown(Keys.Up) || kb.IsKeyDown(Keys.W) || gp.IsButtonDown(Buttons.DPadUp) || (sticks.Y > AST && sticks.Y >= sticks.X) ) ctrl.Y += -1.0f; if (kb.IsKeyDown(Keys.Down) || kb.IsKeyDown(Keys.S) || gp.IsButtonDown(Buttons.DPadDown) || (sticks.Y < -AST && sticks.Y <= sticks.X) ) ctrl.Y += 1.0f; if (kb.IsKeyDown(Keys.Left) || kb.IsKeyDown(Keys.A) || gp.IsButtonDown(Buttons.DPadLeft) || (sticks.X < -AST && sticks.X <= sticks.Y) ) ctrl.X += -1.0f; if (kb.IsKeyDown(Keys.Right) || kb.IsKeyDown(Keys.D) || gp.IsButtonDown(Buttons.DPadRight) || (sticks.X > AST && sticks.X >= sticks.Y) ) ctrl.X += 1.0f; // handle case where 2nd key pressed Left/Right or Up/Down if (IsDiag(ctrl) && ctrl.Y == ctrlPrevDifferent.Y ) ctrl.Y = 0f; if (IsDiag(ctrl) && ctrl.X == ctrlPrevDifferent.X) ctrl.X = 0f; // test for diagonal input! if (IsDiag(ctrl)) { ctrl -= ctrlPrevDifferent; // try to compensate - only new key mvt if (IsDiag(ctrl)) { // if still diagonal, use X dir only. ctrl.Y = 0f; } } // transfer found control input of user input persistent var ctrlCur = ctrl; if (ctrlCur != ctrlPrev) { ctrlPrevDifferent = ctrlPrev; // keep track of 'previous control that was different' } if (ctrl.X != 0f || ctrl.Y != 0f) { if (pressTime == 0f) TargetMove = ctrlCur; pressTime += p.Dt; // keep amount of time a direction input has been given } // reset key repeat counter if nothing given as input if (ctrl.LengthSquared() == 0f) { pressTime = 0f; } // trigger attack wasAttackPressed = isAttackPressed; // keep old but pres state isAttackPressed = kb.IsKeyDown(Keys.Space) || gp.IsButtonDown(Buttons.A) || kb.IsKeyDown(Keys.RightControl) || gp.IsButtonDown(Buttons.RightTrigger); if (isAttackPressed && !wasAttackPressed) { pixie.LeadAttack(); } // help msg if (kb.IsKeyDown(Keys.Q) || kb.IsKeyDown(Keys.F1) || kb.IsKeyDown(Keys.P) || kb.IsKeyDown(Keys.Enter) || gp.IsButtonDown(Buttons.Start) ) { ShowKeysHelp(); } // inventory msg if (kb.IsKeyDown(Keys.I) || gp.IsButtonDown(Buttons.B)) { Level.Current.hero.ShowInventory(); } // trigger Toy / magic item bool isTriggerKeyPressed = kb.IsKeyDown(Keys.X) || gp.IsButtonDown(Buttons.Y); Toy t = ParentThing.ToyActive; if (!isUseToyPressed && isTriggerKeyPressed) { isUseToyPressed = true; // use toy if (t != null && (!t.IsUsed && t.UsesLeft > 0)) { t.StartUsing(); if (t.IsUsed && t.UsesLeft <= 0) ParentThing.ToyActive = null; // remove toy from inventory once used up. } else { ShowNoToyString(); } } else if (!isTriggerKeyPressed) { isUseToyPressed = false; } // send trigger state to Toy if (t != null) { t.IsTriggered = isTriggerKeyPressed; } // key repetition if (pressTime > 0.2f / ParentThing.Velocity ) pressTime = 0f; // make user's requested motion vector if (TargetMove.LengthSquared() > 0f) IsTargetMoveDefined = true; }