2013-03-16 25 views
9

Tôi vừa mới bắt đầu làm việc với Động cơ Box2d của Libgdx nhưng tôi chỉ đơn giản là không hiểu khi nào các phương pháp của Contactlistener nên được gọi. Có một mặt "bắt đầu liên lạc" và trên "tiếp xúc cuối" khác. Tôi nên gọi cho họ ở đâu, để lấy Số của một vật cố định nào đó chạm vào người khác? Và làm cách nào để triển khai Contactlistener? Chuyển hướng đến một Hướng dẫn sẽ trả lời Câu hỏi của tôi. Tôi không tìm thấy gì trong khi tìm kiếm trên google. Điều này one đã giúp tôi rất nhiều nhưng nó được viết cho C++ và không đề cập đến việc thực hiện vào một gamecircle chính. Thx để giúp tôi;)cách sử dụng danh sách liên hệ libgdx

Trả lời

16

Đây là một ví dụ ngắn cho libgdx. Nó cho thấy cách tạo ContactListener để hiển thị đồ đạc nào có liên quan khi danh bạ được tạo và bị hỏng. Nó cũng cho thấy việc sử dụng world.getContactList() sẽ trả về một danh sách các địa chỉ liên hệ vẫn tồn tại sau bước vật lý. Điều này có thể bỏ lỡ các địa chỉ liên lạc đã được thực hiện và bị hỏng trong quá trình bước vật lý. Nếu bạn quan tâm đến những điều này thì bạn sẽ muốn triển khai ContactListener, sử dụng beginContact() để phát hiện khi nào liên hệ được thực hiện và endContact() để phát hiện khi chúng bị hỏng.

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); 
    } 
} 
+0

Cảm ơn bạn rất nhiều :) – Siggy1000

+0

ý nghĩa của 8 và 3 trong Dòng này là gì? world.step (Gdx.graphics.getDeltaTime(), 8, 3); – Siggy1000

+0

Chúng là các lần lặp tốc độ và các lần lặp vị trí tương ứng. Các giá trị này được sách hướng dẫn Box2D khuyên dùng. Xem phần 2.4 - hướng dẫn sử dụng ở đây: http://www.box2d.org/manual.html –

4

bạn không phải gọi những phương thức đó ở bất kỳ đâu. chỉ cần tạo một lớp và triển khai ContactListener trong đó. bây giờ trong mã của bạn chỉ cần sử dụng world.setContactListener (người nghe ContactListener).

Bất cứ khi nào va chạm xảy ra trong thế giới của bạn, tất cả 4 phương pháp sẽ được gọi. Bạn sẽ nhận được fixtureA và fixtureB của 2 cơ quan va chạm

+0

thx, tôi là một noob đẫm máu: D – Siggy1000

+0

không có cách nào để nghe cho một số liên lạc do cơ thể chỉ thực hiện? như 'body.setContactListener (new ContactListenger {...})'. Bằng cách đó, tôi chỉ cần kiểm tra đối tượng va chạm * khác là gì và tôi luôn đảm bảo rằng đối tượng đầu tiên là đối tượng * body *. Trong khi trong 'world.setContactListener' tôi luôn phải kiểm tra cả hai vật cố định trước. – xetra11

Các vấn đề liên quan