android游戏动画特效的一些处理
游戏中避免不了需要一些动画特效的处理,有些是不方便用美术或者美工来处理的,那么就由我们程序猿来搞了。直接进入正题。
首先是Animation,Animation针对view,可以控制view的位移、缩放、旋转、淡入淡出等等,不做介绍了,网上很多例子,Animation的一些效果比如OvershootInterpolator做出来的效果还是挺不错的。
然后是Matrix和ColorMatrix。Matrix提供rotate,scale,translate,skew4种处理,内部是一个3x3的矩阵,如图。
网上其实也有很多例子,不多赘述了。需要注意的是一些复合用法,比如一边旋转一边缩放。Matrix每个操作都提供三种方法pre,post,set,pre和post是矩阵的左乘和右乘,set会把matrix对象重置为初始化的状态,然后再set对应的属性,比如setScale会把rotate等的属性擦除掉。如果矩阵用的不是很熟练那么也可以直接用一个float数组为matrix setvalue。
ColorMatrix和Matrix类似,内部是5x5的矩阵,可以用来做一些图片颜色的特效比如灰度,饱和度,亮度,滤镜等等的处理。
有关Matrix和ColorMatrix的详细可以参照某大神的blog。传送门:http://www.cnblogs.com/leon19870907/articles/1978065.html
然后,在api 11,android为我们加入了一种属性动画,Animator。Animator与animation有个很大区别是,Animator会改变被操作对象的实际属性。而且Animator不只可以操作view,而是可以操作任何Object,详细可以参照APIDemo中com.example.android.apis.animation.MultiPropertyAnimation,网上也有很多相关的文章,在此不多赘述。要注意Animator要api level 11以后才可以使用。
然后,还可以操作像素,简单提供个思路,算是抛砖引玉吧。
先上代码。
1 public static Bitmap getBitmap(Bitmap src) { 2 Bitmap newImage = null; 3 int w = src.getWidth(); 4 int h = src.getHeight(); 5 newImage = Bitmap.createBitmap(w, h, Config.ARGB_8888);//创建一张空图片 6 for (int i = 0; i < h; i++) { 7 for (int j = 0; j < w; j++) { 8 int rgb = src.getPixel(j, i);//取到像素值 9 int a = (rgb >> 24) & 0xff; 10 int r = (rgb >> 16) & 0xff; 11 int g = (rgb >> 8) & 0xff; 12 int b = rgb & 0xff; 13 int newRgb = (((r * 30 + g * 59 + b * 11) / 100) << 16) 14 | (((r * 30 + g * 59 + b * 11) / 100) << 8) 15 | ((r * 30 + g * 59 + b * 11) / 100) | a << 24; //拼装新的像素值 16 newImage.setPixel(j, i, newRgb); 17 } 18 } 19 return newImage; 20 }
图片都是由像素组成的这个大家都知道。android为bitmap类提供了getPixel和setPixel方法。getPixel得到的是argb各8位的一个int值,通过位运算我们可以得到对应的a r g b值,就是透明度,红色,绿色,蓝色的值,然后通过处理得到一个新的rgb值,set回去。上面的代码是把彩色图片处理成黑白图的一种方式。没有考虑效率,只是提供个思路。要注意遍历像素做运算处理是比较慢的,所以不要在每帧的绘制过程中都去调用这种方法,应该用一个Bitmap做个缓存。这样只要知道rgb的变化过程就可以做出对应的特效。或者可以做一些像素级别的碰撞处理。
简单的双缓冲。
Bitmap buf() { Bitmap buf = Bitmap.createBitmap(100, 100, Config.ARGB_8888);//初始化缓冲图 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Canvas canvas = new Canvas(buf); canvas.drawBitmap(bitmap, 10, 20, null);//向缓冲中绘制图像
return buf;
}
简单的双缓冲可以把整个的一个自定义canvas上的图像返回为一张bitmap,这样所有对bitmap的操作就同样适用于canvas了。使用时同样要注意效率。
一些连续的动画或者曲线不规则轨迹,可以自己做一些简单的算法,或者用一些动画编辑器一类的东西。比如小球走抛物线轨迹,就可以每帧让x坐标变化,然后通过定义的公式y=ax²+bx + c;算出每帧的y值,这样小球就可以走简单的抛物线轨迹了。需要注意android上的坐标系和数学的坐标系是相反的,数学上y坐标是向上增长。android上目前没有找到好用的开源的动画编辑器,同行们有好用的可以推荐给我,灰常感谢。。。
还有一些雾气,火焰等一些模拟的特效,那些就是opengl和粒子系统的东西了,一般一些引擎都已经封装的很好,有现成的粒子编辑器。模拟现实中的火焰、雾气等等的粒子效果。
大概先写这些吧,有不对不足的地方欢迎指出~~~
不是有那句话,如果你想走得快那么请你一个人走,如果你想走得远那么请你和一群人一起走。