最近想用WPF做个空战游戏,其中就要解决子弹是否击中飞机的问题。这里面飞机用了PNG图片,大家都知道飞机是不规则图案,如何判断子弹碰撞成了一个难题。

好在我在网上找到了一个可以获取bitmap像素点颜色的方法。获取图像的ARGB 其中A就是透明度 当A等于0的时候就是透明

剩下的问题就是如何把ImageSource转成bitmap以及如何计算Image控件中的点对应的像素点坐标问题了。

废话不多说 直接上代码好了 相信大家是能看懂的。

  /// <summary>
/// 获取Image控件上点对应图像的点是否是透明的
/// </summary>
/// <param name="p">相对Image控件的点</param>
/// <param name="Image_Main">Image控件</param>
/// <returns>是否透明</returns>
public static Boolean IsPointTransparent(System.Windows.Point p, System.Windows.Controls.Image Image_Main)
{
if (Image_Main.Source == null) {
return true;
}
BitmapSource m = (BitmapSource)Image_Main.Source;
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(m.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb))
{ System.Drawing.Imaging.BitmapData data = bmp.LockBits(
new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
m.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); bmp.UnlockBits(data);
int x = -;
int y = -;
double dx = ;
double dy = ;
System.Drawing.Point ImagePoint = new System.Drawing.Point(x, y); #region 获取实际图像点 switch (Image_Main.Stretch)
{
case Stretch.Fill:
dx = bmp.Width / Image_Main.ActualWidth;
dy = bmp.Height / Image_Main.ActualHeight;
x = int.Parse((p.X * dx).ToString("F0"));
y = int.Parse((p.Y * dy).ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
case Stretch.None:
x = int.Parse(p.X.ToString("F0"));
y = int.Parse(p.Y.ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
case Stretch.Uniform:
if (Image_Main.ActualWidth > Image_Main.ActualHeight)
{
dx = bmp.Width / Image_Main.ActualWidth;
dy = (bmp.Height / bmp.Width) * dx;
}
else
{
dy = bmp.Height / Image_Main.ActualHeight;
dx = (bmp.Width / bmp.Height) * dy;
}
x = int.Parse((p.X * dx).ToString("F0"));
y = int.Parse((p.Y * dy).ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
case Stretch.UniformToFill:
if (Image_Main.ActualWidth > Image_Main.ActualHeight)
{
dx = bmp.Width / Image_Main.ActualWidth;
dy = dx;
}
else
{
dx = bmp.Height / Image_Main.ActualHeight;
dy = dx;
}
x = int.Parse((p.X * dx).ToString("F0"));
y = int.Parse((p.Y * dy).ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
default: break;
} #endregion if (p.X < || p.Y < )
{
return true;
}
else
{
byte A = GetARGB(bmp, ImagePoint.X, ImagePoint.Y);
if ((int)A == )
{
return true;
}
else
{
return false;
}
}
}
} /// <summary>
/// 获取图像对应点的透明度
/// </summary>
/// <param name="bmp">图像</param>
/// <param name="x">x坐标</param>
/// <param name="y">y坐标</param>
/// <returns>透明度</returns>
private static byte GetARGB(Bitmap bmp, int x, int y)
{
System.Drawing.Color pixelColor = bmp.GetPixel(x, y);
//像素点颜色的 Alpha 值
byte alpha = pixelColor.A;
//颜色的 RED 分量值
byte red = pixelColor.R;
//颜色的 GREEN 分量值
byte green = pixelColor.G;
//颜色的 BLUE 分量值
byte blue = pixelColor.B;
return alpha;
}

看看 其实很简单把

主要是网上大部分都是模糊碰撞 思路基本都是大概框一下 然后算交集

这个方法适合判断点碰撞 如果是面碰撞应该也可以 就是需要继续加算法了

如果喜欢本文请留下你的脚印哦

本文版权归本作者所有 未经允许禁止用于商业目的 转载请注明出处!

WPF如何判断PNG中的点是透明的的更多相关文章

  1. WPF老矣,尚能饭否——且说说WPF今生未来(中):策略

    本文接上文<WPF老矣,尚能饭否——且说说WPF今生未来(上):担心>继续. “上篇”中部分精彩的点评: 虽然WPF不再更新了,但是基于WPF的技术还是在发展着,就比如现在的WinRT,只 ...

  2. jQuery判断网页中的id是否有重复的

    From:http://blog.csdn.net/china_skag/article/details/6915323判断网页中的ID是否有重复的:指定ID判断 $(function(){ $(&q ...

  3. 如何判断js中的数据类型?

    js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...

  4. 如何判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  5. Jquery判断数组中是否包含某个元素$.inArray()的用法

    判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...

  6. Ifvisible.js – 判断网页中的用户是闲置还是活动状态

    ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...

  7. PHP判断字符串中是否包含指定字符串,支持中文哦

    RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...

  8. [转]如何判断js中的数据类型

    原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...

  9. JS判断数组中是否有重复元素的方法

    判断数组中是否有重复元素,最容易想到的方法是使用2重循环,逐个遍历,比较,但是这个是最慢,最笨的方法,百度得出了更好的方法. var ary = new Array("111",& ...

随机推荐

  1. net的微服务架构

    net的微服务架构 眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两 ...

  2. [Ramda] Convert Object Methods into Composable Functions with Ramda

    In this lesson, we'll look at how we can use Ramda's invoker and constructNfunctions to take methods ...

  3. [NPM] Use package.json variables in npm scripts

    In this lesson we will show that you can leverage values that you already have provided in your pack ...

  4. php如何实现万年历的开发(每日一课真是非常有效率)

    php如何实现万年历的开发(每日一课真是非常有效率) 一.总结 一句话总结: 1.判断每月有多少天: 通过data函数来判断,$days=date('t',$firstday); 2.判断每月的第一天 ...

  5. html5--6-33 CSS定位是什么

    html5--6-33 CSS定位是什么 一.总结 一句话总结: 1.常规文档流是一套体系,浮动是另外一套体系. 2.标签清除浮动之后会跑到常规文档流它本来的地方. 3.浮动是否占据常规文档流:应该不 ...

  6. Linux下用GCC

    Linux下用GCC 前言 离职前对做过的支付系统进行了一番#总结,继续完善我的C服务器. 本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与php进程的交互数据类型问 ...

  7. 执行hdfs namenode -importCheckpoint时出现No image directories available!

    在https://issues.apache.org/jira/browse/HDFS-4705找到了答案需要在hdfs-site.xml中配置 <!--指定fsimage存储目录--> ...

  8. 数据集成工具:Teiid实践

    数据集成是把不同来源.格式.特点性质的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享.数据集成的方式多种多样,这里介绍的 Teiid 是其中的一种:通过抽象和联邦技术,实现分布式数据源的 ...

  9. php自动加载类文件探讨,spl_autoload_register自动加载原理

    spl_autoload_register函数是实现自动加载未定义类功能的的重要方法,所谓的自动加载意思就是 我们的new 一个类的时候必须先include或者require的类文件,如果没有incl ...

  10. 使用QuickContactBadge关联联系人

    QuickContactBadge继承了ImageView,因此它的本质也是图片,也可以通过android:src属性指定它显示的图片.QuickContackBadge额外功能是:该图片可以关联到手 ...