Пример #1
0
        public void UpdateFromAgk()
        {
            FOV        = Agk.GetCameraFOV(1);
            Position.X = Agk.GetCameraX(1);
            Position.Y = Agk.GetCameraY(1);
            Position.Z = Agk.GetCameraZ(1);
            Rotation.X = Agk.GetCameraAngleX(1);
            Rotation.Y = Agk.GetCameraAngleY(1);
            Rotation.Z = Agk.GetCameraAngleZ(1);

            //TODO: reverse calc orbit/target values if bound

            //ProjectionMatrix = AGKMatrix4.Perspective(0.25f * (float)Math.PI, AspectRatio, 1.0f, 1000.0f);
            ProjectionMatrix = AGKMatrix4.Perspective(FOV, App.Config.Screen.AspectRatio, Near, Far);
        }
Пример #2
0
        public static void GetGameplayInput(object rArgs)
        {
            App.Log("controls3d", LogLevel.Notice, "main", "> Begin GetGameplayInput");

            //reset forced
            UserInterface.Status.MouseModeForced = "";
            UserInterface.Status.KeyModeForced   = "";

            //exit early if user does not have control

            /*
             * if(App.Status.LoadState < 3)
             * {
             *  return;
             * }
             */

            if (CharacterHandler3d.MyCharacter == null)
            {
                return;
            }

            if (!CharacterHandler3d.MyCharacter.Status.IsLiving)
            {
                return;
            }

            if (UserInterface.Status.KeyMode != "gameplay" || CharacterHandler3d.MyCharacter.Status.MotionState == CharacterEntity3d.MotionStates.Forced)
            {
                return;
            }

            if (ActiveCamera.ControlMode != Camera3d.CameraMode.Anchored)
            {
                return;
            }

            bool animWait = false;

            if (CharacterHandler3d.MyCharacter.AnimationQ.Count > 0)
            {
                animWait = CharacterHandler3d.MyCharacter.AnimationQ.First().Animation.Wait;
            }

            //grab old state
            CharacterHandler3d.MyCharacter.OldStatus = JsonConvert.DeserializeObject <CharacterEntity3d.CharacterStatus>(JsonConvert.SerializeObject(CharacterHandler3d.MyCharacter.Status));

            //reset states that need to be held by user
            if (CharacterHandler3d.MyCharacter.Status.StanceState == CharacterEntity3d.StanceStates.Sneaking)
            {
                CharacterHandler3d.MyCharacter.Status.StanceState = CharacterEntity3d.StanceStates.Basic;
            }

            if (CharacterHandler3d.MyCharacter.Status.ActionState == CharacterEntity3d.ActionStates.Moving)
            {
                CharacterHandler3d.MyCharacter.Status.ActionState = CharacterEntity3d.ActionStates.Idle;
            }

            if (CharacterHandler3d.MyCharacter.Status.MotionState != CharacterEntity3d.MotionStates.Forced)
            {
                CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Stationary;
            }

            CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;

            //get mouse input
            if (UserInterface.Status.MouseMode == "gameplay")
            {
            }

            //get keyboard input
            if (UserInterface.Status.KeyMode == "gameplay" && !animWait)
            {
                if (CharacterHandler3d.MyCharacter.Status.MotionState != CharacterEntity3d.MotionStates.Forced)
                {
                    //toggle strafelock
                    if (Hardware.IsKeyDown(MovementKey.StrafeToggle) && UserInterface.Status.InputReady)
                    {
                        UserInterface.Status.InputMark = App.Timing.Timer;
                        CharacterHandler3d.MyCharacter.Status.IsStrafeLocked = !CharacterHandler3d.MyCharacter.Status.IsStrafeLocked;
                    }

                    //toggle runlock
                    if (Hardware.IsKeyDown(MovementKey.RunToggle) && UserInterface.Status.InputReady)
                    {
                        UserInterface.Status.InputMark = App.Timing.Timer;
                        CharacterHandler3d.MyCharacter.Status.IsRunLocked = !CharacterHandler3d.MyCharacter.Status.IsRunLocked;
                    }

                    //apply run if locked
                    if (CharacterHandler3d.MyCharacter.Status.IsRunLocked &&
                        CharacterHandler3d.MyCharacter.OldStatus.StanceState == CharacterEntity3d.StanceStates.Basic
                        )
                    {
                        if (CharacterHandler3d.MyCharacter.OldStatus.ActionState == CharacterEntity3d.ActionStates.Moving &&
                            CharacterHandler3d.MyCharacter.OldStatus.MotionState < CharacterEntity3d.MotionStates.Sprinting
                            )
                        {
                            CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Running;
                        }
                    }

                    //sneak
                    if (Hardware.IsKeyDown(MovementKey.SpeedSlow))
                    {
                        CharacterHandler3d.MyCharacter.Status.StanceState = CharacterEntity3d.StanceStates.Sneaking;
                    }

                    //sprint
                    if (Hardware.IsKeyDown(MovementKey.SpeedBoost))
                    {
                        if (CharacterHandler3d.MyCharacter.Status.StanceState == CharacterEntity3d.StanceStates.Basic &&
                            CharacterHandler3d.MyCharacter.OldStatus.ActionState == CharacterEntity3d.ActionStates.Moving &&
                            CharacterHandler3d.MyCharacter.Status.MotionState != CharacterEntity3d.MotionStates.Forced
                            )
                        {
                            CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Sprinting;
                        }
                    }

                    //jump
                    if (Hardware.IsKeyDown(MovementKey.Upward) && UserInterface.Status.InputReady)
                    {
                        //don't allow a jump if sneaking or already in a jump
                        if (CharacterHandler3d.MyCharacter.Status.StanceState == CharacterEntity3d.StanceStates.Basic &&
                            CharacterHandler3d.MyCharacter.Status.ActionState < CharacterEntity3d.ActionStates.Jumping
                            )
                        {
                            UserInterface.Status.InputMark = App.Timing.Timer;
                            CharacterHandler3d.MyCharacter.Status.ActionState = CharacterEntity3d.ActionStates.Jumping;
                            CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Forced;
                        }
                    }

                    float camY = MathUtil.Wrap(Agk.GetCameraAngleY(1) + 180.0f, 0.0f, 360.0f);

                    //forward
                    if (Hardware.IsKeyDown(MovementKey.Forward))
                    {
                        CharacterHandler3d.MyCharacter.Status.ActionState = CharacterEntity3d.ActionStates.Moving;
                        if (CharacterHandler3d.MyCharacter.Status.MotionState == CharacterEntity3d.MotionStates.Stationary)
                        {
                            CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Walking;
                        }
                        CharacterHandler3d.MyCharacter.Properties.Facing  = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                        CharacterHandler3d.MyCharacter.Properties.Heading = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                    }

                    //backward
                    if (Hardware.IsKeyDown(MovementKey.Backward))
                    {
                        CharacterHandler3d.MyCharacter.Status.ActionState = CharacterEntity3d.ActionStates.Moving;
                        if (CharacterHandler3d.MyCharacter.Status.MotionState == CharacterEntity3d.MotionStates.Stationary)
                        {
                            CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Walking;
                        }
                        if (CharacterHandler3d.MyCharacter.Status.IsStrafeLocked)
                        {
                            CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                            CharacterHandler3d.MyCharacter.Properties.Heading    = camY;
                            CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Backward;
                        }
                        else
                        {
                            CharacterHandler3d.MyCharacter.Properties.Facing  = camY;
                            CharacterHandler3d.MyCharacter.Properties.Heading = camY;
                        }
                    }

                    //left
                    if (Hardware.IsKeyDown(MovementKey.Left))
                    {
                        CharacterHandler3d.MyCharacter.Status.ActionState = CharacterEntity3d.ActionStates.Moving;
                        if (CharacterHandler3d.MyCharacter.Status.MotionState == CharacterEntity3d.MotionStates.Stationary)
                        {
                            CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Walking;
                        }
                        if (CharacterHandler3d.MyCharacter.Status.IsStrafeLocked)
                        {
                            if (Hardware.IsKeyDown(MovementKey.Forward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 180.0f - 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                            else if (Hardware.IsKeyDown(MovementKey.Backward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Backward;
                            }
                            else
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 90.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Left;
                            }
                        }
                        else
                        {
                            if (Hardware.IsKeyDown(MovementKey.Forward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f - 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 180.0f - 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                            else if (Hardware.IsKeyDown(MovementKey.Backward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                            else
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 90.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 90.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                        }
                    }

                    //right
                    if (Hardware.IsKeyDown(MovementKey.Right))
                    {
                        CharacterHandler3d.MyCharacter.Status.ActionState = CharacterEntity3d.ActionStates.Moving;
                        if (CharacterHandler3d.MyCharacter.Status.MotionState == CharacterEntity3d.MotionStates.Stationary)
                        {
                            CharacterHandler3d.MyCharacter.Status.MotionState = CharacterEntity3d.MotionStates.Walking;
                        }
                        if (CharacterHandler3d.MyCharacter.Status.IsStrafeLocked)
                        {
                            if (Hardware.IsKeyDown(MovementKey.Forward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 180.0f + 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                            else if (Hardware.IsKeyDown(MovementKey.Backward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY - 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Backward;
                            }
                            else
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY - 90.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Right;
                            }
                        }
                        else
                        {
                            if (Hardware.IsKeyDown(MovementKey.Forward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY + 180.0f + 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY + 180.0f + 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                            else if (Hardware.IsKeyDown(MovementKey.Backward))
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY - 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY - 45.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                            else
                            {
                                CharacterHandler3d.MyCharacter.Properties.Facing     = MathUtil.Wrap(camY - 90.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Properties.Heading    = MathUtil.Wrap(camY - 90.0f, 0.0f, 360.0f);
                                CharacterHandler3d.MyCharacter.Status.DirectionState = CharacterEntity3d.DirectionStates.Standard;
                            }
                        }
                    }
                }
            }

            //mouse steers character if moving and not strafe locked
            if (UserInterface.Status.MouseMode == "gameplay")
            {
                if (CharacterHandler3d.MyCharacter.Status.ActionState == CharacterEntity3d.ActionStates.Moving &&
                    !CharacterHandler3d.MyCharacter.Status.IsStrafeLocked
                    )
                {
                    CharacterHandler3d.MyCharacter.Properties.Facing = MathUtil.CurveAngle(CharacterHandler3d.MyCharacter.Properties.Facing + Hardware.Mouse.MoveX, CharacterHandler3d.MyCharacter.Properties.Facing, ActiveCamera.Precision);
                }
            }

            //sprint camera effect
            if (CharacterHandler3d.MyCharacter.Status.MotionState == CharacterEntity3d.MotionStates.Sprinting)
            {
                ActiveCamera.FOV = MathUtil.CurveValue(65.0f, ActiveCamera.FOV, Agk.ScreenFPS() * CharacterHandler3d.Config.SprintAcceleration);
            }
            else if (ActiveCamera.FOV != Camera3dHandler.DefaultFOV)
            {
                ActiveCamera.FOV = MathUtil.CurveValue(Camera3dHandler.DefaultFOV, ActiveCamera.FOV, Agk.ScreenFPS() * CharacterHandler3d.Config.SprintAcceleration);
            }



            //TEMP:
            if (Hardware.IsKeyDown((int)Keys.Y))
            {
                Controls3d.ActiveCamera.Offset.Y += 0.1f;
            }
            if (Hardware.IsKeyDown((int)Keys.H))
            {
                Controls3d.ActiveCamera.Offset.Y -= 0.1f;
            }

            //TEMP: toggle active
            if (Hardware.IsKeyDown((int)Keys.C) && UserInterface.Status.InputReady)
            {
                UserInterface.Status.InputMark = App.Timing.Timer;
                Controls3d.SetActiveCamera(Camera3dHandler.CameraList.FirstOrDefault(c => c.Name != Controls3d.ActiveCamera.Name));
            }
            //ENDTEMP



            App.Log("Controls3d", LogLevel.Notice, "main", "> End GetGameplayInput");
        }