Libgdx рдореЗрдВ Box2d рд╕реЗ ContactListener рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

Libgdx рдореЗрдВ Box2d рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ , рдореИрдВрдиреЗ ContactListener рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрдХрд░рд╛рд╡реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЫрд╡рд┐


ContactListener рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЗрдорд┐рдВрдЧ рд╡рд░реНрд▓реНрдб рдореЗрдВ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

4 рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: beginContact , endContact , preSolve , postSolve ред

рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
 public class MyContactListener implements ContactListener{ @Override public void endContact(Contact contact) { } @Override public void beginContact(Contact contact) { } @Override public void preSolve (Contact contact, Manifold oldManifold){ } @Override public void postSolve (Contact contact, ContactImpulse impulse){ } } 


рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЧреЗрдо рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 world.setContactListener(new MyContactListener()); 


beginContact

рдЬрдм рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд╡рд░рд▓реИрдк рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ рддреЛ рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдХрджрдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

endContact

рдЖрдЧ рдЬрдм рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреВрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИред рдпрд╣ рддрдм рдирд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╢рд░реАрд░ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдШрдЯрдирд╛ рд╕рдордп рдХрджрдо рдХреЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддреА рд╣реИред

preSolve

рдпрд╣ рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛред рдпрд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдкрд░реНрдХ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕реА рд╕рдВрдкрд░реНрдХ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВред рд╣рдордиреЗ рдПрдХ рдЧрддрд┐рдорд╛рди рдордВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдЖрдк рдЪрд░рд┐рддреНрд░ рдХреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рддрдм рдЗрд╕ рддрд░рд╣ preSolve рджреЗрдЧрд╛:
  @Override public void preSolve (Contact contact, Manifold oldManifold){ WorldManifold manifold = contact.getWorldManifold(); for(int j = 0; j < manifold.getNumberOfContactPoints(); j++){ if(contact.getFixtureA().getUserData() != null && contact.getFixtureA().getUserData().equals("p")) contact.setEnabled(false); if(contact.getFixtureB().getUserData() != null && contact.getFixtureB().getUserData().equals("p")) contact.setEnabled(false); } } 


contact.getFixtureA().getUserData().equals("p") рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдПрдВ рдХрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдмрдирд╛рддреЗ рд╕рдордп, platform.getFixtureList().get(0).setUserData("p") рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


postSolve

рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдЧреЗрдо рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬреЛ рд╕рдВрдкрд░реНрдХ рдХреЗ рдмрд╛рдж рднреМрддрд┐рдХреА рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдкрд░реНрдХ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЦрд╝рд░рд╛рдм рдХрд░рдирд╛ рдпрд╛ рдирд╖реНрдЯ рдХрд░рдирд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, Box2D рдЖрдкрдХреЛ рдкрджреНрдзрддрд┐ рдореЗрдВ рднреМрддрд┐рдХреА рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Box2D рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ - рдЖрдк рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдлрд┐рд▓рд╣рд╛рд▓ рдХрд╣реАрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:
java.lang.NullPointerException
at com.badlogic.gdx.physics.box2d.World.contactFilter


рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдо рдЙрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ рдЬрд┐рдирдХрд╛ рд╣рдордиреЗ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдерд╛ред

 @Override public void postSolve (Contact contact, ContactImpulse impulse){ Body body = null; if(contact.getFixtureA() != null &amp;&amp; contact.getFixtureA().getUserData() != null &amp;&amp; contact.getFixtureA().getUserData().equals("b")) body = contact.getFixtureA().getBody(); if(contact.getFixtureB() != null &amp;&amp; contact.getFixtureB().getUserData() != null &amp;&amp; contact.getFixtureB().getUserData().equals("b")) body = contact.getFixtureB().getBody(); if(body != null){ body.setActive(false); world.destroyBody(body); } } 


рдЕрдм, рдПрдХ рдЯрдХреНрдХрд░ рдореЗрдВ, рдмреНрд▓реЙрдХ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП getFixtureList().get(0).setUserData("b") рд╕реЗрдЯ рд╣реИрдВ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдореИрдВрдиреЗ рдКрдкрд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд▓реЛрдкрди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдк рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп body.setActive(false) рдмрдирд╛рддреЗ рд╣реИрдВред body.setActive(false) , рддреЛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред


рд╕реНрд░реЛрдд рдХреЛрдб

рдЖрдк рдмреНрд▓реЙрдЧ рд╕реЗ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдирдо рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд╛рдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред

Source: https://habr.com/ru/post/In162079/


All Articles