Exemple #1
0
        //******************************* GameLogic *******************************//
        #region GameLogic

        //初始化小人和2个Cube,并赋给2个cube详细的参数,因为在Cube类中这些参数是根据前一个cube的属性计算得出的,而这两个cube就是最初的两个,所以在这里直接初始化这些需要计算的参数
        public void LogicPersonCubeInitialize()
        {
            player.Position = new float[2] {
                100f, 300f
            };
            //初始化跳跃距离中心的高度
            player.dhight = 160;

            Cube0.Position = new float[2] {
                100f, 300f
            };
            Cube0.SideLength = 100f;//边长单位为float,以后优化的时候看能不能改为整数

            //下面的这一段,将来是跳跃成功后,应该自动改变的
            Cube1.RefreshDirection = 1;    //1表示生成的cube在上一cube右上角
            Cube1.RefreshDistance  = 200;
            Cube1.SideLength       = 100f; //
            Cube1.Position         = Cube1.ComputCubePositon(Cube1.RefreshDirection, Cube1.RefreshDistance, Cube0.Position);
            player.MoveDirection   = Cube1.RefreshDirection;

            //初始化第一个cube的范围。为了测试。
            Cube0.RefreshDirection = 1;
            Cube0.k          = 1;
            Cube0.b          = 92.265f;
            Cube0.SideLength = 100f;
            Cube0.MinX       = (float)(100 - Cube0.SideLength * Math.Cos(Math.PI / 6));
            Cube0.MidX       = Cube0.Position[0];
            Cube0.MaxX       = (float)(100 + Cube0.SideLength * Math.Cos(Math.PI / 6));

            NowCube  = Cube0;
            NextCube = Cube1;

            //用于移动背景
            UpdataBackgroundLastPosition();//用于canmera
        }
Exemple #2
0
        //游戏逻辑
        public void RunLogic()
        {
            switch (nStateIndex)
            {
            case -1:    //小人下落状态,只在游戏开始时运行一次,但是需要运行好几帧,此后循环只从nStateIndex=0开始
            {
                drawStateIndex = -11;
                //当最后一帧运行动画时,进入if,因此在倒数第二针帧的动画结束时,RunDrawStateNegative11EndFlag赋值true,以至于最后一帧时进入此判断
                if (RunDrawStateNegative11EndFlag)
                {
                    RunDrawStateNegative11EndFlag = false;
                    nStateIndex = 0;
                }
                break;
            }

            case 0:    //空闲状态,等待按压
            {
                textBlockbb.Text    = "State 0 " + $"第{CountOfLevel}个方块" + " counts= " + CountOfAnimationFrame.ToString();
                ScoreNumber.Content = CountOfLevel.ToString();

                //计算安全区,计算新的nowcube和nextcube表面的四条函数方程
                NowCube.ComputeParameterOfSafeZone();
                NextCube.ComputeParameterOfSafeZone();
                player.MoveDirection = NextCube.RefreshDirection;
                drawStateIndex       = 10;
                break;
            }

            case 1:    //蓄力状态
            {
                textBlockbb.Text = "State 1";
                drawStateIndex   = 11;
                break;
            }

            case 2:    //判断状态
            {
                textBlockbb.Text = "State 2";

                //根据按键时间换算移动距离
                player.distanceOfMove = player.PressTimeToDistance(dPressTime);

                //计算出小人跳跃后落点的坐标。
                player.FallOffPosition = player.ComputeFallOutPositon(player.distanceOfMove, player.Position, NextCube.Position, NextCube.RefreshDirection);

                //计算小人跳跃函数的参数
                player.parameterXYofJump(player.Position, NextCube.Position);

                int isSafeFlag = player.JudgeSafeSatate(player.FallOffPosition, NowCube, NextCube);
                nStateIndex    = isSafeFlag;
                drawStateIndex = 12;
                break;
            }

            case 30:    //跳在原Cube的情况
            {
                textBlockbb.Text = "State 30";
                drawStateIndex   = 130;

                //只有当动画结束才执行的操作
                if (RunDrawState130EndFlag)
                {
                    //当RunDrawState130EndFlag=true进入此后,立刻置false,不然动画只能执行一次。
                    RunDrawState130EndFlag = false;

                    //当动画结束后,更新person现在的坐标,因为person跳跃的动画需要用到起跳的位置,所以只能在跳跃完成后更新person现在的坐标
                    player.Position = player.FallOffPosition;
                    //当动画结束后,进入0状态等待命令
                    nStateIndex    = 0;
                    drawStateIndex = 10;
                }
                break;
            }

            case 31:    //失败,跳在两个Cube之间的情况
            {
                textBlockbb.Text = "State 31 失败,跳在两个Cube之间的情况";
                drawStateIndex   = 131;

                //只有当动画结束才执行的操作
                if (RunDrawState131EndFlag)
                {
                    //当RunDrawState130EndFlag=true进入此后,立刻置false,不然动画只能执行一次。
                    RunDrawState131EndFlag = false;

                    bGameOver = true;
                }

                break;
            }

            case 32:    //成功跳到下一Cube的情况
            {
                textBlockbb.Text       = "State 32";
                drawStateIndex         = 132;
                CountOfAnimationFrame += 1;        //第几个播放动画的帧数

                if (RunDrawState132EndFlag)
                {
                    //当RunDrawState130EndFlag=true进入此后,立刻置false,不然动画只能执行一次。
                    RunDrawState132EndFlag = false;

                    //当动画结束后,更新person现在的坐标,因为person跳跃的动画需要用到起跳的位置,所以只能在跳跃完成后更新person现在的坐标
                    player.Position = player.FallOffPosition;

                    //跳跃成功,之前的nextcube要就是现在的nowcube,所以要赋值一次,之前的nextcube重新初始化,当成下一个cube
                    NowCube = NextCube;

                    NextCube = new Cube();
                    NextCube.RefreshDistance = 200;        //这个距离应该是随机出现的,现在暂时固定
                    NextCube.SideLength      = 100;

                    Random rng = new Random();
                    int    s   = rng.Next(2);
                    if (s == 0)
                    {
                        NextCube.RefreshDirection = -1;
                    }
                    else
                    {
                        NextCube.RefreshDirection = 1;         //这个方向应该是在-1和1中随机出现的,现在暂时固定
                    }
                    //计算新出现的cube的位置
                    NextCube.Position = NextCube.ComputCubePositon(NextCube.RefreshDirection, NextCube.RefreshDistance, NowCube.Position);

                    //当动画结束后,进入0状态等待命令,重新开始新的游戏循环
                    nStateIndex    = 0;
                    drawStateIndex = 1320;
                    cubeFallIndex  = 1;



                    //跳到了第几个方块
                    CountOfLevel++;
                }
                break;
            }

            case 33:    //失败,跳过了下一个Cube的情况
            {
                textBlockbb.Text = "State 33 失败,跳过了下一个Cube的情况";
                drawStateIndex   = 133;
                if (RunDrawState133EndFlag)
                {
                    //当RunDrawState130EndFlag=true进入此后,立刻置false,不然动画只能执行一次。
                    RunDrawState133EndFlag = false;
                    bGameOver = true;
                }
                break;
            }
            }
        }