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和粒子系统的东西了,一般一些引擎都已经封装的很好,有现成的粒子编辑器。模拟现实中的火焰、雾气等等的粒子效果。

 

    大概先写这些吧,有不对不足的地方欢迎指出~~~

    不是有那句话,如果你想走得快那么请你一个人走,如果你想走得远那么请你和一群人一起走。

    

 

posted @ 2013-06-19 12:14  带狗狗带  Views(953)  Comments(0Edit  收藏  举报