java - 使用textureRegion绘图

标签 java box2d libgdx

我正在尝试使用 libgdx 和 box2d 用 java 制作一辆可移动的汽车; 我制作了一辆汽车,m_car,位置设置在汽车的中间。 在每一步中,我都会获取 m_car 的当前位置,并随着汽车的宽度/高度减小该值,因此我得到了左下角。当在笔直的地面上时,它显示得很好,纹理位于应该在的位置,但是本地面有角度时,纹理位于汽车的下方或上方。 我不明白TextureRegion是如何工作的,我认为当角度不为0时,我没有很好地绘图,并且我不知道如何解决它。请帮助我:) 泰。

编辑:

我的代码一团糟,它不是一个实际的项目,它是一个想法,我把它们分成几部分,然后把它们放下来看看它们是如何工作的,所以当我开始项目时,我会知道该怎么做,这就是我的汽车声明:

private void car2(){
    m_hz = 5.0f;
    m_zeta = 0.7f;
    m_speed = 50.0f;
    BodyDef bd = new BodyDef();
    bd.type = BodyType.DynamicBody;
    part1(bd);
    part2(bd);
    part3(bd);
    wheels(bd);
    m_car.setAwake(true);
}

private void part3(BodyDef bd) {
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(0.01f, 0.35f,new Vector2(1.01f - 3, 4.85f - 4), 0);
    m_car.createFixture(shape, 1.0f);
}

private void part1(BodyDef bd){
    PolygonShape chassis = new PolygonShape();
    Vector2 vertices[] = new Vector2[6];
    vertices[0] = new Vector2(-2, -0.5f);
    vertices[1] = new Vector2(-2, 0.5f);
    vertices[2] = new Vector2(1.25f, 0.5f);
    vertices[3] = new Vector2(2.5f, 0.15f);
    vertices[4] = new Vector2(2.5f, -0.5f);
    vertices[5] = new Vector2(-2, -0.5f);

    chassis.set(vertices);
    bd.position.set(new Vector2(3, 4));
    m_car = m_world.createBody(bd);
    m_car.createFixture(chassis, 1.0f);
}

private void part2(BodyDef bd){
    PolygonShape chassis = new PolygonShape();
    Vector2 vertices[] = new Vector2[5];
    vertices[0] = new Vector2(3, 4.5f);
    vertices[1] = new Vector2(3, 5.25f);
    vertices[2] = new Vector2(3.80f, 5.25f);
    vertices[3] = new Vector2(4.25f, 4.5f);
    vertices[4] = new Vector2(3, 4.5f);
    for (int i = 0; i < 5; ++ i){
        vertices[i].x -= 3;
        vertices[i].y -= 4;
    }
    chassis.set(vertices);
    //m_car = m_world.createBody(bd);
    m_car.createFixture(chassis, 1.0f);         
}

private void wheels(BodyDef bd){

      CircleShape circle = new CircleShape();
      circle.setRadius(0.4f);

      FixtureDef fd = new FixtureDef();
      fd.shape = circle;
      fd.density = 1.0f;
      fd.friction = 0.9f;

      bd.position.set(2f, 3.5f);
      m_wheel1 = m_world.createBody(bd);
      m_wheel1.createFixture(fd);

      bd.position.set(4.5f, 3.5f);
      m_wheel2 = m_world.createBody(bd);
      m_wheel2.createFixture(fd);

      WheelJointDef jd = new WheelJointDef();
      Vector2 axis = new Vector2(1.0f, 0.5f);


      jd.initialize(m_car, m_wheel1, m_wheel1.getPosition(), axis);
      jd.motorSpeed = 0.0f;
      jd.maxMotorTorque = 20.0f;
      jd.enableMotor = true;
      jd.frequencyHz = m_hz;
      jd.dampingRatio = m_zeta;
      m_spring1 = (WheelJoint) m_world.createJoint(jd);

      jd.initialize(m_car, m_wheel2, m_wheel2.getPosition(), axis);
      jd.motorSpeed = 0.0f;
      jd.maxMotorTorque = 10.0f;
      jd.enableMotor = false;
      jd.frequencyHz = m_hz;
      jd.dampingRatio = m_zeta;
      m_spring2 = (WheelJoint) m_world.createJoint(jd);     
}

一些解释:为什么我要让顶点减少 3 和 4 ?我不知道如果我将位置设置为 bodydef,顶点会认为该点为 0, 0,当我发现时,对我来说更容易减少(因为它只是为了测试,看看它是如何工作的)

这就是我画画的方式:

 float angle = (float) Math.toDegrees(m_car.getAngle());
 batch.draw(textureRegion, x, y, 3f, 4f, 
    4.5f, 2.75f, 1f, 0.61f, angle);

最佳答案

对于 Box2D 中的真实汽车,您可能会发现这很有用:http://www.iforce2d.net/b2dtut/top-down-car

关于角度问题:您需要将汽车的角度提供给 spriteBatch。 TextureRegion 不知道它应该在哪里或如何渲染。您需要告诉 spriteBatch 这些信息。

您可以使用 Sprite 来实现这一点。可以使用 setRotation(), setPosition() 来操作 Sprite等等,然后用 Sprite.draw(spriteBatch) 绘制而不是`spriteBatch.draw(sprite)

此外,请小心您的 PIXEL_TO_METER 转换,并记得正确更新您的相机。

关于java - 使用textureRegion绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18356284/

相关文章:

java - 安卓单元测试 : mocking System. currentTimeMillis()

java - libgdx (Ashley Framework ECS) - 系统与另一个系统对话的正确方式是什么?

java - Libgdx批量绘制不可见纹理

screen - LibGdx-屏幕之间的过渡

java - Box2D - 不能破坏多个固定装置

java - libgdx shaperenderer 如何围绕其中心旋转矩形?

java - 在 Tomcat 7 上运行 Framework 2.2.2 - 删除 BoneCP

java - 我们能否从 java.security.KeyStore 对象及其 key 对和证书中提取特定别名,然后注入(inject)到新的 java.security.KeyStore 对象中?

java - 在 JavaScript 中将函数作为字符串传递

ios - 从 'const b2Shape*' 到 'b2PolygonShape*' 的动态转换会放弃限定符吗?