原文链接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();
@Override
public 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);
}
@Override
public void dispose()
{
world.dispose();
renderer.dispose();
world=null;
renderer=null;
hitBody=null;
mouseJoint=null;
}
@Override
public void pause()
{
}
@Override
public 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);
}
@Override
public void resize(int arg0, int arg1)
{
}
@Override
public void resume()
{
}
@Override
public boolean keyDown(int arg0)
{
return false;
}
@Override
public boolean keyTyped(char arg0)
{
return false;
}
@Override
public boolean keyUp(int arg0)
{
return false;
}
@Override
public boolean scrolled(int arg0)
{
return false;
}
Vector3 testPoint=new Vector3();
QueryCallback callback=new QueryCallback()
{
@Override
public boolean reportFixture(Fixture fixture)
{
if(fixture.testPoint(testPoint.x, testPoint.y))
{
hitBody=fixture.getBody();
return false;
}
else
{
return true;
}
}
};
@Override
public 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();
@Override
public 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;
}
@Override
public boolean touchMoved(int arg0, int arg1)
{
return false;
}
@Override
public 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
{
@Override
protected 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);
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initialize(new MyGameListen(), false);
}
}
我大概也就只能解释那么多了。。。能力有限。等学得在深入点,我再修改下,解释的更详细点。