LibGdx--MouseJoint鼠标关节

来源:互联网 发布:东莞长安网络推广培训 编辑:程序博客网 时间:2024/04/27 15:43
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;@Overridepublic 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);}@Overridepublic void resize(int width, int height) {}@Overridepublic 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);}@Overridepublic void pause() {}@Overridepublic void resume() {}@Overridepublic void dispose() {}@Overridepublic boolean keyDown(int keycode) {return false;}@Overridepublic boolean keyUp(int keycode) {return false;}@Overridepublic boolean keyTyped(char character) {return false;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic boolean mouseMoved(int screenX, int screenY) {return false;}@Overridepublic 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_mbody所在x坐标 * @param y_mbody所在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;}}


原创粉丝点击