美文网首页手把手教你Unity开发俄罗斯方块
第二十三节 实现左右移动方块

第二十三节 实现左右移动方块

作者: 安静的程序员 | 来源:发表于2019-06-25 08:42 被阅读0次
    01.监测按键

    因为键盘什么时候按下是不确定的,所以必须要实时监测是否按下了键盘,而Unity中的Update()方法就是实时调用的,所以凡是与按键有关的逻辑都应写在该方法中。
    现在,来添加一行代码,当按下键盘上的左方向键时,输出“按下左方向键”:

    if (Input.GetKeyDown(KeyCode.LeftArrow)) Debug.Log("按下左方向键");
    

    运行游戏后,按下左方向键,会输出“按下左方向键”。

    02.实现左移和右移

    添加一个方法MoveLeftBlock(),左移的原理就是图层的横坐标(列)向左移动一格:

    // 左移方块
    void MoveLeftBlock()
    {
        MyPoint newPoint = _blockLayer.Point;
        newPoint._list -= 1;
        _blockLayer.Point = newPoint;
        _screenMain.RefreshScreen();
    }
    

    右移的方法也一样:

    // 右移方块
    void MoveRightBlock()
    {
        MyPoint newPoint = _blockLayer.Point;
        newPoint._list += 1;
        _blockLayer.Point = newPoint;
        _screenMain.RefreshScreen();
    }
    

    然后在按键事件中调用左移和右移:

    void Update()
    {
        // 左移方块
        if (Input.GetKeyDown(KeyCode.LeftArrow)) MoveLeft-Block();
        // 右移方块
        if (Input.GetKeyDown(KeyCode.RightArrow)) MoveRightBlock();
    }
    

    运行游戏后,按下左右方向键后,方块会左右移动,但只能移动一次,因为GetKeyDown()只在你每次按下时有效。键盘监测有三个方法:GetKeyDown()——按键按下;GetKey()——按着不放;GetKeyUp()——按键松开。

    03.连续移动

    将GetKeyDown()改成GetKey()就可以实现连续移动,只是太快了,如果按照60帧每秒算的话,一秒钟可以移动60个格子,显然我不想要这种连续移动。
    我想要的连续移动是:按下左方向键后,立即向左移动一格,如果左方向键在一定时间内没有松开,就继续向左一格一格匀速移动。同时,左右方向键不能冲突,就是同时只能朝一个方向移动。
    实现方案非常简单,就是按下按键后,启动定时器,松开后不需要移动了,就关闭定时器。然后,在切换方向时,先关闭上一个方向的定时器。下面是代码:

    void Update()
    {
        // 按键 - 左方向键
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            // 立即向左移动一格
            MoveLeftBlock();
            // 取消右移
            CancelInvoke("MoveRightBlock");
            InvokeRepeating("MoveLeftBlock", 0.3f, 0.1f);
        }
        if (Input.GetKeyUp(KeyCode.LeftArrow))
        {
            CancelInvoke("MoveLeftBlock");
        }
    
        // 按键 - 右方向键
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            // 立即向右移动一格
            MoveRightBlock();
            // 取消左移
            CancelInvoke("MoveLeftBlock");
            InvokeRepeating("MoveRightBlock", 0.3f, 0.1f);
        }
        if (Input.GetKeyUp(KeyCode.RightArrow))
        {
            CancelInvoke("MoveRightBlock");
        }
    }
    

    目前,左右移动已经实现了,但是会移出边界,下一节,我们来解决左右移动的碰撞问题。

    代码链接:https://pan.baidu.com/s/1Di3FbmQLIpC29YchV9kiGg
    提取码:79in

    相关文章

      网友评论

        本文标题:第二十三节 实现左右移动方块

        本文链接:https://www.haomeiwen.com/subject/fbuzqctx.html