私はちょうどLibgdxのBox2d Engineで作業を始めましたが、Contactlisterのメソッドを呼び出す必要があるときは分かりません。一方では「開始連絡先」と他方の「終了連絡先」にあります。私はそれらを呼び出す必要があります、特定の什器の数を他の人に触れるには?そして、私はコンタクトリストを実装するにはどうしたらいいですか? チュートリアルへのリダイレクトは私の質問に答えるでしょう。私はGoogleを検索している間は何も見つかりませんでした。 このoneは私を大いに助けましたが、C++用に書かれており、実装をメインのgamecircleには言及していません。 私を助けるThx)libgdx contactlistenerの使い方
9
A
答えて
16
ここにlibgdxの短い例があります。 ContactListenerを作成して、連絡先が作成されたときにどの什器が関与しているかを示す方法を示します。また、world.getContactList()の使用方法を示しています。これは、物理ステップの後にまだ存在する連絡先のリストを返します。これにより、物理ステップの過程で作成され、壊れたコンタクトが失われる可能性があります。これらに興味がある場合はContactListenerを実装し、beginContact()を使用して連絡先を検出し、endContact()が壊れていることを検出する必要があります。
package hacks;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
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.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.Contact;
import com.badlogic.gdx.physics.box2d.ContactImpulse;
import com.badlogic.gdx.physics.box2d.ContactListener;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.Manifold;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;
public class Box2DDemoMain extends com.badlogic.gdx.Game {
private static final float SCALING = 0.1f;
private Box2DDebugRenderer debugRenderer;
private OrthographicCamera camera;
private World world;
@Override
public void create() {
debugRenderer = new Box2DDebugRenderer();
camera = new OrthographicCamera();
createWorld();
createCollisionListener();
createGround();
createBox();
}
private void createWorld() {
Vector2 gravity = new Vector2(0, -10);
world = new World(gravity, true);
}
private void createCollisionListener() {
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
Fixture fixtureA = contact.getFixtureA();
Fixture fixtureB = contact.getFixtureB();
Gdx.app.log("beginContact", "between " + fixtureA.toString() + " and " + fixtureB.toString());
}
@Override
public void endContact(Contact contact) {
Fixture fixtureA = contact.getFixtureA();
Fixture fixtureB = contact.getFixtureB();
Gdx.app.log("endContact", "between " + fixtureA.toString() + " and " + fixtureB.toString());
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
}
private void createGround() {
PolygonShape groundShape = new PolygonShape();
groundShape.setAsBox(50, 1);
BodyDef groundBodyDef = new BodyDef();
groundBodyDef.type = BodyType.StaticBody;
groundBodyDef.position.set(0, -20);
Body groundBody = world.createBody(groundBodyDef);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = groundShape;
groundBody.createFixture(fixtureDef);
groundShape.dispose();
}
private void createBox() {
PolygonShape boxShape = new PolygonShape();
boxShape.setAsBox(1, 1);
BodyDef boxBodyDef = new BodyDef();
boxBodyDef.position.set(0, 20);
boxBodyDef.angle = MathUtils.PI/32;
boxBodyDef.type = BodyType.DynamicBody;
boxBodyDef.fixedRotation = false;
Body boxBody = world.createBody(boxBodyDef);
FixtureDef boxFixtureDef = new FixtureDef();
boxFixtureDef.shape = boxShape;
boxFixtureDef.restitution = 0.75f;
boxFixtureDef.density = 2.0f;
boxBody.createFixture(boxFixtureDef);
boxShape.dispose();
}
@Override
public void resize(int width, int height) {
super.resize(width, height);
float cameraWidth = Gdx.graphics.getWidth() * SCALING;
float cameraHeight = Gdx.graphics.getHeight() * SCALING;
camera.setToOrtho(false, cameraWidth, cameraHeight);
camera.position.set(0, 0, 0);
}
@Override
public void render() {
super.render();
world.step(Gdx.graphics.getDeltaTime(), 8, 3);
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");
}
Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
debugRenderer.render(world, camera.combined);
}
public static void main(String[] args) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.title = Box2DDemoMain.class.getName();
config.width = 800;
config.height = 480;
config.fullscreen = false;
config.useGL20 = true;
config.useCPUSynch = true;
config.forceExit = true;
config.vSyncEnabled = true;
new LwjglApplication(new Box2DDemoMain(), config);
}
}
4
これらのメソッドをどこにでも呼び出す必要はありません。クラスを作成し、そこにContactListenerを実装するだけです。今すぐあなたのコードでworld.setContactListener(ContactListener listener)を使用してください。
あなたの世界で衝突が発生するたびに、4つのメソッドすべてが呼び出されます。 2台の衝突体のフィクスチャAとフィクスチャBを取得します
関連する問題
- 1. libgdx衝突のないContactListener
- 2. LibGDXでContactListenerを使う適切な方法
- 3. Libgdx box2d ContactListenerは非常にglitchyです
- 4. なぜLibgdx BulletのContactListener派生クラスの配列サイズが常にゼロですか?
- 5. libGdxのdate-time utilsの使い方は?
- 6. Firebase in Libgdxの使い方は?
- 7. LibGDXでのDIP/DPの使用方法
- 8. Libgdx Scene2dダイアログの使用方法?
- 9. Libgdx contact fixure
- 10. Libgdx |シーン2d |アニメーションでのアクションの使い方
- 11. isAnimationFinished()メソッド(LibGDX)の使い方がわかりません
- 12. LibgdxライブラリのgetSpectrum()の使用
- 13. Java 8 with LibGDXの使用
- 14. のJava LibGDXメモリ使用量
- 15. LibGdxでのメモリ使用量
- 16. libGDXのタッチダウンを使用
- 17. テキストの検出方法libGdx
- 18. Libgdx長方形の配列
- 19. LibGdxがテクスチャを使用していません(OpenGLネイティブとLibGDXを混ぜて)
- 20. libgdxのアンドロイドゲームでテーブルをクリップするためのデプスバッファの使い方
- 21. LibgdxでSQLiteデータベースを使用
- 22. libgdxを使ったコラボレーション
- 23. コインタイルを消す方法LibGDX
- 24. MouseJointDefのlibgdx - libgdxゲームに怒っている鳥
- 25. LibGDX:
- 26. LibGdxテクスチャパッキング
- 27. Libgdxイベントポーリング
- 28. LibGDXポリゴンマスク
- 29. libgdx方向矩形の力が向いています
- 30. libgdxの方が速く動いていますか?
ありがとうございました。 – Siggy1000
この行の8と3の意味は何ですか? world.step(Gdx.graphics.getDeltaTime()、8、3); – Siggy1000
これは、速度反復と位置反復です。これらの値は、Box2Dマニュアルで推奨されています。セクション2.4を参照してください - マニュアルはここにあります:http://www.box2d.org/manual.html –