package com.joye3g.joint;
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.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.joints.MouseJoint;
import com.badlogic.gdx.physics.box2d.joints.MouseJointDef;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.EdgeShape;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.World;
import com.joye3g.joint.util.Transform;
public class MouseJointDemo implements ApplicationListener, InputProcessor{
private Box2DDebugRenderer renderer;
private OrthographicCamera camera;
private static final float PXTM = 30;
private Body mCircle1;
private World mWorld;
private MouseJoint mouseJoint;
private Body mGroupBody;
private float screenWidth, screenHeight;
@Override
public void create() {
screenWidth = Gdx.graphics.getWidth();
screenHeight = Gdx.graphics.getHeight();
renderer = new Box2DDebugRenderer();
camera = new OrthographicCamera(screenWidth / PXTM, screenHeight / PXTM);
mWorld = new World(new Vector2(0f, -5f), true);
//绘制四面墙
float x = screenWidth / PXTM;
float y = screenHeight / PXTM;
BodyDef edgeBodyDef = new BodyDef();
edgeBodyDef.position.set(-x / 2, -y / 2);
edgeBodyDef.type = BodyType.StaticBody;
mGroupBody = mWorld.createBody(edgeBodyDef);
EdgeShape edge = new EdgeShape();
FixtureDef edgeShapeDef = new FixtureDef();
edgeShapeDef.shape = edge;
edge.set(new Vector2(0f, 0f), new Vector2(x, 0f));
mGroupBody.createFixture(edgeShapeDef);
edge.set(new Vector2(x, 0f), new Vector2(x, y));
mGroupBody.createFixture(edgeShapeDef);
edge.set(new Vector2(x, y), new Vector2(0, y));
mGroupBody.createFixture(edgeShapeDef);
edge.set(new Vector2(0, y), new Vector2(0, 0));
mGroupBody.createFixture(edgeShapeDef);
//绘制一个半径为1米的圆形
BodyDef mCircleBodyDef1 = new BodyDef();
mCircleBodyDef1.type = BodyType.DynamicBody;
//圆形的位置在屏幕(60,190)的位置
Vector2 vector1 = Transform.ptm(60f, 190f, screenWidth, screenHeight, 0f, 0f, PXTM);
mCircleBodyDef1.position.set(vector1);
mCircle1 = mWorld.createBody(mCircleBodyDef1);
CircleShape mCircleShape1 = new CircleShape();
mCircleShape1.setRadius(1f);
FixtureDef mCircleFix1 = new FixtureDef();
mCircleFix1.shape = mCircleShape1;
mCircleFix1.density = 1.0f;
mCircle1.createFixture(mCircleFix1);
Gdx.input.setInputProcessor(this);
}
@Override
public void resize(int width, int height) {
}
@Override
public void render() {
GL10 gl=Gdx.graphics.getGL10();
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
mWorld.step(Gdx.graphics.getDeltaTime(), 8, 6);
renderer.render(mWorld, camera.combined);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
@Override
public boolean keyDown(int keycode) {
return false;
}
@Override
public boolean keyUp(int keycode) {
return false;
}
@Override
public boolean keyTyped(char character) {
return false;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
//当按下时,如果鼠标关节为空,则实例化一个鼠标关节
if(mouseJoint == null){
MouseJointDef mouseJointDef = new MouseJointDef();
mouseJointDef.bodyA = mGroupBody;
mouseJointDef.bodyB = mCircle1;
mouseJointDef.maxForce = 100f;//拉力
mouseJointDef.collideConnected = true;
//设置关节点为圆的圆心
mouseJointDef.target.x = mCircle1.getPosition().x;
mouseJointDef.target.y = mCircle1.getPosition().y;
mouseJoint = (MouseJoint) mWorld.createJoint(mouseJointDef);
}
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
//当抬起时,如果鼠标关节不为空,则销毁关节
if(mouseJoint != null){
mWorld.destroyJoint(mouseJoint);
mouseJoint = null;
}
System.out.println(screenX + ":" + screenY);
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
if(mouseJoint != null){
//将坐标点进行转换并设置给鼠标关节
Vector2 vector2 = Transform.ptm(screenX, screenHeight - screenY, screenWidth, screenHeight, 0, 0, PXTM);
mouseJoint.setTarget(vector2);
}
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
return false;
}
@Override
public boolean scrolled(int amount) {
return false;
}
}
package com.joye3g.joint.util;
import com.badlogic.gdx.math.Vector2;
public class Transform {
/**
* @param x_px 图片所在x坐标
* @param y_px 图片所在y坐标
* @param screenWidth 屏幕宽度
* @param screenHeight 屏幕高度
* @param width_px 图片宽度
* @param height_px 图片高度
* @param scale 缩放比例
* @return (x,y)直接设置为body的position可使body与图片重合
*/
public static Vector2 ptm(float x_px, float y_px, float screenWidth, float screenHeight, float width_px, float height_px, float scale){
Vector2 vector2 = new Vector2();
vector2.x = -(screenWidth - x_px * 2 - width_px) / scale / 2;
vector2.y = -(screenHeight - y_px * 2 - height_px) / scale / 2;
return vector2;
}
/**
* @param x_m body所在x坐标
* @param y_m body所在y坐标
* @param screenWidth 屏幕宽度
* @param screenHeight 屏幕高度
* @param wh (x,y)body的宽高
* @param scale 缩放比例
* @return (x,y)直接设置为图片的position可使图片与body重合
*/
public static Vector2 mtp(float x_m, float y_m, float screenWidth, float screenHeight, Vector2 wh, float scale){
Vector2 vector2 = new Vector2();
vector2.x = x_m * scale + screenWidth / 2 - wh.x * scale;
vector2.y = y_m * scale + screenHeight / 2 - wh.y * scale;
return vector2;
}
}