现在的位置: 首页 > 综合 > 正文

Android游戏开发基础part6–动画

2014年01月08日 ⁄ 综合 ⁄ 共 5734字 ⁄ 字号 评论关闭

Android游戏开发基础part6--动画

动画想必大家不陌生了,一些大型游戏,比如《真实赛车》、《极品飞车》、《斯巴达英雄》、《彩虹六号》等等我玩过的大型游戏都有过场动画,很多精彩的特效。这些动画让游戏变得更加生动和震撼。动态的元素在游戏是必不可少的,这些动态元素可能是角色的移动、爆炸的效果、过场的特效等等。

针对动画这一块《Android游戏编程之从零开始》介绍得并不多,它主要讲了两种实习方式:

1.系统提供的Animation类特效

2.开发者自行设计的的动画

下面进行学习总结:

Animation动画

在Android中,系统提供了动画类Animation,其中分为四种动画效果:

·AlphaAnimation:透明度渐变动画;

·ScaleAnimation:渐变尺寸缩放动画;

·TraslateAnimation:移动动画;

·RotateAnimation:旋转动画;

4种动画效果具体创建方法:

1.Animation alphaA = new AlphaAnimation(float fromAlpha,float toAlpha)

第一个参数:动画开始时的透明度

第二个参数:动画结束时的透明度

两个参数的取值范围为[0,1],从完全透明到完全不透明

2.Animation scaleA = new ScaleAnimation(float fromX,float formY,float toY,int pivotXType,float pivotXValue,int pivotYType,float pivotYvalue)

第一个参数:动画起始时的X坐标上的伸缩比例

第二个参数:动画结束时的X坐标上的伸缩比例

第三个参数:动画起始时的Y坐标上的伸缩比例

第四个参数:动画结束时的Y坐标上的伸缩比例

第五个参数:动画在X轴相对于物体的位置类型

第六个参数:动画相对于物体X坐标的位置

第七个参数:动画在Y轴相对于物体的位置类型

第八个参数:动画相对于物体Y坐标的位置

位置类型分为三种:

·Animation.ABSOLUTE:相对位置是屏幕的左上角,绝对位置;

·Animation.RELATIVE_TO_LEFT:相对位置是自身View,取值为0时,表示相对于是自身的左上角,取值为1是相对于自上的右下角;

·Animation.RELATIVE_TO_PARENT:相对于父类View的位置

3.Animation translateA = new TranslateAnimation(float fromXDelta,float toXDelta,float fromXDelta,float toYDelta)

第一个参数:动画起始时X轴上的位置

第二个参数:动画结束时X轴上的位置

第三个参数:动画起始时Y轴上的位置

第四个参数:动画结束时Y轴上的位置

4.Animation rotateA = new RotateAnimation(float fromDegrees,float toDegree,int pivotXType,float pivotXValue,int pivotYType,float pivotYValue)

第一个参数:动画起始时的旋转角度

第二个参数:动画旋转到的角度

第三个参数:动画在X轴相对于物体的位置类型

第四个参数:动画相对于物体的X坐标的开始位置

第五个参数:动画在Y轴相对于物体的位置关系

第六个参数:动画相对于物体的Y坐标的开始位置

以上四种创建方法就是四种不同动画效果的创建方法,虽然他们的创建方法不同,但是还是用一些通用的方法:

·restart():重新播放动画

·setDuration:设置动画播放时间,单位是毫秒

创建项目:AnimationProject

项目运行效果:

初始化效果:

          
==>透明渐变效果:

 

==>缩放动画效果:

  ==>位移动画效果:

==>旋转动画效果:

     

 

项目源代码:

==>Animation.java

package com.animation;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class Animation extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //隐去标题栏
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        //隐去状态栏部分
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new MyView(this));
    }
}

 

==>MyView.java

package com.animation;

import com.animation.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;

public class MyView extends View implements AnimationListener{
	public static MyView mv;
	private Paint paint;
	private Bitmap bmp;
	private int x = 50;
	private Animation mAlphaAnimation;
	private Animation mScaleAnimation;
	private Animation mTranslateAnimation;
	private Animation mRotateAnimation;
	
	/**
	 * 重写父类构造函数
	 */
	public MyView(Context context){
		super(context);
		mv = this;
		paint = new Paint();
		paint.setColor(Color.WHITE);
		paint.setAntiAlias(true);
		bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
		this.setFocusable(true);
	}
	/**
	 * 重写父类绘图函数
	 * 
	 */
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		//黑色背景
		canvas.drawColor(Color.BLACK);
		canvas.drawText("方向键↑渐变透明动画效果", 80, this.getHeight() - 80, paint);
		canvas.drawText("方向键↓渐变尺寸伸缩动画效果",80,this.getHeight() - 60,paint);
		canvas.drawText("方向键←画面转换位置移动动画效果",80,this.getHeight() - 40,paint);
		canvas.drawText("方向键→画面转移旋转动画效果", 80, this.getHeight() - 20, paint);
		//绘制位图
		canvas.drawBitmap(bmp, this.getWidth() / 2 - bmp.getWidth()/ 2, 
				this.getHeight() / 2 - bmp.getHeight() /2, paint);
		x += 1;
	}
	/**
	 * 重写按键按下事件监听函数
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
			mAlphaAnimation = new AlphaAnimation(0.1f,1.0f);
			mAlphaAnimation.setAnimationListener(this);
			mAlphaAnimation.setDuration(3000);
			//设置时间持续时间为3000毫秒
			this.startAnimation(mAlphaAnimation);
		}else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
			mScaleAnimation = new ScaleAnimation(0.0f, 2.0f, 1.5f, 1.5f, Animation.RELATIVE_TO_PARENT, 
					0.5f,Animation.RELATIVE_TO_PARENT, 0.0f);
			mScaleAnimation.setAnimationListener(this);
			mScaleAnimation.setDuration(2000);
			this.startAnimation(mScaleAnimation);
		}else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
			mTranslateAnimation = new TranslateAnimation(0, 100, 0, 100);
			mTranslateAnimation.setAnimationListener(this);
			mTranslateAnimation.setDuration(2000);
			this.startAnimation(mTranslateAnimation);
		}else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
			mRotateAnimation = new RotateAnimation(0.0f,360.0f,Animation.RELATIVE_TO_SELF,
					0.5f,Animation.RELATIVE_TO_SELF,0.5f);
			mRotateAnimation.setAnimationListener(this);
			mRotateAnimation.setDuration(3000);
			this.startAnimation(mRotateAnimation);
		}
		return super.onKeyDown(keyCode, event);
	}
	/**
	 * 重写按键抬起事件函数
	 */
	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		return super.onKeyUp(keyCode, event);
	}
	/**
	 * 重写触屏事件监听函数
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		return super.onTouchEvent(event);
	}
	@Override
	public void onAnimationStart(Animation animation) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void onAnimationEnd(Animation animation) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void onAnimationRepeat(Animation animation) {
		// TODO Auto-generated method stub
		
	}
}

 

系统的四种动画效果就这样完了,下面是自定义动画类型:

1.动态位图

2.帧动画

3.剪切图动画

 

概念总结:

动态位图:顾名思义,会动的位图,只要不断改变位图的坐标,实现位图的移动,产生动态效果就行啦

帧动画:学过flash的童鞋肯定知道帧动画,所谓帧动画就是一帧一帧按照一定顺序进行播放实现,实现方法也很简单,定义一个位图数组存放全部帧,在绘图函数中不断绘图就行了

剪切画动画:是游戏开发中最常用的实现方式,类似于帧动画,唯一区别在于动态物体的动作帧全部放在同一张图片中,然后在通过设置可视区域完成。

分别创建三个项目实现它们,具体的代码不再粘帖,有兴趣的请参考《Andriod游戏编程之从零开始》

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.