实例7---android 版Sprite代码

  因为android 没有提供sprite,对于使用j2me的开发者有些不习惯,我接下去的实例也会用的sprite,所以我就写个了android版的sprite,只提供了一些我平时常用到的方法,等以后有用到其他的,就增加其他的,大家也可以自己增加。算法可能不是很优化,大家可以自行修改。下面给出源码:

AndroidSprite.java

 

package com.wjh.my_sprite;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;

public class AndroidSprite {
	
	
	private int length = 0;// 帧序列长度
	private int currentPosition = 0;//当前帧序列下标
	private int[][] framesXY = null;//各个帧序列在图片的坐标
	private int frameWidth = 0;//帧的宽度
	private int frameHeight = 0;//帧的高度
	private Bitmap bigFrames = null;//大的图片
	private int cols = 0;
	private int rows = 0;
	private int PositionX = 0;//精灵的X坐标
	private int PositionY = 0;//精灵的Y坐标
	
	private int[] frameSequence = null;//加入的帧序列
	private int sequencePosition = 0;//加入的帧序列的显示下标
	public AndroidSprite(Bitmap image,int frameWidth,int frameHeight)
	{
		//初始化
		this.bigFrames = image;
		this.frameWidth = frameWidth;
		this.frameHeight = frameHeight;
		
		framesXY = initSprite(image, frameWidth, frameHeight);
		this.length = framesXY.length;
	}
	//初始化精灵
	private int[][] initSprite(Bitmap bitmap,int frameWidth,int frameHeight)
	{
		int imageWidth = bitmap.getWidth();
		int imageHeight = bitmap.getHeight();
		this.cols = Math.round(imageWidth/frameWidth);//列数
		this.rows = Math.round(imageHeight/frameHeight);//行数
		
		int[][] tempXYs = new int[cols*rows][2];
		for(int i=0,k=0;i<rows;i++)
		{
			for(int j=0;j<cols;j++,k++)
			{
				tempXYs[k][0] = j*frameWidth;
				tempXYs[k][1] = i*frameHeight;
			}
		}
		
		
		return tempXYs;
	}
	//获得当前帧的下标
	public int getFrame()
	{
		return this.currentPosition;
	}
	//获得帧序列的长度
	public int getFrameSequenLength()
	{
		return framesXY.length;
	}
	//获得当前帧序列的下一个帧
	public void nextFrame()
	{
		//如果自定义帧序列为空,则使用默认的
		if(frameSequence==null)
		{
			currentPosition++;
			if(currentPosition>length-1)
			{
				currentPosition = 0;
			}
		}else
		{
			sequencePosition++;
			if(sequencePosition>frameSequence.length-1)
			{
				sequencePosition = 0;
			}
			currentPosition = frameSequence[sequencePosition];
		}
	}
	//获得当前帧序列的上一个帧
	public void prevFrame()
	{
		if(this.frameSequence==null)
		{
			currentPosition--;
			if(currentPosition<0)
			{
				currentPosition = length-1;
			}
		}else
		{
			sequencePosition--;
			if(sequencePosition<0)
			{
				sequencePosition = frameSequence.length-1;
			}
			currentPosition = frameSequence[sequencePosition];
		}
		
	}
	//设置当前帧
	public void setFrame(int sequenceIndex)
	{
		if(sequenceIndex>=0&&sequenceIndex<length)
		{
		this.currentPosition = sequenceIndex;
		}
	}
	//设置位置
	public void setPosition(int positionX,int positionY)
	{
		this.PositionX = positionX;
		this.PositionY = positionY;
	}
	
	//设置帧序列
	public void setFrameSequence(int[] sequence)
	{
		
		if(this.frameSequence!=null)
		{
			currentPosition = sequence[0];
			sequencePosition = 0;
		}else
		{
			this.frameSequence = sequence;
		}
	}
	//移动
	public void move(int x,int y)
	{
		PositionX += x;
		PositionY += y;
	}
	public void paint(Canvas canvas,Paint paint)
	{
		Log.d("ddd", ""+this.PositionX);
		Log.d("ddd", ""+this.PositionY);
		Bitmap bitmap = Bitmap.createBitmap(this.bigFrames, 
				this.framesXY[currentPosition][0],
				this.framesXY[currentPosition][1],this.frameWidth,this.frameHeight);
		canvas.drawBitmap(bitmap, PositionX, PositionY, paint);
	}
}
 

 

 下面为我写的一个运用这个AndroidSprite的例子,下面为源代码和实例图:


图片插入的时候没显示出来。。所以就不弄了。

 

 源码:MySprite.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值