碰撞后如何使两个物体粘在一起?

How to make two bodies stick after a collision?(碰撞后如何使两个物体粘在一起?)
本文介绍了碰撞后如何使两个物体粘在一起?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我真的被困在这我可以成功检测到碰撞,但我不能让参与碰撞的两个物体粘在一起.

I am really stuck on this I can successfully detect a collision but I can't make the two bodies involved in the collision to stick.

这是我的ContactListener

world.setContactListener(listener);

    listener = new ContactListener() {

        @Override
        public void preSolve(Contact contact, Manifold oldManifold) {

        }


        @Override
        public void postSolve(Contact contact, ContactImpulse impulse) {

        }

        //called when two fixtures cease to touch
        @Override
        public void endContact(Contact contact) {
            Fixture fixtureA = contact.getFixtureA();
            Fixture fixtureB = contact.getFixtureB();
            Gdx.app.log("beginContact", "between" + fixtureA.toString() + "and" + fixtureB.toString());
        }

        //called when two fixtures begin to touch
        @Override
        public void beginContact(Contact contact) {
            Fixture fixtureA = contact.getFixtureA();
            Fixture fixtureB = contact.getFixtureB();
            Gdx.app.log("beginContact", "between" + fixtureA.toString() + "and" + fixtureB.toString());
        }
    };

这也是我直接在 world.step() 行之后放入我的 render() 的内容

Also this is what I put in my render() straight after the world.step() line

int numContacts = world.getContactCount();

    if(numContacts > 0)
    {
        Gdx.app.log("contact", "start of contact list");
        for(Contact contact: world.getContactList())
        {
            Fixture fixtureA = contact.getFixtureA();
            Fixture fixtureB = contact.getFixtureB();
            Gdx.app.log("contact", "between" + fixtureA.toString() + "and" + fixtureB.toString());
        }
        Gdx.app.log("contact", "end of contact list");
    }

我非常困惑于解决后或预解决的问题.我跟着 iforce2d 粘弹 http://www.iforce2d.net/b2dtut/sticky-projectiles 但我不懂 C++,而且在 Eclipse 中工作时遇到很多语法错误.请有人给我看一个工作碰撞的示例代码,请在java中碰撞后身体粘在一起.

I am extremely stuck on what to put on post solve or pre-solve really confused. I followed the iforce2d sticky projectiles http://www.iforce2d.net/b2dtut/sticky-projectiles but I don't understand C++ and i get a lot of syntax errors when working in eclipse. Please can someone show me an example code of a working collision where bodies stick together after colliding in java please.

推荐答案

这就是你如何创建一个 WeldJoint 与 libgdx 包装器:

This is how you create a WeldJoint with the libgdx wrapper:

WeldJointDef wd = new WeldJointDef();
wd.bodyA = body1;
wd.bodyB = body2;
wd.referenceAngle = wd.bodyB.getAngle() - wd.bodyA.getAngle();
world.createJoint( wd );

不要尝试在 ContactListener 中创建关节.将要粘合的物体添加到列表中,并在 world.step 之后检查它们.

Do not try to create Joints inside the ContactListener. Add the bodies to be glued to a list and check them just after world.step.

好的,就像在 iforce2d 教程中一样,创建一个包含 2 个主体的对象:

Ok, like in the iforce2d tutorial,create an object to contain 2 bodies:

public class StickyInfo{
    Body bodyA;
    Body bodyB;
    public StickyInfo(Body bodyA, Body bodyB){
        this.bodyA = bodyA;
        this.bodyB = bodyB;
    }
};

然后创建一个 libgdx 数组 StickyInfo 的

Then create a libgdx Array of StickyInfo's

Array<StickyInfo> collisionsToMakeSticky = new Array<StickyInfo>();

当物体发生碰撞时(嗯,从技术上讲,它们的固定装置),将它们添加到此列表中:

When the bodies collide (well, technically their fixtures), add them to this list:

collisionsToMakeSticky.add(new StickyInfo(body1, body2))

然后在 world.step 之后,如果 Array 不为空.创建焊接接头:

And then just after world.step, if the Array is not empty. Create the WeldJoints:

while(collisionsToMakeSticky.size>0){
    StickyInfo si = collisionsToMakeSticky.removeIndex(0);
    //Make the WeldJoint with the bodies si.bodyA and si.bodyB
}

这篇关于碰撞后如何使两个物体粘在一起?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)