Exemplo n.º 1
0
        private void MoveUser(UserInfo obj, long deltaTime)
        {
            MovementStateInfo msi = obj.GetMovementStateInfo();

            if (null != obj.ControlledObject)
            {
                MovementStateInfo ctrlMsi = obj.ControlledObject.GetMovementStateInfo();
                ctrlMsi.IsMoving = msi.IsMoving;
                ctrlMsi.SetFaceDir(msi.GetFaceDir());
                ctrlMsi.SetMoveDir(msi.GetMoveDir());
            }
            if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep) || obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition))
            {
                return;
            }
            //玩家移动中忽略阻挡,由客户端与AI来规划路径。
            if (!obj.IsDead() && msi.IsMoving && !msi.IsSkillMoving && !msi.IsMoveMeetObstacle)
            {
                Vector3 pos      = msi.GetPosition3D();
                float   speed    = (float)obj.GetRealControlledObject().GetActualProperty().MoveSpeed *(float)obj.VelocityCoefficient;
                float   distance = (speed * (float)(int)deltaTime) / 1000.0f;

                //LogSystem.Debug("MovementSystem user:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance);

                float   x = 0, y = 0;
                Vector2 newPos = new Vector2();
                if (obj.GetAiStateInfo().CurState != (int)AiStateId.Invalid && msi.CalcDistancSquareToTarget() < distance * distance)
                {
                    x = msi.TargetPosition.X;
                    y = msi.TargetPosition.Z;
                    AdjustPosition(obj.SpatialSystem, ref x, ref y);
                    newPos = new Vector2(x, y);
                    msi.SetPosition2D(newPos);
                }
                else
                {
                    float cosV = (float)msi.MoveDirCosAngle;
                    float sinV = (float)msi.MoveDirSinAngle;
                    y = pos.Z + distance * cosV;
                    x = pos.X + distance * sinV;
                    AdjustPosition(obj.SpatialSystem, ref x, ref y);
                    newPos = new Vector2(x, y);
                    msi.SetPosition2D(newPos);
                }
                if (null != obj.ControlledObject)
                {
                    obj.ControlledObject.GetMovementStateInfo().SetPosition2D(newPos);
                }
            }
        }
Exemplo n.º 2
0
        internal void Update(bool move_enable)
        {
            UserInfo playerself = WorldSystem.Instance.GetPlayerSelf();

            if (playerself == null || playerself.IsDead())
            {
                return;
            }
            KeyHit kh = KeyHit.None;

            if (move_enable)
            {
                if (ArkCrossEngineSpatial.SpatialObjType.kNPC == playerself.GetRealControlledObject().SpaceObject.GetObjType())
                {
                    NpcInfo npcInfo = playerself.GetRealControlledObject().CastNpcInfo();
                    if (null != npcInfo)
                    {
                        if (!npcInfo.CanMove)
                        {
                            return;
                        }
                    }
                }
                if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.W)))
                {
                    kh |= KeyHit.Up;
                }
                if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.A)))
                {
                    kh |= KeyHit.Left;
                }
                if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.S)))
                {
                    kh |= KeyHit.Down;
                }
                if (GfxSystem.IsKeyPressed(GetKeyCode(KeyIndex.D)))
                {
                    kh |= KeyHit.Right;
                }
            }

            Motion m = kh == KeyHit.None ? Motion.Stop : Motion.Moving;

            MotionChanged = MotionStatus != m || last_key_hit_ != kh;

            if (MotionChanged)
            {
                //GfxSystem.GfxLog("MotionChanged:{0}!={1} || {2}!={3}", MotionStatus, m, last_key_hit_, kh);
            }

            last_key_hit_ = kh;
            MotionStatus  = m;
            MoveDir       = CalcMoveDir(kh);
            if (MoveDir < 0)
            {
                MotionStatus = Motion.Stop;
            }
            if (MotionChanged)
            {
                //GfxSystem.GfxLog("InputMoveDir:{0} Pos:{1}", MoveDir, playerself.GetMovementStateInfo().GetPosition3D().ToString());
            }
        }