Cavas绘图移动游戏背景呈现前进效果(雷电战机一)

直接上代码了,代码注释详细

class MyView extends View
 {
  // 记录背景位图的实际高度
  final int BACK_HEIGHT = 1700;
  // 背景图片
  private Bitmap back;//创建Bitmap对象,其实就代表一张图片
  private Bitmap plane;
  // 背景图片的开始位置
  public int WIDTH;
  public int HEIGHT;
  private int startY = BACK_HEIGHT - HEIGHT;
  
  public float currentX;
  public float currentY;
  private float Touchx;
  private float Touchy;
  // 定义飞机的移动速度
  private int speed = 10;
  
  // 定义、并创建画笔
  Paint p = new Paint();//Cavas画画需要定义画笔
  
  public MyView(Context context)
  {
   super(context);
   //BitmapFactory是个类,用于使用其中的方法来解析创建Bitmap(图片)对象的
   back = BitmapFactory.decodeResource(context.getResources(),
    R.drawable.back_img);
   plane = BitmapFactory.decodeResource(context.getResources(),
    R.drawable.plane);
   //定时器用于定时改变背景图片坐标的
   final Handler handler = new Handler()
   {
    public void handleMessage(Message msg)
    {
     if (msg.what == 0x123)
     {
      // 重新开始移动
      if (startY <= 3)
      {
       startY = BACK_HEIGHT - HEIGHT;
      }
      else
      {
       startY -= 3;
      }
     }
     invalidate();//改变了截屏的坐标从新像是就跟动态的是的了
    }
   };
   new Timer().schedule(new TimerTask()
   {
    @Override
    public void run()
    {
     handler.sendEmptyMessage(0x123);
    }

   }, 0, 100);//100ms,时间长了会看出来一顿一顿的
  }
  //此类是继承VIEW的其实是一个绘图,重写onDraw方法即可完成绘图,无需调用,调用invalidate();可进行重画,也就是再次调用了次方法
  //不断重复调用onDraw方法就完成了动画效果,也就是更新XY后调用invalidate();
  //如果为了每个更新的图片调用自己的onDrow,新建函数就可以,无非是不调用invalidate()调用自己的函数呗eg:public void zjk(Canvas canvas){}
  //只要将要花的东西放在两个类中,在ACTIVITY中分别调用其ondraw就好了 不用在一个类中重建函数,这样运行
  //在activit的XML中创建自己画的组件就好
  //背景图调用频繁,灰机不动的话其实是浪费资源,但是不重画灰机又怕灰机就没了,用framelayout布局就好

//第一个创建的组建在最底层
  @Override
  public void onDraw(Canvas canvas)
  {
   // 根据原始位图和Matrix创建新图片
   //从原始图片中挖出一屏幕的图片来显示,
   Bitmap bitmap2 = Bitmap
     .createBitmap(back, 0, startY, WIDTH, HEIGHT); // ①
   // 绘制新位图
   canvas.drawBitmap(bitmap2, 0, 0, p);
   // 绘制飞机
   canvas.drawBitmap(plane, currentX, currentY, p);
  }
  
  //触摸时间控制灰机移动的,里面的移动算法有点菜
  public boolean onTouchEvent(MotionEvent event)
  {
   // 获取手的位置
   Touchx = event.getRawX();
   Touchy = event.getRawY();
   //左上方
   if(Touchx
   {
    if((Touchx+speed)
    {
     currentX-=speed*2/3;
     currentY-=speed;
    }
    if((Touchx+speed)currentY)
    {
     currentX-=speed;
     
    }
    if((Touchx+speed)>currentX && (Touchy+speed)
    {
     
     currentY-=speed;
    }
    
   }
   //右上方
   if(Touchx>currentX && Touchy
   {
    if((Touchx-speed)>currentX && (Touchy+speed)
    {
     currentX+=speed*2/3;
     currentY-=speed;
    }
    if((Touchx-speed)
    {
     currentY-=speed;
     
    }
    if((Touchx-speed)>currentX && (Touchy+speed)>currentY)
    {
     currentX+=speed;
     
    }
    
   }
   //左下方
   if(TouchxcurrentY)
   {
    if((Touchx+speed)currentY)
    {
     currentX-=speed*2/3;
     currentY+=speed;
    }
    if((Touchx+speed)
    {
     currentX-=speed; 
    }
    if((Touchx+speed)>currentX && (Touchy-speed)>currentY)
    {
     currentY+=speed;
     
    }
    
   }
   //右下方
   
   if(Touchx>currentX && Touchy>currentY)
   {
    if((Touchx-speed)currentY)
    {
     
     currentY+=speed;
    }
    if((Touchx-speed)>currentX && (Touchy-speed)
    {
     currentX+=speed; 
    }
    if((Touchx-speed)>currentX && (Touchy-speed)>currentY)
    {
     currentX+=speed*2/3;
     currentY+=speed;
      
    }
    
   }
    
   
   // 通知planeView组件重绘,就是重新调用了onDraw方法
   invalidate();
   return true;
  }
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值