首页 新闻 会员 周边

Silverlight使多个ellipse产生碰撞的效果,该怎么弄?

0
悬赏园豆:80 [待解决问题]
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;

            }
        }

    }
}


这个是单独写的小球在碰壁时的反弹效果,已经成功实现,但是现在多个小球碰撞后各自反弹的效果无法实现,求大家帮下忙啊

找自己丶的主页 找自己丶 | 初学一级 | 园豆:28
提问于:2013-10-09 20:01
< >
分享
所有回答(2)
0

1.定义一个函数,比如PositionChanged(object,postionArgs),在这个函数里判断有没有小球与当前小球位置重叠,这个就要考验你的数学分析水平了。然后根据碰撞的速度和方向决定反弹的速度和方向,以及是否需要速度衰减,仍然属于数学问题。

2.改变start函数,里面的位置变化不能是这么简单,必须是一个有斜率的直线方程,因为小球碰撞后方向是不确定的。

3.在改变后的start函数里,任何位置改变后,都需要调用一次PositionChanged函数。

空明流光 | 园豆:106 (初学一级) | 2013-10-10 09:29

4.你这个start函数貌似只运行一次就结束了,如果你是一个持续的动画,需要写一个条件循环,反复执行start.

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-10-10 09:32
0

有两种做法,一种是利用三角函数,还有一种是利用向量,我有一个老外的向量的解决方案,希望能帮到你。不过这个对数学要求较高http://www.adambrookesprojects.co.uk/project/canvas-collision-elastic-collision-tutorial/

逆时针の风 | 园豆:209 (菜鸟二级) | 2013-10-11 19:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册