11.蛇类移动

11.游戏场景-蛇类移动


11.1 知识点

创建蛇移动方向枚举,蛇类中创建移动方向变量,记录当前蛇的移动方向。蛇类构造函数中初始化蛇的移动方向。创建一个蛇移动方法。蛇移动前,擦除蛇尾,也就是最后一个位置,否则有残影。然后根据蛇头位置和蛇移动方向变量,修改舌头位置。

#region Lesson7 蛇移动
/// <summary>
/// 蛇的移动方向
/// </summary>
enum E_MoveDir
{
    /// <summary>
    /// 上
    /// </summary>
    Up,
    /// <summary>
    /// 下
    /// </summary>
    Down,
    /// <summary>
    /// 左
    /// </summary>
    Left,
    /// <summary>
    /// 右
    /// </summary>
    Right,
}
#endregion

//蛇类 继承绘制接口
class Snake : IDraw
{
    //蛇的身体数组
    SnakeBody[] bodys;
        
    //当前蛇的长度
    int snakeBodysLength;
    
    //当前移动的方向
    E_MoveDir dir;
    
    //蛇类构造函数
    public Snake(int x, int y)
    {
        //粗暴的 申明200个空间 游戏中 基本不会出现蛇长度达到200个身体
        bodys = new SnakeBody[200];
        
        //声明蛇头
        bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
        
        //初始时只有蛇头 初始化为1
        snakeBodysLength = 1;
        
        //初始化默认移动的方向向右
        dir = E_MoveDir.Right;
    }
    
    //蛇类绘制方法
    public void Draw()
    {
        //遍历蛇身体数组 逐个绘制蛇身体
        for (int i = 0; i < snakeBodysLength; i++)
        {
            bodys[i].Draw();
        }
    }
    
    #region Lesson7 蛇的移动
    
    //蛇移动方法
    public void Move()
    {
        //蛇移动前 擦除蛇尾 也就是最后一个位置 否则有残影
        SnakeBody lastBody = bodys[snakeBodysLength - 1];
        Console.SetCursorPosition(lastBody.pos.x, lastBody.pos.y);
        Console.Write("  ");//擦屁股
        
        //蛇头移动
        switch (dir)
        {
            case E_MoveDir.Up:
                --bodys[0].pos.y;
                break;
            case E_MoveDir.Down:
                ++bodys[0].pos.y;
                break;
            case E_MoveDir.Left:
                bodys[0].pos.x -= 2;
                break;
            case E_MoveDir.Right:
                bodys[0].pos.x += 2;
                break;
        }
    }
    #endregion
}

游戏场景类实现游戏场景里的更新方法中调用蛇移动方法,蛇先移动再绘制。发现蛇移动的太快了。创建记录while循环次数的变量。可以理解为运行了多少帧。每当进入while循环10000次后,while循环次数的变量清0.让再进行一次绘制,实现游戏降速。

//游戏场景类 继承游戏帧更新接口
class GameScene : ISceneUpdate
{
    //地图类变量 管理所有墙壁
    Map map;
    
    //蛇类变量 管理蛇相关
    Snake snake;
    
    //while循环次数 判断当前while循环进了多少次
    int whileLoopTimes = 0;
    
    //游戏场景类构造函数
    public GameScene()
    {
        //初始化地图类变量
        map = new Map();
        
        //初始化一个蛇
        snake = new Snake(40, 10);
        
    }
    
    //实现游戏场景里的更新方法 在游戏类中的start方法中的while循环中调用
    public void Update()
    {
        //while循环运行的太快 每次进一次while 绘制一次的话 游戏速度太快 要降速
        //用while循环次数来判断 每当进入while循环10000次后 再进行一次绘制
        //可以理解为每10000帧更新一次
        if (whileLoopTimes % 10000 == 0)
        {
            //绘制地图类
            map.Draw();
            
            //蛇移动 先移动再绘制蛇
            snake.Move();
            
            //绘制蛇类
            snake.Draw();
            
            //实际update了 重写开始计数
            whileLoopTimes = 0;
        }
        
        //每进一次while循环加一
        ++whileLoopTimes;
        
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏