Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 863|回复: 0

Android游戏开发之切换游戏场景特效的实现 (十九) - &

[复制链接]

该用户从未签到

发表于 2011-10-25 08:55:46 | 显示全部楼层 |阅读模式
带你走进游戏开发的世界之切换场景特效


大家在玩游戏的时候应该有时候会发现在切换游戏场景的时候 界面会播放一段非常好看的动画 比如一个百叶窗的形式关闭界面 然后在打开界面 效果非常好看 用户体验也非常好,今天我向大家解读游戏开发中常用的四种切换场景的特效动画。
下面游戏界面中 红框内标识了4个图片按钮 分别点击这4个按钮会分别播放4组切换场景的特效动画。


1.交叉相合动画

如图所示 左右两边分别以若干个矩形以交替相合的形式合并 控制屏幕关闭



      通过两个for循环 1 3 5 7 9 绘制屏幕左方矩形 2 4 6 8 10 绘制屏幕右放矩形 在游戏更新中计算矩形移动的坐标  然后左边的矩形 分别向右延伸 右边的矩形分别向左延伸  这样就可以实现矩形的交叉合并动画。
                /**交错的实现矩形相交**/

                int count = (mScreenHeight / RANDOM_TYPE_2_RANGE);

                for (int i = 0; i < count; i += 2){

                    drawFillRect(mCanvas, Color.BLACK, 0, i * RANDOM_TYPE_2_RANGE, s_effRange, RANDOM_TYPE_2_RANGE);

                }

                for (int i = 1; i < count; i += 2){

                    drawFillRect(mCanvas, Color.BLACK, mScreenWidth - s_effRange, i * RANDOM_TYPE_2_RANGE, s_effRange, RANDOM_TYPE_2_RANGE);

                }
复制代码
绘制矩形的方法
        /**

         * 绘制一个矩形

         * @param canvas

         * @param color

         * @param x

         * @param y

         * @param w

         * @param h

         */

        public void drawFillRect(Canvas canvas, int color, int x, int y, int w, int h) {

            int backColor = mPaint.getColor();

            mPaint.setColor(color);

            canvas.drawRect(x, y, x + w, y + h, mPaint);

            mPaint.setColor(backColor);

        }
复制代码
2.扇形合并动画

如图所示以扇形的转圈的形式来控制屏幕关闭



在游戏更新中一直更新扇形绘制的区域 根据绘制区域的参数将扇形绘制出来 实现扇形合并的动画效果。
                //rectf为扇形绘制区域 为了让扇形完全填充屏幕所以将它的区域扩大了100像素

                RectF rectf = new RectF(- RANDOM_TYPE_3_RANGE, - RANDOM_TYPE_3_RANGE,mScreenWidth+RANDOM_TYPE_3_RANGE,mScreenHeight + RANDOM_TYPE_3_RANGE);

                //将扇形绘制出来

                drawFillCircle(mCanvas, Color.BLACK,rectf,0,s_effRange,true);
复制代码
绘制扇形的方法
        /**

         * 绘制一个扇形

         * @param canvas

         * @param color

         * @param oval

         * @param startAngle

         * @param sweepAngle

         * @param useCenter

         */

        public void drawFillCircle(Canvas canvas, int color, RectF oval, int startAngle, int sweepAngle, boolean useCenter) {

            int backColor = mPaint.getColor();

            mPaint.setColor(color);  

            canvas.drawArc(oval, startAngle, sweepAngle, useCenter, mPaint);

            mPaint.setColor(backColor);

        }
复制代码
3.百叶窗合并动画

如图所示 屏幕中若干的矩形慢慢放大的形式关闭游戏屏幕



        在屏幕中用双for循环绘制出若干的矩形 在游戏更新中更新矩形绘制的宽与高 直到将屏幕完全填充。这样就可以实现游戏百叶窗合并动画的效果啦。
                /**百叶窗效果利用双for循环 修改每个矩形绘制的宽度**/

                for (int i = 0; i <= (mScreenWidth / RANDOM_TYPE_0_RANGE); i++) {

                    for (int j = 0; j <= (mScreenHeight / RANDOM_TYPE_0_RANGE); j++) {

                        drawFillRect(mCanvas, Color.BLACK, i* RANDOM_TYPE_0_RANGE, j * RANDOM_TYPE_0_RANGE,

                                s_effRange, s_effRange);

                    }

                }
复制代码
4.滚动水纹矩形合并动画

如图所示 利用矩形的滚动实现水纹向右关闭游戏屏幕效果。



        大家仔细观察上图这个动画效果 其实就是4个矩形 从右到左 前3个矩形的大小是固定的中间的间隙也是固定的 最左边的矩形才为真正关闭屏幕的矩形 更新游戏界面时 4个矩形同时向右方移动 前3个只移动坐标 最后一个才是真正填充的矩形。这样就可以实现滚动的水纹的效果了。
                /**水纹效果其实绘制了4个矩形 中间留一些缝隙 **/

                drawFillRect(mCanvas, Color.BLACK, 0, 0, s_effRange, mScreenHeight);

                drawFillRect(mCanvas, Color.BLACK, s_effRange + RANDOM_TYPE_1_SPACE1, 0, RANDOM_TYPE_1_RANGE1, mScreenHeight);

                drawFillRect(mCanvas, Color.BLACK, s_effRange + RANDOM_TYPE_1_SPACE2, 0, RANDOM_TYPE_1_RANGE2, mScreenHeight);

                drawFillRect(mCanvas, Color.BLACK, s_effRange + RANDOM_TYPE_1_SPACE3, 0, RANDOM_TYPE_1_RANGE3, mScreenHeight);
复制代码
这样4个动画效果已经介绍完毕, 下面我将一些重要的代码贴上。


根据特效的状态 进行绘制特效
        /**绘制特效**/

        public void RenderEffect() {

            switch (s_effectType) {

            case RANDOM_EFFECT_TYPE_SQUARE:

                /**百叶窗效果利用双for循环 修改每个矩形绘制的宽度**/

                for (int i = 0; i <= (mScreenWidth / RANDOM_TYPE_0_RANGE); i++) {

                    for (int j = 0; j <= (mScreenHeight / RANDOM_TYPE_0_RANGE); j++) {

                        drawFillRect(mCanvas, Color.BLACK, i* RANDOM_TYPE_0_RANGE, j * RANDOM_TYPE_0_RANGE,

                                s_effRange, s_effRange);

                    }

                }

                break;

            case RANDOM_EFFECT_TYPE_SHADOW:

                /**水纹效果其实绘制了4个矩形 中间留一些缝隙 **/

                drawFillRect(mCanvas, Color.BLACK, 0, 0, s_effRange, mScreenHeight);

                drawFillRect(mCanvas, Color.BLACK, s_effRange + RANDOM_TYPE_1_SPACE1, 0, RANDOM_TYPE_1_RANGE1, mScreenHeight);

                drawFillRect(mCanvas, Color.BLACK, s_effRange + RANDOM_TYPE_1_SPACE2, 0, RANDOM_TYPE_1_RANGE2, mScreenHeight);

                drawFillRect(mCanvas, Color.BLACK, s_effRange + RANDOM_TYPE_1_SPACE3, 0, RANDOM_TYPE_1_RANGE3, mScreenHeight);

                break;

               

            case RANDOM_EFFECT_TYPE_CROSS:

                /**交错的实现矩形相交**/

                int count = (mScreenHeight / RANDOM_TYPE_2_RANGE);

                for (int i = 0; i < count; i += 2){

                    drawFillRect(mCanvas, Color.BLACK, 0, i * RANDOM_TYPE_2_RANGE, s_effRange, RANDOM_TYPE_2_RANGE);

                }

                for (int i = 1; i < count; i += 2){

                    drawFillRect(mCanvas, Color.BLACK, mScreenWidth - s_effRange, i * RANDOM_TYPE_2_RANGE, s_effRange, RANDOM_TYPE_2_RANGE);

                }

                break;

        

            case RANDOM_EFFECT_TYPE_SECTOR:

                //rectf为扇形绘制区域 为了让扇形完全填充屏幕所以将它的区域扩大了100像素

                RectF rectf = new RectF(- RANDOM_TYPE_3_RANGE, - RANDOM_TYPE_3_RANGE,mScreenWidth+RANDOM_TYPE_3_RANGE,mScreenHeight + RANDOM_TYPE_3_RANGE);

                //将扇形绘制出来

                drawFillCircle(mCanvas, Color.BLACK,rectf,0,s_effRange,true);

                break;

               

            }

        }
复制代码
在播放动画的时候须要更新游戏特效 主要是用来更新特效绘制的参数 根据时时更新的参数在绘制中让特效动画动起来。
        /**更新特效**/

        public void UpdataEffectRange(int range) {

            if (s_effRange < s_effectRangeTarget) {

                s_effRange += range;

                if (s_effRange > s_effectRangeTarget) {

                    s_effRange = s_effectRangeTarget;

                }

            } else if (s_effRange > s_effectRangeTarget) {

                s_effRange -= range;

                if (s_effRange < s_effectRangeTarget) {

                    s_effRange = s_effectRangeTarget;

                }

            }

        }
复制代码
通过点击图片按钮来设置播放特效的类型 在这里初始化当前需要播放的 特效绘制的相关参数。
        /**设置播放特效类型**/

        public void SetCurtainEffect(int type) {

            s_effectType = type;

            switch (s_effectType) {

            case RANDOM_EFFECT_TYPE_SQUARE:

                s_effRange = 0;

                s_effectRangeTarget = RANDOM_TYPE_0_RANGE;

                break;

            case RANDOM_EFFECT_TYPE_SHADOW:

                s_effRange = EFFECT_RANGE_PERFRAME_1;

                s_effectRangeTarget = mScreenWidth;

                break;

            case RANDOM_EFFECT_TYPE_CROSS:

                s_effRange = 0;

                s_effectRangeTarget = mScreenWidth;

                break;

            case RANDOM_EFFECT_TYPE_SECTOR:

                s_effRange = 0;

                s_effectRangeTarget = 360;

                break;

            }

            setGameState(GAME_EFFECT);

        }

        
复制代码
最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习
第九讲游戏场景特效.rar (583.26 KB, 下载次数: 67)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:55:52 | 显示全部楼层

Re:Android游戏开发之切换游戏场景特效的实

Android游戏开发之切换游戏场景特效的实现 (十九)
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:55:57 | 显示全部楼层

Re:Android游戏开发之切换游戏场景特效的实

强烈支持
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:56:00 | 显示全部楼层

Re:Android游戏开发之切换游戏场景特效的实

谢谢楼主分享
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:56:03 | 显示全部楼层

Re:Android游戏开发之切换游戏场景特效的实

学习了,谢谢楼主啊
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:56:10 | 显示全部楼层

Re:Android游戏开发之切换游戏场景特效的实

感谢楼主发布。谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:56:13 | 显示全部楼层

Re:Android游戏开发之切换游戏场景特效的实

感谢lz
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 13:58 , Processed in 0.374865 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表