2013-04-05 34 views
6

Tôi mới trong box2d và cố gắng triển khai nó trong Trò chơi LibGDX. Những gì tôi muốn làm là để phát hiện va chạm giữa các cơ quan khác nhau. Vì vậy, tôi đã thực hiện một vụ va chạm lớp học và thực hiện ContactListener trong đó cung cấp cho tôi 4 phương pháp ghi đè, nghĩa là beginContact()endContact() mà tôi phải giải quyết. Ngoài ra tôi đang truyền đối tượng của lớp collisionDetection trong world.setcontactListner(collisionDet) theo đó các phương thức ghi đè của lớp collisionDetection sẽ được gọi khi các đối tượng trong lớp thế giới va chạm với nhau. Nhưng vấn đề là xảy ra khi các vật thể va chạm với phương pháp beginContact() được gọi là mọi lúc nhưng phương pháp endContact() không được gọi là mọi khi cơ thể bị mất liên lạc. Vậy, cách nào chúng ta có thể phát hiện endContact() mọi lúc.EndContact của ContactListner (Box2d) không được gọi là mọi lúc trong LibGDX

Mã của lớp collisionDetection là như sau:

public class CollisionDetection implements ContactListener { 
static Fixture fixtureA; 
static Fixture fixtureB; 
public static boolean Colliding=false; 
World world; 


protected CollisionDetection(World world, long addr) { 
    this.world = world; 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void beginContact(Contact contact) { 
    // TODO Auto-generated method stub 
    fixtureA = contact.getFixtureA(); 
    fixtureB = contact.getFixtureB(); 

    Colliding=true; 

} 

@Override 
public void endContact(Contact contact) { 
    // TODO Auto-generated method stub  
    Colliding=false; 

} 

@Override 
public void preSolve(Contact contact, Manifold oldManifold) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void postSolve(Contact contact, ContactImpulse impulse) { 
    // TODO Auto-generated method stub 


} 

Và World Class

collisionDet = new CollisionDetection(worldbox, 0);
worldbox.setContactListener(collisionDet);

Cảm ơn

+0

Bạn có chắc chắn rằng các cơ quan đang mất liên lạc? Sử dụng Box2dDebugRenderer để kiểm tra. –

+0

Có, họ đang mất liên lạc vì tôi đang di chuyển một cơ thể (động) với sự giúp đỡ của tọa độ TouchPad và khi cơ thể đi qua một cơ quan khác (tĩnh), 'endContact()' không được gọi là mọi lúc. –

+0

Đủ công bằng. Lý do tôi đề xuất bằng cách sử dụng trình kết xuất gỡ lỗi là nó vẽ thân thể, thay vì bất kỳ thứ gì bạn có thể vẽ mà có thể hoặc không khớp với các phần tử. Ngoài ra, có bất kỳ lý do tại sao bạn đang gọi setEnabled (true) bên trong callbacks? –

Trả lời

0

Bạn có thể sử dụng setTranform() để di chuyển đối tượng .. Box2d không cung cấp gọi lại khi chúng tôi sử dụng chuyển đổi thiết lập

+0

Không, tôi đang sử dụng body.setLinearVelocity() để di chuyển chúng. –

+1

bạn đã sửa mã của mình bằng cách sử dụng System.out.println ("endcontacr"); endContact như tôi có thể thấy rằng bạn đã lấy biến boolean Colliding là tĩnh và nó có thể cho gọi lại của cả hai bắt đầu liên lạc và endcontact nhưng nó có thể được trong chu kỳ bước cùng của box2d vì vậy bạn coudn't phát hiện nó. thử gỡ lỗi bằng system.out.println –