LibGdx--GearJoint齿轮关节

来源:互联网 发布:泡泡堂 for mac 编辑:程序博客网 时间:2024/04/27 17:47
package com.joye3g.joint;import com.badlogic.gdx.ApplicationListener;import com.badlogic.gdx.Gdx;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.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.badlogic.gdx.physics.box2d.joints.GearJointDef;import com.badlogic.gdx.physics.box2d.joints.RevoluteJoint;import com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef;import com.joye3g.joint.util.Transform;public class GearJointDemo implements ApplicationListener{private Box2DDebugRenderer renderer;private OrthographicCamera camera;private static final float PXTM = 30;private World mWorld;@Overridepublic void create() {float screenWidth = Gdx.graphics.getWidth();float screenHeight = Gdx.graphics.getHeight();renderer = new Box2DDebugRenderer();camera = new OrthographicCamera(screenWidth / PXTM, screenHeight / PXTM);mWorld = new World(new Vector2(0f, 0f), true);//绘制地面BodyDef bodyDef = new BodyDef();bodyDef.type = BodyType.StaticBody;bodyDef.position.set(-screenWidth / PXTM / 2, -screenHeight / PXTM / 2);Body mGroupBody = mWorld.createBody(bodyDef);EdgeShape edgeShape = new EdgeShape();edgeShape.set(new Vector2(0f, 1f), new Vector2(screenWidth / PXTM, 1f));FixtureDef fixtureDef = new FixtureDef();fixtureDef.shape = edgeShape;mGroupBody.createFixture(fixtureDef);//绘制一个半径为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);Body mCircle1 = mWorld.createBody(mCircleBodyDef1);CircleShape mCircleShape1 = new CircleShape();mCircleShape1.setRadius(1f);FixtureDef mCircleFix1 = new FixtureDef();mCircleFix1.shape = mCircleShape1;mCircleFix1.density = 3.0f;mCircle1.createFixture(mCircleFix1);//绘制一个半径为1米的圆形BodyDef mCircleBodyDef2 = new BodyDef();mCircleBodyDef2.type = BodyType.DynamicBody;//圆形的位置在屏幕(200,190)的位置Vector2 vector2 = Transform.ptm(200f, 190f, screenWidth, screenHeight, 0f, 0f, PXTM);mCircleBodyDef2.position.set(vector2);Body mCircle2 = mWorld.createBody(mCircleBodyDef2);CircleShape mCircleShape2 = new CircleShape();mCircleShape2.setRadius(1f);FixtureDef mCircleFix2 = new FixtureDef();mCircleFix2.shape = mCircleShape2;mCircleFix2.density = 3.0f;mCircle2.createFixture(mCircleFix2);//创建一个旋转关节RevoluteJointDef revoluteJointDef = new RevoluteJointDef();revoluteJointDef.initialize(mGroupBody, mCircle1, mCircle1.getWorldCenter());revoluteJointDef.maxMotorTorque = 20f;//马达的预期最大扭矩revoluteJointDef.motorSpeed = 50f;//马达的最终扭矩revoluteJointDef.enableMotor = true;//启动马达RevoluteJoint revoluteJoint1 = (RevoluteJoint) mWorld.createJoint(revoluteJointDef);//创建一个旋转关节RevoluteJointDef revoluteJointDef2 = new RevoluteJointDef();revoluteJointDef2.initialize(mGroupBody, mCircle2, mCircle2.getWorldCenter());RevoluteJoint revoluteJoint2 = (RevoluteJoint) mWorld.createJoint(revoluteJointDef2);//创建一个齿轮关节,mCircle1为驱动的Body,mCircle2为被驱动的BodyGearJointDef gearJointDef = new GearJointDef();gearJointDef.bodyA = mCircle1;gearJointDef.bodyB = mCircle2;gearJointDef.joint1 = revoluteJoint1;gearJointDef.joint2 = revoluteJoint2;gearJointDef.ratio = 1f;mWorld.createJoint(gearJointDef);}@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() {}}
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;}}


原创粉丝点击