簡體   English   中英

帶有Box2D裝載機的自行車車輪接頭的libGdx

[英]libGdx with Box2D loader bicycle wheel joint

我在Box2D物理編輯器中使用libGdx框架。 我不知道怎么了。 為什么我不能正確地將車輪連接至底盤。 車輪不支撐底盤。 為失誤抱歉。 這里的圖片。 我得到什么:

 <img src='http://s4.postimg.org/a0d6ujpjt/test.jpg' border='0' alt="test" /> 

我的應用程序代碼:

package com.ernestyno.test;

import com.ernestyno.text.bodyeditorloader.BodyEditorLoader;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
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.CircleShape;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.physics.box2d.joints.WheelJoint;
import com.badlogic.gdx.physics.box2d.joints.WheelJointDef;

public class Dviratis extends InputAdapter {
private World world;
private float x, y, width;

private Body dviracioRemasBody, kairysRatasBody, desinysRatasBody;
private WheelJoint kairysRatasJoint, desinysRatasJoint;
private Vector2 dviracioRemasOrigin, ratasOrigin;
private Sprite remasSprite, kairysRatasSprite, desinysRatasSprite;
private Texture remasTexture, ratasTexture;

//FIXTURES
private FixtureDef dviracioRemasFixture, dviracioRatoFixture;

private float
//REMAS FIXTURE DUOMENYS
REMAS_DENSITY       = 5f,
REMAS_FRICTION      = .4f,
REMAS_RESTITUTION   = .3f,

//RATU FIXTURE DUOMENYS
RATAS_DENSITY       = REMAS_DENSITY * 1.5f,
RATAS_FRICTION      = 50f,
RATAS_RESTITUTION   = .4f;

private String 
BODY_EDITOR_FILE        = "json/dviratis.json",
BODY_EDITOR_REMAS_NAME  = "DviracioRemas",
BODY_EDITOR_RATAS_NAME  = "ratas";

public Dviratis(World world, float x, float y, float width) {
    this.world = world;
    this.x = x;
    this.y = y;
    this.width = width;

    this.setFixture();
    this.setSprite();
    this.setBody();
}

public void setFixture() {
    this.dviracioRemasFixture               = new FixtureDef();
    this.dviracioRatoFixture                = new FixtureDef();

    this.dviracioRemasFixture.density       = this.REMAS_DENSITY;
    this.dviracioRemasFixture.friction      = this.REMAS_FRICTION;
    this.dviracioRemasFixture.restitution   = this.REMAS_RESTITUTION;

    this.dviracioRatoFixture.density        = this.RATAS_DENSITY;
    this.dviracioRatoFixture.friction       = this.RATAS_FRICTION;
    this.dviracioRatoFixture.restitution    = this.RATAS_RESTITUTION;
}

public void setSprite() {
    this.remasTexture = new Texture(Gdx.files.internal("json/dviracio_remas.png"));
    this.remasTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
    this.remasSprite = new Sprite(this.remasTexture);
    this.remasSprite.setSize(this.width, this.width * this.remasSprite.getHeight() / this.remasSprite.getWidth());

    this.ratasTexture = new Texture(Gdx.files.internal("json/dviracio_ratas.png"));
    this.ratasTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
    this.desinysRatasSprite = new Sprite(this.ratasTexture);
    this.desinysRatasSprite.setSize(this.width / 3, this.width / 3);

    this.kairysRatasSprite = new Sprite(this.ratasTexture);
    this.kairysRatasSprite.setSize(this.width / 3, this.width / 3);
}

public void setBody() {
    BodyDef bodyDef = new BodyDef();
    BodyEditorLoader loader = new BodyEditorLoader(Gdx.files.internal(this.BODY_EDITOR_FILE));

    bodyDef.type = BodyType.DynamicBody;
    bodyDef.position.set(this.x, this.y);

    this.dviracioRemasBody = this.world.createBody(bodyDef);
    loader.attachFixture(this.dviracioRemasBody, this.BODY_EDITOR_REMAS_NAME, this.dviracioRemasFixture, this.width);
    this.dviracioRemasOrigin = loader.getOrigin(this.BODY_EDITOR_REMAS_NAME, this.width).cpy();

    this.desinysRatasBody = this.world.createBody(bodyDef);
    loader.attachFixture(this.desinysRatasBody, this.BODY_EDITOR_RATAS_NAME, this.dviracioRatoFixture, this.width / 3);

    this.kairysRatasBody = this.world.createBody(bodyDef);
    loader.attachFixture(this.kairysRatasBody, this.BODY_EDITOR_RATAS_NAME, this.dviracioRatoFixture, this.width / 3);

    this.ratasOrigin = loader.getOrigin(this.BODY_EDITOR_RATAS_NAME, this.width).cpy();

    //masinos kairio rato susiejimas prie masinos kuno
    WheelJointDef axisDef = new WheelJointDef();
    axisDef.bodyA = this.dviracioRemasBody;
    axisDef.bodyB = this.desinysRatasBody;
    //nuo centro ratu susiejimo atittraukimas i x ir y pozicija
    axisDef.localAnchorA.set(0.73f, -0.45f);
    axisDef.localAnchorB.set(0f, 0f);
    axisDef.localAxisA.set(Vector2.Y); //Vector2.Y = new Vector2(0, 1); - ratu amortizacija y asije, o ne x asije

    this.desinysRatasJoint = (WheelJoint) world.createJoint(axisDef);

    axisDef.bodyB = this.kairysRatasBody;
    axisDef.localAnchorA.set(-1f, -0.45f);
    axisDef.frequencyHz = this.dviracioRemasFixture.density; //amortizatoriaus galia
    axisDef.maxMotorTorque = this.dviracioRemasFixture.density * 10; //variklio galia

    this.kairysRatasJoint = (WheelJoint) world.createJoint(axisDef);
}

public void render() {
    Vector2 pozicija = this.dviracioRemasBody.getPosition().sub(this.dviracioRemasOrigin);

    this.remasSprite.setPosition(pozicija.x, pozicija.y);
    this.remasSprite.setOrigin(this.dviracioRemasOrigin.x, this.dviracioRemasOrigin.y);
    this.remasSprite.setRotation(this.dviracioRemasBody.getAngle() * MathUtils.radiansToDegrees);

    pozicija = this.desinysRatasBody.getPosition().sub(this.ratasOrigin);

    this.desinysRatasSprite.setPosition(pozicija.x, pozicija.y);
    this.desinysRatasSprite.setOrigin(this.ratasOrigin.x, this.ratasOrigin.y);
    this.desinysRatasSprite.setRotation(this.desinysRatasBody.getAngle() * MathUtils.radiansToDegrees);

    pozicija = this.kairysRatasBody.getPosition().sub(this.ratasOrigin);

    this.kairysRatasSprite.setPosition(pozicija.x, pozicija.y);
    this.kairysRatasSprite.setOrigin(this.ratasOrigin.x, this.ratasOrigin.y);
    this.kairysRatasSprite.setRotation(this.kairysRatasBody.getAngle() * MathUtils.radiansToDegrees);
}

public void draw(SpriteBatch batch) {
    this.remasSprite.draw(batch);
    this.desinysRatasSprite.draw(batch);
    this.kairysRatasSprite.draw(batch);
}

public Body getRemas() {
    return dviracioRemasBody;
}

public Body getDviracioRemasBody() {
    return dviracioRemasBody;
}
}

嗯...我發現了問題所在。 程序“ physics-body-editor”在.json文件中生成了錯誤的圓心位置。 坐標是cx和cy。 因此,我替換了BodyEditorLoader.java文件。 創建了另一個attachFixture()方法,該方法允許您描述另一個圓坐標。

代替圈子:

loader.attachFixture(this.desinysRatasBody, this.BODY_EDITOR_RATAS_NAME, this.dviracioRatoFixture, this.width / 3);

采用:

loader.attachFixture(this.desinysRatasBody, this.BODY_EDITOR_RATAS_NAME, this.dviracioRatoFixture, this.width / 3, new Vector2(0,0));

如果需要,可以下載BodyEditorLoader文件

現在我的車輪處於正確的位置。 結果圖片

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM