Example #1
0
    protected void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        statusController.Update();
        A2d.Tick(sr, h, v);
    }
Example #2
0
    protected new void Awake()
    {
        base.Awake();
        sshadow  = GetComponent <SpriteShadowCreater>();
        collider = GetComponent <Collider2D>();
        SetShadow(false);
        //移动方法
        Func <float, bool> move = (addtion) =>
        {
            float h       = Input.GetAxisRaw("Horizontal");
            bool  someDir = true;
            if (h != 0)
            {
                transform.Translate(addtion * Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
                someDir = (h > 0 && lastDir > 0) || (h < 0 && lastDir < 0);
                //print(someDir);
                lastDir = h;
                return(!someDir);
            }
            ;
            return(false);
        };

        Action <int, float> translate = (int dir, float addtion) =>
        {
            transform.Translate(addtion * Vector3.right * dir * moveSpeed * Time.deltaTime, Space.World);
        };

        statusController = new StatusController();
        //站立
        Status Idle = new Status();

        Idle.onUpdate = () => {
            float h = Input.GetAxisRaw("Horizontal");

            if (Input.GetKeyDown(KeyCode.K))
            {
                statusController.Enter("Jump");
                return;
            }
            if (Input.GetKeyDown(KeyCode.L))
            {
                statusController.Enter("Dash");
                return;
            }
            if (h != 0)
            {
                statusController.Enter("Run");
                return;
            }
            A2d.Play(sr, "Idle");
        };
        //跑
        Status Run = new Status();

        Run.onUpdate = () => {
            if (Input.GetKeyDown(KeyCode.K))
            {
                statusController.Enter("Jump");
                return;
            }
            if (Input.GetKeyDown(KeyCode.L))
            {
                statusController.Enter("Dash");
                return;
            }
            float h = Input.GetAxisRaw("Horizontal");
            if (h != 0)
            {
                move.Invoke(ADDTION_RUN);
                A2d.Play(sr, "Run");
            }
            else
            {
                statusController.Enter("Idle");
            }
        };
        //跳跃
        Status Jump = new Status();

        Jump.SetAutoExit(0.24f, () =>
        {
            groundFilter.SetNormalAngle(minNormalAngle, maxNormalAngle);
            Collider2D[] contactPoints_g = new Collider2D[8];
            if (rigid2d.GetContacts(groundFilter, contactPoints_g) > 0)
            {
                rigid2d.gravityScale = 1;
                statusController.Enter("Idle");
                return;
            }

            statusController.Enter("Drop");
        });
        Jump.onUpdate = () =>
        {
            move.Invoke(ADDTION_RUN);

            if (Input.GetKey(KeyCode.K))
            {
                rigid2d.gravityScale = 0;
                rigid2d.velocity     = Vector2.zero;
                transform.Translate(Vector3.up * jumpForce * Time.deltaTime, Space.World);
                A2d.Play(sr, "Jump");
                return;
            }

            groundFilter.SetNormalAngle(minNormalAngle, maxNormalAngle);
            Collider2D[] contactPoints_g = new Collider2D[8];
            if (rigid2d.GetContacts(groundFilter, contactPoints_g) > 0)
            {
                rigid2d.gravityScale = 1;
                statusController.Enter("Idle");
                return;
            }

            statusController.Enter("Drop");
        };
        //下落
        Status Drop = new Status();

        Drop.onUpdate = () =>
        {
            move.Invoke(ADDTION_RUN);
            rigid2d.gravityScale = 1;

            groundFilter.SetNormalAngle(minNormalAngle, maxNormalAngle);
            Collider2D[] contactPoints_g = new Collider2D[8];
            if (rigid2d.GetContacts(groundFilter, contactPoints_g) > 0)
            {
                statusController.Enter("Idle");
                return;
            }
            A2d.Play(sr, "Drop");
        };
        //冲刺
        Status Dash = new Status();

        Dash.SetAutoExit(0.25f, () =>
        {
            statusController.Enter("Idle");
        });
        Dash.onExit = () =>
        {
            SetShadow(false);
        };
        Dash.onUpdate = () =>
        {
            SetShadow(true);
            var cdir = move.Invoke(ADDTION_NONE);
            translate(lastDir > 0 ? DIR_RIGHT : DIR_LEFT, ADDTION_DASH);
            if (cdir)
            {
                statusController.Enter("Idle");
                return;
            }
            if (Input.GetKey(KeyCode.K))
            {
                statusController.Enter("Jump");
                return;
            }
            if (Input.GetKeyDown(KeyCode.L))
            {
                statusController.Enter("Dash");
                return;
            }
            if (Input.GetKeyUp(KeyCode.L))
            {
                statusController.Enter("Idle");
                return;
            }
            A2d.Play(sr, "Dash");
            return;
        };

        statusController.Add("Drop", Drop);
        statusController.Add("Jump", Jump);
        statusController.Add("Idle", Idle);
        statusController.Add("Run", Run);
        statusController.Add("Dash", Dash);

        statusController.Enter("Idle");
    }