namespace silverlight圆球滚动 { public class Move_Ball { private double Max_Width; //边界宽度 private double Max_Height; //边界高度 private double Face_X; //当前X坐标 private double Face_Y; //当前Y坐标 private double EP_Width; //控件宽度 private double EP_Height; //控件高度 /// <summary> /// 获取或设置边界宽度 /// </summary> public double max_width { get { return Max_Width; } set { Max_Width = value; } } /// <summary> /// 获取或设置边界高度 /// </summary> public double max_height { get { return Max_Height; } set { Max_Height = value; } } /// <summary> /// 获取或设置当前X坐标 /// </summary> public double face_x { get { return Face_X; } set { Face_X = value; } } /// <summary> /// 获取或设置当前Y坐标 /// </summary> public double face_y { get { return Face_Y; } set { Face_Y = value; } } /// <summary> /// 设置控件左右大小 /// </summary> public double ep_width { get { return EP_Width; } set { EP_Width = value; } } /// <summary> /// 设置控件上下大小 /// </summary> public double ep_height { get { return EP_Height; } set { EP_Height = value; } } private bool m_fx_x = true; //x方向 private bool m_fx_y = true; //y方向 /// <summary> /// 获取或设置X轴方向 /// </summary> public bool M_fx_x { get { return m_fx_x; } set { m_fx_x = value; } } /// <summary> /// 获取或设置Y轴方向 /// </summary> /// public bool M_fx_y { get { return m_fx_y; } set { m_fx_y = value; } } private int m_speed_x; //x方向速度 private int m_speed_y; //y方向速度 /// <summary> /// X方向速度 /// </summary> public int sp_x { get { return m_speed_x; } set { m_speed_x = value; } } /// <summary> /// Y方向速度 /// </summary> public int sp_y { get { return m_speed_y; } set { m_speed_y = value; } } public void Start() { if (m_fx_y == true) { Face_Y = Face_Y + m_speed_y; // Y轴运动 } else { Face_Y = Face_Y - m_speed_y; } if (m_fx_x == true) { Face_X = Face_X + m_speed_x; } else { Face_X = Face_X - m_speed_x; } if (face_y <= 0 || face_y+EP_Height >= max_height) //Y轴改变方向 { m_fx_y = !m_fx_y; } if (face_x <= 0 || face_x+EP_Width>= max_width) //X轴改变方向 { m_fx_x = !m_fx_x; } } } }
这个是单独写的小球在碰壁时的反弹效果,已经成功实现,但是现在多个小球碰撞后各自反弹的效果无法实现,求大家帮下忙啊
1.定义一个函数,比如PositionChanged(object,postionArgs),在这个函数里判断有没有小球与当前小球位置重叠,这个就要考验你的数学分析水平了。然后根据碰撞的速度和方向决定反弹的速度和方向,以及是否需要速度衰减,仍然属于数学问题。
2.改变start函数,里面的位置变化不能是这么简单,必须是一个有斜率的直线方程,因为小球碰撞后方向是不确定的。
3.在改变后的start函数里,任何位置改变后,都需要调用一次PositionChanged函数。
4.你这个start函数貌似只运行一次就结束了,如果你是一个持续的动画,需要写一个条件循环,反复执行start.
有两种做法,一种是利用三角函数,还有一种是利用向量,我有一个老外的向量的解决方案,希望能帮到你。不过这个对数学要求较高http://www.adambrookesprojects.co.uk/project/canvas-collision-elastic-collision-tutorial/