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

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

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

        

  • 相关阅读:
    AtCoder Beginner Contest 167
    AtCoder Beginner Contest 166
    AtCoder Beginner Contest 165
    AtCoder Beginner Contest 164
    AtCoder Beginner Contest 163
    AtCoder Beginner Contest 162
    AtCoder Beginner Contest 161
    AtCoder Beginner Contest 160
    AtCoder Beginner Contest 159
    自定义Mybatis自动生成代码规则
  • 原文地址:https://www.cnblogs.com/xirtam/p/3143929.html
Copyright © 2011-2022 走看看