安卓游戏 实现飘雪花的界面

 前几天,有看到一个手机游戏中一飘雪花的场景,感觉很漂亮。今天也想实现一下。

 首先要找一副雪花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;
 }
 

}

                     

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值