最近想用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. Double prefix overrides to provide 16-bit operand size in a 32/64 operating mode

    A processor supports an operating mode in which the default address size is greater than 32 bits and ...

  2. OpenGLES 关于 数学 的分支 - 线性变化量、离散量、随机量

    关于 数学 的分支 - 线性变化量.离散量.随机量 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作 ...

  3. 【b504】等价表达式(NOIP2005第4题)

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...

  4. Swift 中的高阶函数和函数嵌套

    高阶函数 在Swift中,函数可做为“一等公民”的存在,也就意味着,我们可以和使用 int 以及 String 一样,将函数当做 参数.值.类型来使用. 其中,将函数当作一个参数和值来使用可见下: t ...

  5. oc面试攻略

    原文出自:http://mobile.51cto.com/iphone-402619.htm 1.Object-C有多继承吗?没有的话用什么代替?cocoa 中所有的类都是NSObject 的子类 多 ...

  6. 2013级别C++文章9周(春天的)工程——运算符重载(两)

    课程主页中:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [程序阅读]阅读程序"简单C++学生 ...

  7. JScript分割字符串

    作者:朱金灿 来源:http://blog.csdn.net/clever101 不废话了,直接用代码说明吧: try { var ss = new Array(); var str="12 ...

  8. Codeforces 385 D Bear and Floodlight

    主题链接~~> 做题情绪:时候最后有点蛋疼了,处理点的坐标处理晕了.so~比赛完清醒了一下就AC了. 解题思路: 状态压缩DP ,仅仅有 20 个点.假设安排灯的时候仅仅有顺序不同的问题.全然能 ...

  9. wpf控件开发基础(2) -属性系统(1)

    原文:wpf控件开发基础(2) -属性系统(1) 距离上篇写的时间有1年多了.wpf太大,写的东西实在太多,我将依然围绕着自定义控件来展开与其相关的技术点. 也欢迎大家参与讨论.这篇我们将要讨论的是W ...

  10. Qt 格式转换问题 记录(好多方法)

    用Qt经常头痛于一些格式不能通用的问题 在此记录备用 1 (20120112)QString转为Char * QString *str; char *a; str="hello word ! ...