//******************************* 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 }
//游戏逻辑 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; } } }