时间:2021-05-02
本文实例讲述了Android下2d物理引擎Box2d用法。分享给大家供大家参考。具体如下:
程序运行的时候需要加载Jbox2d的库,可到以下地址下载(使用的是不带渲染部分的库jbox2d-2.0.1-library-only.jar):
http://sourceforge.net/projects/jbox2d/
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 package com.test; import org.jbox2d.collision.AABB; import org.jbox2d.collision.CircleDef; import org.jbox2d.collision.PolygonDef; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.Body; import org.jbox2d.dynamics.BodyDef; import org.jbox2d.dynamics.World; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.Window; import android.view.WindowManager; public class MyBox2d extends Activity { private final static int RATE = 10;//屏幕到现实世界的比例 10px:1m; private AABB worldAABB; //创建 一个管理碰撞的世界 private World world; private float timeStep = 1/60;//模拟的的频率 private int iterations = 10;//迭代越大,模拟约精确,但性能越低 private Body body,body2,body3; private MyView myView; private Handler mHandler; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN); worldAABB = new AABB(); //上下界,以屏幕的左上方为 原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟 worldAABB.lowerBound.set(-100.0f,-100.0f); worldAABB.upperBound.set(100.0f, 100.0f); //注意这里使用的是现实世界的单位 Vec2 gravity = new Vec2(0.0f,10.0f); boolean doSleep = true; world = new World(worldAABB, gravity, doSleep);//创建世界 createBox(160, 470, 160, 10, true); createBox1(160, 150, 160, 10, false); createCircle(160, 100, 10); createCircle1(150, 60, 10); timeStep = 1.0f/60.0f; iterations = 10; myView = new MyView(this); setContentView(myView); mHandler = new Handler(); mHandler.post(update); } private Runnable update = new Runnable() { public void run() { world.step(timeStep, iterations);//开始模拟 Vec2 position = body.getPosition(); Vec2 position1 = body2.getPosition(); Vec2 position2 = body3.getPosition(); myView.x=position.x*RATE; myView.y=position.y*RATE; myView.x1=position1.x*RATE; myView.y1=position1.y*RATE; myView.x2=position2.x*RATE; myView.y2=position2.y*RATE; myView.update(); mHandler.postDelayed(update, (long)timeStep*1000); } }; public void createBox(float x,float y,float half_width,float half_height,boolean isStatic){ PolygonDef shape = new PolygonDef(); if(isStatic){shape.density = 0;} else{shape.density = 2.0f;} shape.friction = 0.8f; shape.restitution = 0.3f; shape.setAsBox(half_width/RATE, half_height/RATE); BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); Body body1= world.createBody(bodyDef); body1.createShape(shape); body1.setMassFromShapes(); } public void createCircle(float x,float y,float radius){ CircleDef shape = new CircleDef(); shape.density = 7; shape.friction = 0.2f; shape.radius = radius/RATE; BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); body2 = world.createBody(bodyDef); body2.createShape(shape); body2.setMassFromShapes(); } public void createCircle1(float x,float y,float radius){ CircleDef shape = new CircleDef(); shape.density = 7; shape.friction = 0.2f; shape.radius = radius/RATE; BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); body3 = world.createBody(bodyDef); body3.createShape(shape); body3.setMassFromShapes(); } public void createBox1(float x,float y,float half_width,float half_height,boolean isStatic){ PolygonDef shape = new PolygonDef(); if(isStatic){shape.density = 0;} else{shape.density = 2.0f;} shape.friction = 0.3f; shape.setAsBox(half_width/RATE, half_height/RATE); BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); body= world.createBody(bodyDef); body.createShape(shape); body.setMassFromShapes(); } class MyView extends View{ Canvas canvas; public float x=160,y=150; public float x1=160,y1=100; public float x2=150,y2=60; public MyView(Context context) { super(context); } public void drawBox(float x,float y){ Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.RED); canvas.drawRect(x-160, y-10, x+160, y+10, mPaint); } public void drawGround(){ Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.BLUE); canvas.drawRect(0, 460, 320, 480, mPaint); } public void drawCircle(float x1,float y1){ Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.GREEN); canvas.drawCircle(x1, y1, 10, mPaint); } public void update(){ postInvalidate(); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); this.canvas = canvas; drawGround(); drawBox(x, y); drawCircle(x1, y1); drawCircle(x2, y2); } } }希望本文所述对大家的Android程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在Canvas中进行碰撞检测,大家往往直接采用游戏引擎(Cocos2d-JS、Egret)或物理引擎(Box2D)内置的碰撞检测功能,好奇的你有思考过它们的内部
红外人脸识别和tof3d有什么区别哪个好 3D和2D的区别还是比较大的,2D主要是平面,3D能够有纵深感,从安全性来看,3D要比2D高。 以上就是&ldqu
pytorch中的2D卷积层和2D反卷积层函数分别如下:classtorch.nn.Conv2d(in_channels,out_channels,kernel
AxureRP8设计软件中可以利用2D图转换成3D图形,设置3D图形边框、填充色、阴影等属性,这样更让3D图形有立体感。下面利用一个具体的实例说明2D图形转换成
引言最近在研究Android的变形,Android的2D变形(包括缩放,扭曲,平移,旋转等)可以通过Matrix来实现,3D变形可以通过Camera来实现。接下