silverlight 碰撞检测

本文介绍了一种在WPF应用程序中实现精确碰撞检测的方法。该方法首先通过矩形碰撞检查进行初步筛选,然后利用像素级精度的碰撞测试进一步确认元素间的精确碰撞情况。
原内容
http://www.andybeaulieu.com/Default.aspx?tabid=67&EntryID=95
private   bool  CheckCollision(FrameworkElement control1, FrameworkElement controlElem1, FrameworkElement control2, FrameworkElement controlElem2)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
// first see if sprite rectangles collide
            Rect rect1 = UserControlBounds(control1);
            Rect rect2 
= UserControlBounds(control2);


            rect1.Intersect(rect2);
            
if (rect1 == Rect.Empty)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
// no collision - GET OUT!
                return false;
            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
bool bCollision = false;
                Point ptCheck 
= new Point();

                
// now we do a more accurate pixel hit test
                for (int x = Convert.ToInt32(rect1.X); x < Convert.ToInt32(rect1.X + rect1.Width); x++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
for (int y = Convert.ToInt32(rect1.Y); y < Convert.ToInt32(rect1.Y + rect1.Height); y++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        ptCheck.X 
= x;
                        ptCheck.Y 
= y;

                        List
<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control1) as List<UIElement>;
                        
if (hits.Contains(controlElem1))
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            
// we have a hit on the first control elem, now see if the second elem has a similar hit
                            List<UIElement> hits2 = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control2) as List<UIElement>;
                            
if (hits2.Contains(controlElem2))
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                bCollision 
= true;
                                
break;
                            }

                        }

                    }

                    
if (bCollision) break;
                }

                
return bCollision;
            }



        }





        
public  Rect UserControlBounds(FrameworkElement control)
ExpandedBlockStart.gifContractedBlock.gif        
{
            Point ptTopLeft 
= new Point(Convert.ToDouble(control.GetValue(Canvas.LeftProperty)), Convert.ToDouble(control.GetValue(Canvas.TopProperty)));
            Point ptBottomRight 
= new Point(Convert.ToDouble(control.GetValue(Canvas.LeftProperty)) + control.Width, Convert.ToDouble(control.GetValue(Canvas.TopProperty)) + control.Height);

            
return new Rect(ptTopLeft, ptBottomRight);
        }
判断control1中的controlElem1是否以碰到control2的controlElem2 demo:
获取 Microsoft Silverlight

转载于:https://www.cnblogs.com/_Chill/archive/2009/08/27/1555334.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值