libgdx之RevoluteJointDef关节

来源:互联网 发布:js throw err 编辑:程序博客网 时间:2024/06/09 20:21

原文链接http://blog.csdn.net/cng1991/article/details/7307881

最近在看libgdx的box2d相关的知识。网上介绍libgdx是通过jni封装了box2d的。

今天看到了RevoluteJointDef关节。RevoluteJointDef关节的作用就是将两个物体用线连起来,达到两个物体运动相互影响的效果。

先贴出代码

package com.cng;import com.badlogic.gdx.ApplicationListener;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.InputProcessor;import com.badlogic.gdx.graphics.GL10;import com.badlogic.gdx.graphics.OrthographicCamera;import com.badlogic.gdx.math.Vector2;import com.badlogic.gdx.math.Vector3;import com.badlogic.gdx.physics.box2d.Body;import com.badlogic.gdx.physics.box2d.BodyDef;import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;import com.badlogic.gdx.physics.box2d.Fixture;import com.badlogic.gdx.physics.box2d.QueryCallback;import com.badlogic.gdx.physics.box2d.World;import com.badlogic.gdx.physics.box2d.joints.MouseJoint;import com.badlogic.gdx.physics.box2d.joints.MouseJointDef;public abstract class BoxTest implements InputProcessor,ApplicationListener{OrthographicCamera camera;Box2DDebugRenderer renderer;MouseJoint mouseJoint;World world;Body grounpBody;Body hitBody;protected abstract void createWorld(World world);Vector2 tmp=new Vector2();@Overridepublic void create(){camera=new OrthographicCamera(48, 32);camera.position.set(0, 15, 0);renderer=new Box2DDebugRenderer();world=new World(new Vector2(0,-10), true);createWorld(world);BodyDef bodyDef=new BodyDef();grounpBody=world.createBody(bodyDef);Gdx.input.setInputProcessor(this);}@Overridepublic void dispose(){world.dispose();renderer.dispose();world=null;renderer=null;hitBody=null;mouseJoint=null;}@Overridepublic void pause(){}@Overridepublic void render(){GL10 gl=Gdx.graphics.getGL10();gl.glClear(GL10.GL_COLOR_BUFFER_BIT);camera.update();camera.apply(gl);world.step(Gdx.graphics.getDeltaTime(), 3, 3);renderer.render(world, camera.combined);}@Overridepublic void resize(int arg0, int arg1){}@Overridepublic void resume(){}@Overridepublic boolean keyDown(int arg0){return false;}@Overridepublic boolean keyTyped(char arg0){return false;}@Overridepublic boolean keyUp(int arg0){return false;}@Overridepublic boolean scrolled(int arg0){return false;}Vector3 testPoint=new Vector3();QueryCallback callback=new QueryCallback(){@Overridepublic boolean reportFixture(Fixture fixture){if(fixture.testPoint(testPoint.x, testPoint.y)){hitBody=fixture.getBody();return false;}else {return true;}}};@Overridepublic boolean touchDown(int x, int y, int arg2, int arg3){hitBody=null;camera.unproject(testPoint.set(x, y, 0));world.QueryAABB(callback, testPoint.x-0.0001f, testPoint.y-0.0001f, testPoint.x+0.0001f, testPoint.y+0.0001f);if(hitBody==grounpBody) hitBody=null;if(hitBody!=null&&hitBody.getType()==BodyType.KinematicBody){return false;}if(hitBody!=null){MouseJointDef def=new MouseJointDef();def.bodyA=grounpBody;def.bodyB=hitBody;def.collideConnected=true;def.target.set(testPoint.x, testPoint.y);def.maxForce=100*hitBody.getMass();mouseJoint=(MouseJoint) world.createJoint(def);hitBody.setAwake(true);}return false;}Vector2 target=new Vector2();@Overridepublic boolean touchDragged(int x, int y, int arg2){if(mouseJoint!=null){camera.unproject(testPoint.set(x, y, 0));mouseJoint.setTarget(target.set(testPoint.x,testPoint.y));}return false;}@Overridepublic boolean touchMoved(int arg0, int arg1){return false;}@Overridepublic boolean touchUp(int arg0, int arg1, int arg2, int arg3){if(mouseJoint!=null){world.destroyJoint(mouseJoint);mouseJoint=null;}return false;}}

package com.cng;import android.os.Bundle;import com.badlogic.gdx.backends.android.AndroidApplication;import com.badlogic.gdx.math.Vector2;import com.badlogic.gdx.physics.box2d.Body;import com.badlogic.gdx.physics.box2d.BodyDef;import com.badlogic.gdx.physics.box2d.EdgeShape;import com.badlogic.gdx.physics.box2d.FixtureDef;import com.badlogic.gdx.physics.box2d.PolygonShape;import com.badlogic.gdx.physics.box2d.World;import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;import com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef;public class MyGameActivity extends AndroidApplication { class MyGameListen  extends BoxTest{@Overrideprotected void createWorld(World world){Body ground;{BodyDef bodyDef=new BodyDef();//新建物理对象ground=world.createBody(bodyDef);EdgeShape shape=new EdgeShape();//新建物理对象的显示图形shape.set(new Vector2(-40, 0), new Vector2(40, 0));ground.createFixture(shape, 0.0f);//使物理对象有外表,即可看到的图形}{Body preBody=ground;//定义关节前的物体PolygonShape shape=new PolygonShape();shape.setAsBox(0.5f, 0.2f);RevoluteJointDef rj=null;for(int i=0;i<30;i++){BodyDef def=new BodyDef();def.type=BodyType.DynamicBody;def.position.set(0.5f+i, 25f);Body body=world.createBody(def);//定义关节后的物体FixtureDef fd=new FixtureDef();fd.shape=shape;fd.friction=0.2f;fd.density=20.0f;body.createFixture(fd);Vector2 anchor=new Vector2(i,25);rj=new RevoluteJointDef();rj.initialize(preBody, body, anchor);preBody=body;world.createJoint(rj);}}}}@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);initialize(new MyGameListen(), false);}}
我大概也就只能解释那么多了。。。能力有限。等学得在深入点,我再修改下,解释的更详细点。