.NET Windows Desktop Runtime:企业级桌面应用部署架构深度解析
2026/6/5 20:33:59
飞翔的小鸟游戏看似简单,但背后涉及精确的物理引擎、随机管道生成和碰撞检测等技术。本文将详细介绍重力系统实现、跳跃控制、管道生成算法、AABB碰撞检测以及分数统计系统。
staticconstdouble gravity=0.5;staticconstdouble jumpStrength=-8;double birdVelocity=0;double birdY=300;gravity为重力加速度,每次更新增加垂直速度。jumpStrength为跳跃力度,负值表示向上。birdY记录鸟的垂直位置。
voidupdateGame(){birdVelocity+=gravity;birdY+=birdVelocity;// 地面和天花板检测if(birdY<=0||birdY>=600-birdSize){endGame();}}每帧更新速度和位置。速度受重力影响不断增加,位置随速度变化。检测是否碰到地面或天花板。
voidjump(){if(!gameOver){birdVelocity=jumpStrength;}}将速度设置为跳跃力度,实现向上的瞬时速度。游戏结束后不能跳跃。
classPipe{double x;double gapY;staticconstdouble width=60;staticconstdouble gapSize=150;Pipe({requiredthis.x,requiredthis.gapY});}每个管道记录X位置和间隙Y位置。间隙大小固定为150像素,确保游戏的可玩性。
voidspawnPipe(){finalrandom=Random();finalgapY=100+random.nextDouble()*400;pipes.add(Pipe(x:400,gapY:gapY));}间隙Y位置在100到500之间随机,使用Random().nextDouble()生成0-1的随机数。
for(int i=0;i<pipes.length;i++){pipes[i].x-=3;if(pipes[i].x<-Pipe.width){pipes.removeAt(i);i--;score++;}}所有管道向左移动3像素每帧。移出屏幕的管道被删除并增加分数。
if(pipes.isEmpty||pipes.last.x<250){spawnPipe();}当管道列表为空或最后一个管道移动到一定位置时,生成新管道。
boolcheckCollision(Pipepipe){// 上管道if(birdX+birdSize>pipe.x&&birdX<pipe.x+Pipe.width&&birdY<pipe.gapY){returntrue;}// 下管道if(birdX+birdSize>pipe.x&&birdX<pipe.x+Pipe.width&&birdY+birdSize>pipe.gapY+Pipe.gapSize){returntrue;}returnfalse;}使用轴对齐包围盒算法检测碰撞。检查鸟的矩形区域是否与管道矩形区域重叠。
for(varpipeinpipes){if(checkCollision(pipe)){endGame();return;}}遍历所有管道,任何一个发生碰撞则结束游戏。
finalbirdPaint=Paint()..color=Colors.yellow..style=PaintingStyle.fill;canvas.drawCircle(Offset(birdX,birdY),birdSize/2,birdPaint);黄色圆形表示鸟,简单但有效。
finalpipePaint=Paint()..color=Colors.green..style=PaintingStyle.fill;// 上管道canvas.drawRect(Rect.fromLTWH(pipe.x,0,Pipe.width,pipe.gapY),pipePaint);// 下管道canvas.drawRect(Rect.fromLTWH(pipe.x,pipe.gapY+Pipe.gapSize,Pipe.width,600-pipe.gapY-Pipe.gapSize),pipePaint);绿色矩形表示管道,上下两个矩形之间是可以通过的间隙。
gameTimer=Timer.periodic(constDuration(milliseconds:16),(timer){if(!gameOver){updateGame();}});每16毫秒更新一次,约60帧每秒,提供流畅的游戏体验。
voidendGame(){gameOver=true;gameTimer?.cancel();setState((){});}设置游戏结束状态,停止定时器,更新UI显示。
GestureDetector(onTap:(){jump();},child:CustomPaint(...),)点击屏幕任何位置都可以跳跃。
void_handleKeyPress(KeyEventevent){if(eventisKeyDownEvent){if(event.logicalKey==LogicalKeyboardKey.space){jump();}}}空格键也可以跳跃,支持桌面平台。
int score=0;每通过一个管道加1分。
Text('得分:$score',style:constTextStyle(fontSize:32,fontWeight:FontWeight.bold),)大字体显示分数,让玩家清晰看到成绩。
本文详细介绍了飞翔的小鸟游戏的物理引擎和管道生成系统。从重力模拟到管道生成,从碰撞检测到分数统计,每个技术点都直接影响游戏的手感和可玩性。通过这些技术的综合应用,实现了既简单又具有挑战性的飞翔的小鸟游戏体验。