关于ImageAttributes的简单使用

    今天又写了半天我的2DRPG Engine...经过了这么长的时间,总算像那么回事了,大部分模块已经非常稳定了,性能也很不错,基本上cpu占用在8%左右,内存不超过50M(因为我使用了缓存机制+享元模式:同一类型的元素共用一个图片资源,极大节省了内存)。值得一提的是,我还参照了《两周自制脚本语言》以及作者提供的源码,模仿着写出了一套脚本引擎,并提供了丰富的API,从而可以轻易地操纵游戏中的一切了。同时,我也抽象出了一系列的游戏事件供用户编写,所以游戏的逻辑变得特别灵活,这让游戏的玩法充满了无限可能。对于这个脚本引擎,我想等进一步完善后单独写几篇文来介绍。

    咳,差点忘了正事...对,今天我在测试的时候,发现人物被技能连续击中后会疯狂地弹出伤害字体,然后游戏系统会变得非常卡。于是,我决定给人物增加短暂无敌的效果,顺便开始搭建buff系统。对于无敌效果,我希望人物被击中后会闪烁几下,于是上网查了一下。GDI+提供了ImageAttribute, 它主要是使用一个5×5的矩阵来对图片的颜色矩阵进行变换。在位图中,每一个像素都由Red,Green,Blue,Alpha(灰度)四个8位的值(共32位)组成。用矩阵表示为[R,G,B,A,1]。注意,这里有一个多余的1,它有什么用呢?学过线性代数的人都知道,矩阵的变换本质上是一个矩阵和初等矩阵作乘积,变换后的矩阵的每个元素都是许多乘积的和。然而,如果我们要想在某个元素上加上一个独立的值该怎么办?例如,想要在R值上加3,我们应该怎么做?有人说可以利用G,B,A的值组合出3...那如果你不知道这3个值呢?所以,在图形学里,一个向量通常带一个虚拟坐标,矩阵的维度要相应的加1,这样就可以在任意坐标上添加值了。例如下面的矩阵运算:重新着色 

右边的矩阵 = [2×0.2 + 0.2 ×1, 0 + 0.2 ×1, 0.4 + 0.2, 1, 1]。它表示R值扩大为之前的两倍,然后在R、G、B上分别加0.2。

于是我们很容易就可以写出图片闪烁的代码了:

                float v = 0;
                int time = 20;
                while (time-- > 0)
                {
                    element.ImgAttr = CreateImageAttributes(	//实质上是在构造Attribute的ColorMatrix
                        new float[][]{
                            new float[] { 1, 0, 0, 0, 0 },
                            new float[] { 0, 1, 0, 0, 0 },
                            new float[] { 0, 0, 1, 0, 0 },
                            new float[] { 0, 0, 0, 1, 0 },
                            new float[] { v, v, v, 0, 1 }
                        });
                    v = -(time % 2) * 10;			//决定是否让每种颜色都变暗
                    Thread.Sleep(100);
                }
                element.ImgAttr = null;				//设置元素的Attribute,绘图时使用此Attribute
效果图:

 

我们还可以通过其它简单的变换,实现更棒的效果,这就需要大家去自己探索了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值