原文链接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);
}
}
我大概也就只能解释那么多了。。。能力有限。等学得在深入点,我再修改下,解释的更详细点。
分享到:
相关推荐
libgdx之TTF字库的使用
libgdx之演员与演出
Libgdx开发丛书之 Learning LibGDX Game Development, 2nd Edition
libgdx 原生不支持中文输入,于是另辟蹊跷使用本地化组件实现中文输入。
android游戏源码 libgdx引擎
libgdx——游戏音效
libgdx Music 音乐播放
libgdx TexturePackerTest
libgdx JSON
libgdx Preference
libgdx 配置文件
libgdx——UI控件
libgdx net的使用
libgdx FullScreen&vsync
libgdx 照相机的使用
libgdx Skin类的使用
libgdx JSON(2)
libGdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C++语言编写而成。 特点开源的游戏框架并不少见,但是libgdx的优势是相当明显的,主要是体现在以下几个方面 极强兼容性 libgdx兼容多种平台系统(Windows、...
libgdx 资源加载器