[LIBGDX学习]LibGDX代码详解(三十三)Bullet 连线

这篇博客详细介绍了如何在LibGDX游戏中使用Bullet库创建点到点的约束,通过创建静态和动态物体,应用btPoint2PointConstraint来连接它们,从而实现物体之间的相互作用和运动模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.Material;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.bullet.dynamics.btDynamicsWorld;
import com.badlogic.gdx.physics.bullet.dynamics.btPoint2PointConstraint;
import com.badlogic.gdx.physics.bullet.dynamics.btRigidBody;
import com.badlogic.gdx.physics.bullet.dynamics.btTypedConstraint;
import com.badlogic.gdx.utils.Array;

/** @author xoppa */
public class ConstraintsTest extends BaseBulletTest {

    final Array<btTypedConstraint> constraints = new Array<btTypedConstraint>();

    @Override
    public void create () {
        super.create();

        final Model barModel = modelBuilder.createBox(10f, 1f, 1f, new Material(new ColorAttribute(ColorAttribute.Diffuse,
                Color.WHITE)), Usage.Position | Usage.Normal);
        disposables.add(barModel);
        world.addConstructor("bar", new BulletConstructor(barModel, 0f)); // mass = 0: static body

        // Create the entities
        world.add("ground", 0f, 0f, 0f).setColor(0.25f + 0.5f * (float)Math.random(), 0.25f + 0.5f * (float)Math.random(),
                0.25f + 0.5f * (float)Math.random(), 1f);

        BulletEntity bar = world.add("bar", 0f, 7f, 0f);
        bar.setColor(0.75f + 0.25f * (float)Math.random(), 0.75f + 0.25f * (float)Math.random(),
                0.75f + 0.25f * (float)Math.random(), 1f);

        //BulletEntity box1 = world.add("box", -4.5f, 6f, 0f);
        BulletEntity box1 = world.add("box", -50.5f, 6f, 0f);
        box1.setColor(0.5f + 0.5f * (float)Math.random(), 0.5f + 0.5f * (float)Math.random(), 0.5f + 0.5f * (float)Math.random(),
                1f);
        btPoint2PointConstraint constraint = new btPoint2PointConstraint((btRigidBody)bar.body, (btRigidBody)box1.body,
                tmpV1.set(-7, -0.5f, -0.5f), tmpV2.set(-0.5f, 0.5f, -0.5f));
/*        btPoint2PointConstraint constraint = new btPoint2PointConstraint((btRigidBody)bar.body, (btRigidBody)box1.body,
                tmpV1.set(-5, -0.5f, -0.5f), tmpV2.set(-0.5f, 0.5f, -0.5f));*/
        ((btDynamicsWorld)world.collisionWorld).addConstraint(constraint, false);
        constraints.add(constraint);
        BulletEntity box2 = null;
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) {
                box2 = world.add("box", -3.5f + (float)i, 6f, 0f);
                box2.setColor(0.5f + 0.5f * (float)Math.random(), 0.5f + 0.5f * (float)Math.random(),
                        0.5f + 0.5f * (float)Math.random(), 1f);
                constraint = new btPoint2PointConstraint((btRigidBody)box1.body, (btRigidBody)box2.body, tmpV1.set(0.5f, -0.5f,
                        0.5f), tmpV2.set(-0.5f, -0.5f, 0.5f));
            } else {
                box1 = world.add("box", -3.5f + (float)i, 6f, 0f);
                box1.setColor(0.5f + 0.5f * (float)Math.random(), 0.5f + 0.5f * (float)Math.random(),
                        0.5f + 0.5f * (float)Math.random(), 1f);
/*                constraint = new btPoint2PointConstraint((btRigidBody)box2.body, (btRigidBody)box1.body, tmpV1.set(0.5f, 0.5f,
                        -0.5f), tmpV2.set(-0.5f, 0.5f, -0.5f));*/
                constraint = new btPoint2PointConstraint((btRigidBody)box2.body, (btRigidBody)box1.body, tmpV1.set(2f, 0.5f,
                        -0.5f), tmpV2.set(-0.5f, 0.5f, -0.5f));
            }
            ((btDynamicsWorld)world.collisionWorld).addConstraint(constraint, false);
            constraints.add(constraint);
        }
        /*constraint = new btPoint2PointConstraint((btRigidBody)bar.body, (btRigidBody)box1.body, tmpV1.set(5f, -0.5f, -0.5f),
                tmpV2.set(0.5f, 0.5f, -0.5f));*/
        constraint = new btPoint2PointConstraint((btRigidBody)bar.body, (btRigidBody)box1.body, tmpV1.set(7f, -0.5f, -0.5f),
                tmpV2.set(0.5f, 0.5f, -0.5f));
        ((btDynamicsWorld)world.collisionWorld).addConstraint(constraint, false);
        constraints.add(constraint);
    }

    @Override
    public void dispose () {
        for (int i = 0; i < constraints.size; i++) {
            ((btDynamicsWorld)world.collisionWorld).removeConstraint(constraints.get(i));
            constraints.get(i).dispose();
        }
        constraints.clear();
        super.dispose();
    }

    @Override
    public boolean tap (float x, float y, int count, int button) {
        shoot(x, y);
        return true;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值