public void createball(float x,float y,float radius)
{
PolygonDef shape = new PolygonDef();
shape.density = 10f;
shape.friction = 0.5f;
shape.restitution = 0.3f;
shape.setAsBox(10*density/RATE, 10*density/RATE);//这里我们暂且将小鸟定义为4边型,正规的应该定义为多边形..涉及到计算.就带过了
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x / RATE, y / RATE);
Body body = world.createBody(bodyDef);
body.m_type = Body.e_dynamicType;
body.createShape(shape);
body.setMassFromShapes();
body.setUserData(“FlyBall”+Bodynum);
Bodynum++;
Vec2 gravity = new Vec2(-(myView.singleshot.x – 75) * 30,-(myView.singleshot.y -260*density)*40);
//这里的这个向量是将要加给小鸟初始飞行的冲量,会根据弹弓拉扯后的坐标计算向上或向下冲力,第一个值为水平方向正值为向右
//第二个为垂直方向,正值为向下
body.wakeUp();//唤醒这个刚体
body.applyImpulse(gravity, body.getWorldCenter());//给这个小鸟一个力
/// 这段代码是尝试给刚体一个力
arrBody.add(body); //将这个小鸟加入到刚体链表当中
}
//ConstactListener是碰撞监听,我们为这个世界增加碰撞监听,当刚体发生碰撞时,会回调这个方法
ContactListener listener = new ContactListener() {
Body body1;
Body body2;
public void result(ContactResult point) {
// TODO Auto-generated method stub
// myView.hit();
}
public void remove(ContactPoint point) {
// TODO Auto-generated method stub
// myView.hit();
// Log.v(“Hit!!”, “Hit!!”);
}
public void persist(ContactPoint point) {
// TODO Auto-generated method stub
// myView.hit();
// Log.v(“Hit!!”, “Hit!!”);
}
public void add(ContactPoint point) {//这个方法是当物体碰撞发生时触发的,我们主要对这个方法进行处理
// TODO Auto-generated method stub
// myView.hit();
Log.v(“Hit!!”, “Hit!!”);
//Log.v(“Hit!!”, “Hit!!”);
body1 = point.shape1.m_body;
body2 = point.shape2.m_body;
Log.v(“HitBodyOne”, body1.m_userData.toString());
Log.v(“HitBodyTwo”, body2.m_userData.toString()); //这里简单的监听了一下碰撞,输出了碰撞物体的名称,具体要做什么操作,实现什么动画效果,可以自己添加
}
};
//这里我们监听Touch事件,来实现弹弓的拖动效果
OnTouchListener touchListener = new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
//
Log.v(“x”,arg1.getX()+””);
Log.v(“y”,arg1.getY()+””);
MyGraphicsView view = (MyGraphicsView)arg0;
//当拖动时,我们来处理拖动的坐标,让他不会超出我们预设的范围
if(arg1.getX() > 120*density)
view.singleshot.x = (int)(100*density);
else
view.singleshot.x = (int)arg1.getX();
if(arg1.getY() < 230*density)
view.singleshot.y = (int)(230*density);
else
view.singleshot.y = (int)arg1.getY();
view.invalidate();
//end
//监听触碰移开,创建并释放小鸟
if(arg1.getAction() == MotionEvent.ACTION_UP)
{
createball(view.singleshot.x,view.singleshot.y,10*density);//调用创建小鸟方法
view.singleshot.x = 0;
view.singleshot.y = 0;
view.invalidate();
}
return true;
}
};
}
package cn.sun;
/**
* Author Sun
*/
import java.util.ArrayList;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.view.SurfaceView;
import android.view.View;
public class MyGraphicsView extends View{
Canvas canvas;
public ArrayList<Body> arrBody;
public float density;
public Point singleshot; //用来记录弹弓被拖动到的位置
public Bitmap bmbox;
public Bitmap bmbird;
public MyGraphicsView(Context context) {
super(context);
singleshot = new Point();
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
this.canvas = canvas;
//创建小鸟的bitmap图像,并对图像进行压缩4倍操作,只有在第一次创建时new Bitmap图像一次
if(bmbird == null ){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
opt.inSampleSize = 4;
bmbird = BitmapFactory.decodeResource(getResources(), R.drawable.xx,opt);
bmbird = Bitmap.createScaledBitmap(bmbird, (int)(20*density), (int)(20*density),true);//将图像大小设定为20dip
//end
}