protected override void ApplyRotation(float delta, Physics2DDirectBodyState state) { if (Vel.Length() > 0f || RotateBy != 0) { Transform2D xform = state.Transform.Rotated(MathU.LerpAngle(state.Transform.Rotation, RotateBy == 0 ? LinearVelocity.Angle() + Mathf.Deg2Rad(90) : RotateBy, Type.RotationSpeed * delta * (Speed / Type.MaxSpeed) + Mathf.Abs(RotateBy / Mathf.Tau)) - state.Transform.Rotation); state.Transform = xform; } }
private void HandlerControl(float seconds) { if (!isDead && openControl) { float maxSpeed = SpaceWarConfig.SpeedMax; float accel = SpaceWarConfig.SpeedAccel; if (stillTimer < 0) { // 硬直状态 // maxSpeed *= cStillSpeedScale; accel *= SpaceWarConfig.StillSpeedScale; } #region 获取键盘输入 bool Up = InputHandler.IsKeyDown(Keys.W); bool Left = InputHandler.IsKeyDown(Keys.A); bool Down = InputHandler.IsKeyDown(Keys.S); bool Right = InputHandler.IsKeyDown(Keys.D); Vector2 deltaSpeed = new Vector2(); bool noInput = false; // 左上 if (Up && Left && !Right && !Down) { deltaSpeed.X = -cRootTwoDivideTwo; deltaSpeed.Y = -cRootTwoDivideTwo; } // 右上 else if (Up && Right && !Left && !Down) { deltaSpeed.X = cRootTwoDivideTwo; deltaSpeed.Y = -cRootTwoDivideTwo; } // 右下 else if (Down && Right && !Up && !Left) { deltaSpeed.X = cRootTwoDivideTwo; deltaSpeed.Y = cRootTwoDivideTwo; } // 左下 else if (Down && Left && !Up && !Right) { deltaSpeed.X = -cRootTwoDivideTwo; deltaSpeed.Y = cRootTwoDivideTwo; } // 上 else if (Up && !Down) { deltaSpeed.X = 0; deltaSpeed.Y = -1.0f; } // 下 else if (Down && !Up) { deltaSpeed.X = 0; deltaSpeed.Y = 1.0f; } // 左 else if (Left && !Right) { deltaSpeed.X = -1.0f; deltaSpeed.Y = 0; } // 右 else if (Right && !Left) { deltaSpeed.X = 1.0f; deltaSpeed.Y = 0; } else { noInput = true; } #endregion #region 获得鼠标状态 if (InputHandler.LastMouseLeftDown) { Vector2 mousePos = InputHandler.GetCurMousePosInLogic(BaseGame.RenderEngine); float shootAzi = MathTools.AziFromRefPos(mousePos - this.Pos); this.Shoot(shootAzi); } #endregion if (!noInput) { phisicalUpdater.Azi = MathTools.AziFromRefPos(Vel); deltaSpeed *= seconds * accel; Vel += deltaSpeed; float SpeedAbs = Vel.Length(); if (SpeedAbs > maxSpeed) { Vel *= maxSpeed / SpeedAbs; } } else // 衰减 { // 假设时间间隔是均匀的,并且间隔很小。 if (SpaceWarConfig.SpeedDecay * seconds < 1) { Vel *= (1 - SpaceWarConfig.SpeedDecay * seconds); } } phisicalUpdater.Vel = Vel; } }