前几天,有看到一个手机游戏中一飘雪花的场景,感觉很漂亮。今天也想实现一下。
首先要找一副雪花png图。
关键的地方:
(1)在程序中显示的雪花大小有3种,其实都是同一张图片,在程序中改大小就可以了。
(2) 游戏中的一个雪花 就是一个类,这个类有雪花的坐标,原始的坐标(为了重新赋值用),图片的id号,速度的id号(雪花的速度有的不一样)
(3)程序中的vector 变量用于放置 产生的雪花类,在绘制函数中,每一次遍历vector时,就对x,y 进行增值,
并且要判断位置是否已经出了屏幕,如果出了屏幕,则重置这个雪花的坐标。
虽然写的这个类 比之前写的能好一点,但是还有一点瑕疵,今后遇到好的方法了 ,会改正。
下面是我写的一个类,
public class DrawSnow {
/**
*
*/
boolean [][]hasSnow; //雪花分布图
Vector<SnowPiece> vector=new Vector<SnowPiece>(); // vector
Bitmap []bitmapArry; //雪花的图片有 大中小 3种
int speed=3;
int [][]dirSpeed=new int[][]{
{0,4},
{-1,2},
{2,3}
};
public DrawSnow() {
// TODO Auto-generated constructor stub
/******************************以下的图片可以从自己写 主要是加载图片****************************************/
bitmapArry=new Bitmap[3];
bitmapArry[0]=Constant.SNOW_BITMAP;
bitmapArry[1]=Constant.zoomImage(bitmapArry[0]
, bitmapArry[0].getWidth()/2, bitmapArry[0].getHeight()/2);
bitmapArry[2]=Constant.zoomImage(bitmapArry[1]
, bitmapArry[0].getWidth()*0.8f, bitmapArry[0].getHeight()*0.8f);
/*************************************************************************************/
makeSnow();
}
public void draw(Canvas canvas,Paint paint){
SnowPiece obj;
int maxHeight=Constant.SCREEN_HEIGHT;
int len=vector.size();
for(int i=0;i<len;i++){
obj=vector.elementAt(i);
obj.y+=dirSpeed[obj.dir][1];
obj.x+=dirSpeed[obj.dir][0];
if( isOutScr(obj)==true){
obj.reset();
}
obj.draw(canvas, paint);
}
}
public void logic(){
}
private void makeSnow(){
Random r=new Random();
int row=10;
int col=15;
hasSnow=new boolean[row][col];
int w=Constant.SCREEN_WIDTH/col;
int h=Constant.SCREEN_HEIGHT/row;
SnowPiece snowObj;
for(int i=0;i<row;i++)
for(int j=col-1;j>=0;--j){
if(r.nextInt(500)%5==0)
{
hasSnow[i][j]=true;
snowObj=new SnowPiece();
snowObj.orgx=snowObj.x=j*w;
snowObj.orgy=snowObj.y=-i*h-h;
if(r.nextInt()%2==0){
if(r.nextInt(100)%2==0)
{
snowObj.picId=0;
snowObj.dir=2;
}
else
{
snowObj.picId=2;
snowObj.dir=1;
}
}
else
snowObj.picId=1;
vector.add(snowObj);
}
}
}
class SnowPiece{
int orgx;
int orgy;
int x;
int y;
int dir; //方向
int picId; //
SnowPiece(){
x=-5;
y=-5;
dir=0;
picId=0;
}
public void reset(){
x=orgx;//(int)Math.random()*1000%Constant.SCREEN_WIDTH;
y=orgy-2;
}
public void draw(Canvas canvas,Paint paint){
canvas.drawBitmap(bitmapArry[picId], x,y, paint);
}
}
public static boolean isOutScr(SnowPiece obj){
if(obj.x<0||obj.x>=Constant.SCREEN_WIDTH)
return true;
if(obj.y>Constant.SCREEN_HEIGHT)
return true;
return false;
}
}