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游戏编程之从零开始》