欢迎来到天天文库
浏览记录
ID:34177679
大小:130.50 KB
页数:6页
时间:2019-03-04
《《线性碰撞》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
8.1线性碰撞本章我们将讨论如何判断物体是否碰撞,当它们碰撞时如何处理。我们会讨论一根轴上的碰撞、多根轴上的碰撞和与斜面的碰撞,我们还会讨论如何使用内建的FindElementInHostCoordinates()方法实现逐像素碰撞检测。碰撞检测基础碰撞检测最简单的方法是使用包围球或包围盒。为什么是球?因为大部分物体都能很好地适合球形,球也很容易进行碰撞检测,开销也不大,图8-1显示包围球中的飞船。如果我们要判断图8-1中的飞船是否和图8-2中的太阳碰撞,只需简单地判断两个物体间的距离,如果这个距离小于两个包围球半径之和,则发生碰撞,如图8-3所示。图8-1包围球中的宇宙飞船图8-2包围球中的太阳6/6 图8-3如果两个物体的距离小于两个包围球半径之和,则发生碰撞理论上听起来很简单,下面看一下代码。线性碰撞线性碰撞发生在一根轴上,下面我们将实现一个x轴上的碰撞。1.打开LinearCollisions项目,项目中已经创建了一个小球,可见Ball.xmal文件。用户控件Ball的默认大小为50×50。LayoutRoot元素设置为1×1,BallShape为50×50,偏移量为–25,–25。2.每个球都拥有公有变量:质量和速度。首先声明一个包含所有球对象的集合,两个球对象和一个随机数发生器。这个代码位于MainPage()构造函数之前:privateListallBalls;privateBallBall1=newBall();privateBallBall2=newBall();privateRandomRand=newRandom();3.在构造函数中,InitializeComponent()方法之后,初始化集合:allBalls=newList();4.然后添加两个球对象,并生成球的随机x方向的速度,因为处理的一维碰撞,所以无需设置y方向的速度:Ball1.Velocity.X=Rand.Next(1,16)-8;6/6 1.现在定义小球,首先定义BallShape的长和宽,然后根据宽度设置质量,最后两行代码调整BallShape相对于LayoutRoot的位置,只是简单地将BallShape中心放置到LayoutRoot的中心。Ball1.BallShape.Width=Ball1.BallShape.Height=75;Ball1.Mass=Ball1.BallShape.Width/50;Canvas.SetLeft(Ball1.BallShape,-Ball1.BallShape.Width/2);Canvas.SetTop(Ball1.BallShape,-Ball1.BallShape.Height/2);Canvas.SetLeft(Ball1,(Ball1.BallShape.Width-Ball1.Width)/2);Canvas.SetTop(Ball1,275);2.然后,小球放置到maincanvas上,小球放置在canvas的左方并添加到集合中。Canvas.SetLeft(Ball1,(Ball1.BallShape.Width-Ball1.Width)/2);Canvas.SetTop(Ball1,275);LayoutRoot.Children.Add(Ball1);allBalls.Add(Ball1);3.添加第二个小球,这个小球小一点,为25个像素,放置在右边:Ball2.Velocity.X=Rand.Next(1,16)-8;Ball2.BallShape.Width=Ball2.BallShape.Height=25;Ball2.Mass=Ball2.BallShape.Width/50;Canvas.SetLeft(Ball2.BallShape,-Ball2.BallShape.Width/2);Canvas.SetTop(Ball2.BallShape,-Ball2.BallShape.Height/2);Canvas.SetLeft(Ball2,LayoutRoot.Width-Ball2.BallShape.Width+(Ball2.BallShape.Width-Ball2.Width)/2);Canvas.SetTop(Ball2,275);LayoutRoot.Children.Add(Ball2);allBalls.Add(Ball2);4.好了,创建完两个小球,现在为Movestoryboard的Completed事件创建一个事件句柄,然后开始storyboard:Move.Completed+=newEventHandler(Move_Completed);Move.Begin();5.添加事件处理函数:privatevoidMove_Completed(objectsender,EventArgse){}6.在函数中添加一个循环体遍历集合中的每个小球:for(inti=0;iLayoutRoot.Width-(currentBall.Width+(currentBall.BallShape.Width-currentBall.Width)/2)&&!hasNegativeVelocity){currentBall.Velocity.X*=-1;}4.下面我们需要处理小球间的碰撞,首先创建CheckCollision()方法,这个方法以两个球为参数。privatevoidCheckCollision(BallfirstBall,BallsecondBall){}5.在这个方法开头,添加以上三行代码。前两行代码计算两个物体中心间的距离,第三行代码计算是否发生碰撞的距离:doubleDX=Canvas.GetLeft(secondBall)-Canvas.GetLeft(firstBall);doubleDistance=Math.Sqrt(DX*DX);doubleCollisionDistance=firstBall.BallShape.Width/2+secondBall.BallShape.Width/2;6.三行代码之后,检测是否发生碰撞。如果两个物体的距离小于碰撞距离则发生碰撞,然后在if判断中处理碰撞反应。if(DistanceLayoutRoot.Width-(currentBall.Width+(currentBall.BallShape.Width-currentBall.Width)/2)&&!hasNegativeVelocity)因为我们使用了一个集合保存小球对象,因此再添加一个小球并不难,你可以在屏幕中央添加一个半径为40的小球作为练习。6/6
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处