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

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

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

        

  • 相关阅读:
    Cassandra 分页 读取数据
    cassandra高级操作之索引、排序以及分页
    cassandra 可视化工具
    SpringBoot集成Cassandra参考文章
    022 android studio 首次启动时默认的sdk安装路径
    021 Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout)
    020 本机Gradle目录 Could not find com.android.tools.build:gradle:4.1
    019 Android Studio打开XML文件Design显示Waiting for build to finish
    018 Could not download espresso-core-3.2.0.aar (androidx.test.espresso:espresso-core:3.2.0)
    017 Android Studio is using the following JDK location when running Gradle:
  • 原文地址:https://www.cnblogs.com/xirtam/p/3143929.html
Copyright © 2011-2022 走看看