android 弹球碰撞
本程序是实现了简单的android碰撞实例,通过绘制的一个小球(就是绘制的一个圆啦哈哈)然后通过碰撞检测与上下屏幕边缘的位置,实现简单的反弹。 不足之处就是:我直接用具体的数据了可移植性不好。自己可以改成变量然后赋值。注意一点就是反弹的长度即宽度的变小尺寸一定要是球的速度的整数倍!否则会出错。具体看代码
先上实现的效果。
这是所绘制的小球。初始时是圆形的。
这是碰撞的效果。
下面给出主要代码:
package com.android.wwv; import Interface.ban; import android.app.Activity; import android.graphics.Matrix; import android.os.Bundle; import android.text.BoringLayout.Metrics; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.widget.LinearLayout; public class ActivityMain extends Activity implements ban,OnTouchListener,Runnable { dangban ban; int diswid,dishei,speedx=0,speedy=8; Thread thread; thisview view; boolean left,right,uphui=false,downhui,upcan,downcan; LinearLayout layout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); thread=new Thread(this); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); DisplayMetrics mt=new DisplayMetrics(); getWindow().getWindowManager().getDefaultDisplay().getMetrics(mt); diswid=mt.widthPixels; dishei=mt.heightPixels; view=new thisview(this,ActivityMain.this); ban=new dangban(this); thread.start(); layout=new LinearLayout(this); layout.setOrientation(1); layout.addView(view); layout.setOnTouchListener(this); setContentView(layout); } public dangban getban() { return ban; } public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN){ if(event.getX()<diswid/2){ left=true; right=false; } if(event.getX()>diswid/2){ left=false; right=true; } } if(event.getAction()==MotionEvent.ACTION_UP){ left=false; right=false; } return true; } public void collect(){ if(view.fdown<=8||view.fup>=472){ speedx=-speedx; speedy=-speedy; } } public void run() { while(true){ collect(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } view.move(speedx,speedy); if(left==true) ban.move(-5, 0); if(right==true) ban.move(5,0); } } }
下面代码是绘制小球的java代码实现如下:
package com.android.wwv; import Interface.ban; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.util.Log; import android.view.View; public class thisview extends View implements Runnable{ float ang=5.0f; int count; int rectx=150,recty,aphla,colorr,colorg,colorb; int fleft=150,fright=180,fup=0,fdown=30; Matrix matrix; Bitmap bitmap; ban mban; public thisview(Context context,ban b) { super(context); bitmap=((BitmapDrawable) getResources().getDrawable(R.drawable.icon)).getBitmap(); this.mban=b; matrix=new Matrix(); new Thread(this).start(); } @Override protected void onDraw(Canvas canvas) { Paint paint=new Paint(); paint.setARGB(100, colorr, 200,200); canvas.drawOval(new RectF(fleft,fup,fright,fdown), paint); canvas.setMatrix(matrix); mban.getban().onDraw(canvas); super.onDraw(canvas); } public void move(int x,int y){ if(fup<=0&&fdown>=8){ fup=0; fdown+=y; if(fdown>=30)fup+=y; } else if(fdown>=480&&fup<=472){ fdown=480; fup+=y; if(fup<=450)fdown+=y; } else{ fdown+=y; fup+=y; } } public void run() { while(true){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } postInvalidate(); } } }
以上便是该程序的主要的代码。这个小程序的精华之处是实现小球的碰撞的变型效果。开始时绘制椭圆时使用的是左顶点x,y和宽高可是这样效果不好实现。所以用了代码所示的方法相对简洁。
希望对android初学者有帮助谢谢!
详细代码见附件。