Box2d рдФрд░ Libgdx

рд╢реБрдн рджрд┐рдиред

рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВрдиреЗ рд▓рд┐рдмрдЧреНрдХреНрд╕ рдХреЗ рдХрд╛рдо рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рд░реВрд╕реА рдореЗрдВ рдЗрд╕ рдврд╛рдВрдЪреЗ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рдорд┐рд▓рд╛, рдмреЗрд╢рдХ, рд░реВрд╕реА рдореЗрдВ рд▓реЗрдЦ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЗрд╡рд▓ рдЕрдиреБрд╡рд╛рдж рдмрдВрдж рдереЗред рдореИрдиреБрдЕрд▓ред рдРрд╕реЗ рд╕рддреНрдп рднреА рдереЗ рдЬрд╣рд╛рдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЕрдкрдиреА рд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд▓реЗрдХрд┐рди рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рдордЭрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдРрд╕реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдорд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

Box2D рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рднреМрддрд┐рдХреА рдЗрдВрдЬрди рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛ-рдЖрдпрд╛рдореА рднреМрддрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕рд╛рдЗрдб рд╡реНрдпреВ / рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧреЗрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИред
рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реИрдВ com.badlogic.gdx.physics.box2d ред

рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд▓рд┐рдпрд╛ред MVC рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

GameScreen


рдЧреЗрдорд╕реНрдХреНрд░реАрди рд╕реНрдХреНрд░реАрди рд╕реНрдХреНрд░реАрди, рдЗрдирдкреБрдЯрдкреНрд░реЛрд╕реЗрд╕рд░ , рдЬреЛ рдЗрд╕реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдХреНрд▓рд┐рдХ, рдЖрджрд┐ред

рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВ: MyWorld, WorldController, WorldRendererред
рд▓реЗрдЦ, рдЬреЛ MyWorld рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд┐рд╢реНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдмреЙрдХреНрд╕ 2 рдбреА рдкреИрдХреЗрдЬ рд╕реЗ рдЙрд╕реА рдирд╛рдо рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ред

@Override public void show() { //  ,        ,      MyWorld.CAMERA_WIDTH = MyWorld.CAMERA_HEIGHT* Gdx.graphics.getWidth()/Gdx.graphics.getHeight(); world = new MyWorld(); renderer = new WorldRenderer(world, MyWorld.CAMERA_WIDTH, MyWorld.CAMERA_HEIGHT,true); controller = new WorldController(world); Gdx.input.setInputProcessor(this); //     } 


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рд╕рднреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЯрдЪрдбрд╛рдЙрди, рдЯрдЪрдЕрдк рдФрд░ рдЕрдиреНрдпред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЯрдЪрдбрд╛рдЙрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЯрдЪрдЕрдк рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдЪрд░рд┐рддреНрд░ рдмрд╛рдПрдВ, рджрд╛рдПрдВ рдФрд░ рдХреВрдж рд╕рдХреЗред

 private void ChangeNavigation(int x, int y){ controller.resetWay(); //   ,  ,     () if(height-y > world.getPlayer().getPosition().y * renderer.ppuY) controller.upPressed(); //   ,  ,     if ( x< world.getPlayer().getPosition().x * renderer.ppuX) controller.leftPressed(); //   ,  ,     if (x> (world.getPlayer().getPosition().x )* renderer.ppuX) controller.rightPressed(); } @Override public boolean touchDown(int x, int y, int pointer, int button) { if (!Gdx.app.getType().equals(ApplicationType.Android)) return false; ChangeNavigation(x,y); return true; } @Override public boolean touchUp(int x, int y, int pointer, int button) { if (!Gdx.app.getType().equals(ApplicationType.Android)) return false; controller.resetWay(); return true; } @Override public boolean touchDragged(int x, int y, int pointer) { ChangeNavigation(x,y); return false; } 


рдЧреЗрдорд╕реНрдХреНрд░реАрди рдореЗрдВ , рдпреВрдЬрд░ рдПрдХреНрд╢рди рдФрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдЕрд▓рд╛рд░реНрдо рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреНрд░рдореБрдЦ рд╡рд┐рдзрд┐ render() , рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдлрд╛рдпрд░ рдХрд░рддреА рд╣реИ рдФрд░ рддрд░реНрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪрддреА рд╣реИред

 @Override public void render(float delta) { Gdx.gl.glClearColor(0, 0, 0, 232F/255); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); controller.update(delta); renderer.render(delta); } 


MyWorld



MyWorld рд╕рд┐рд░реНрдл рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рдкреИрдХреЗрдЬ рд╕реЗ рд╡рд░реНрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рд▓рд┐рдВрдХ рднреА рд╣реЛрдЧрд╛ред рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 World world; // Player player; //  Array<MovingPlatform> platforms = new Array<MovingPlatform>(); // public MovingPlatform groundedPlatform = null; 


рдареАрдХ рд╣реИ, рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ:

 public MyWorld(){ width = 30; height = 8; //   ,    () world = new World(new Vector2(0, -20), true); createWorld(); } private void createWorld(){ BodyDef def = new BodyDef(); def.type = BodyType.DynamicBody; Body boxP = world.createBody(def); player = new Player(boxP); player.getBody().setTransform(3.0f, 4.0f, 0); player.getBody().setFixedRotation(true); Body box = createBox(BodyType.StaticBody, 1, 1, 0); for(int i = 0; i < 10; i++) { box = createBox(BodyType.DynamicBody, (float)Math.random(), (float)Math.random(), 13); box.setTransform((float)Math.random() * 10f - (float)Math.random() * 10f, (float)Math.random() * 10 + 6, 0); } platforms.add(new MovingPlatform(world, 3F, 3, 1,0.25F, 2, 0, 2)); for(int i=1;i<width; ++i){ Body boxGround = createBox(BodyType.StaticBody, 1F, 1F, 0); boxGround.setTransform(i,0,0); } } private Body createBox(BodyType type, float width, float height, float density) { BodyDef def = new BodyDef(); def.type = type; Body box = world.createBody(def); PolygonShape poly = new PolygonShape(); poly.setAsBox(width, height); box.createFixture(poly, density); poly.dispose(); return box; } 


BodyDef - рдПрдХ рд╢рд░реАрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдареЛрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

BodyType рдЯрд╛рдЗрдк - рд╢рд░реАрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ред рдпрд╣ рддреАрди рд╕рдВрднрд╛рд╡рд┐рддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
рд╕реНрдерд┐рд░ - рд╢реВрдиреНрдп рджреНрд░рд╡реНрдпрдорд╛рди, рд╢реВрдиреНрдп рдЧрддрд┐, рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
рдЧрддрд┐рдЬ - рд╢реВрдиреНрдп рджреНрд░рд╡реНрдпрдорд╛рди, рдЧреИрд░-рд╢реВрдиреНрдп рд╡реЗрдЧ, рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
рдЧрддрд┐рд╢реАрд▓ - рд╕рдХрд╛рд░рд╛рддреНрдордХ рджреНрд░рд╡реНрдпрдорд╛рди, рдЧреИрд░-рд╢реВрдиреНрдп рд╡реЗрдЧ, рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдереИрддрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ: рдлрд░реНрд╢, рджреАрд╡рд╛рд░реЗрдВред

Body , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╢рд░реАрд░ рд╣реА рд╣реИред
Body рд╡рд╕реНрддреБрдУрдВ рдХреЛ setTransform() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреБрдорд╛рдпрд╛ рдФрд░ рдШреБрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЦрд┐рд▓рд╛рдбрд╝реА


рдЦрд┐рд▓рд╛рдбрд╝реА рд╡рд░реНрдЧ рдПрдХ рдЪрд░рд┐рддреНрд░ рд╣реИ:

 public class Player { final static float MAX_VELOCITY = 3f; public final static float SPEED = 5f; public final static float SIZE = 0.8f; public Fixture playerPhysicsFixture; public Fixture playerSensorFixture; Body box; public Player(Body b){ box = b; PolygonShape poly = new PolygonShape(); poly.setAsBox(0.4f, 0.4f); playerPhysicsFixture = box.createFixture(poly, 3); poly.dispose(); CircleShape circle = new CircleShape(); circle.setRadius(0.41f); circle.setPosition(new Vector2(0, 0f)); playerSensorFixture = box.createFixture(circle, 1); setFriction(10F); circle.dispose(); box.setBullet(true); } public Body getBody(){ return box; } //    public void setFriction(float f){ playerSensorFixture.setFriction(f); playerPhysicsFixture.setFriction(f); } public Vector2 getPosition(){ return box.getPosition(); } public Vector2 getVelocity() { return velocity; } Vector2 velocity = new Vector2(); public void update(float delta) { Vector2 vel = box.getLinearVelocity(); velocity.y = vel.y; box.setLinearVelocity(velocity); if(isJump) {box.applyLinearImpulse(0, 8, box.getPosition().x, box.getPosition().y); isJump = false;} } boolean isJump = false; public void jump(){ isJump = true; } public void resetVelocity(){ getVelocity().x =0; getVelocity().y =0; } } 


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ Box2D рдореЗрдВ рдЖрдк рдХреАрдиреЗрдореЗрдЯрд┐рдХ рдЬреЛрдбрд╝реЗ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦрд┐рд▓рд╛рдбрд╝реА рдПрдХ рд╕рд░реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реБрдЖ рдЖрдпрдд рдФрд░ рдПрдХ рдЪрдХреНрд░ рд╣реЛрддрд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рддрдХред рд▓реЗрдХрд┐рди Box2D рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╣реИрдВ:
applyLinearImpulse() - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЧрддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЧрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╢рд░реАрд░ рддрдм рддрдХ рдЪрд▓реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдШрд░реНрд╖рдг рдЧрддрд┐ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рджреЗрддрд╛ред
setLinearVelocity() - рдЖрдВрджреЛрд▓рди рдХреА рдЧрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рдПрдХ рдирд╛рдбрд╝реА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЧрддрд┐ рддрдм рддрдХ рд╕реНрдерд┐рд░ рд░рд╣реЗрдЧреА рдЬрдм рддрдХ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдмрджрд▓рддреЗред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ X рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП setLinearVelocity() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ setLinearVelocity() ред рдЬрдм рдЖрдк рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдХреЛ рд╡реНрд╣реАрд▓рдЪреЗрдпрд░ рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдлрд╛рд░рд╕реА рд╣рд┐рд▓ рдЬрд╛рдПрдЧрд╛, рдЬрдм рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЪрд░рд┐рддреНрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП applyLinearImpulse() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдХреНрд░реАрди рд╕реЗ рдЖрдкрдХреА рдЙрдВрдЧрд▓реА рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЪрд░рд┐рддреНрд░ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЪрд▓реЗрдЧрд╛ред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрднреА-рдХрднреА рдЖрдк рдмрд╛рдИрдВ / рджрд╛рдИрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреЗ applyLinearImpulse() рдХрд╛ applyLinearImpulse() рдХрд░ рд╕рдХрддреЗ applyLinearImpulse() ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдХреЛрдИ рдЪрд░рд┐рддреНрд░ рдПрдХ рдлрд┐рд╕рд▓рди рд╕рддрд╣ (рдмрд░реНрдл, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ) рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

box.setBullet(true); рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯрдХрд░рд╛рд╡реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдкрд░ рд╢рд░реАрд░ рдХреЛ рдПрдХ рдЧреЛрд▓реА рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЪрд▓ рд░рд╣рд╛ рдордВрдЪ


MovingPlatform рдПрдХ рдореВрд╡рд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИред

 public class MovingPlatform { Body platform; Vector2 pos = new Vector2(); Vector2 dir = new Vector2(); Vector2 vel = new Vector2(); float maxDist = 0; float width; //Vector2 l = new Vector2(); public MovingPlatform(World world, float x, float y, float width, float height, float dx, float dy, float maxDist) { platform = createBox(world, BodyType.KinematicBody, width, height, 1); this.width = width; pos.x = x; pos.y = y; dir.x = dx; dir.y = dy; vel.x = dx; vel.y = dy; this.maxDist = maxDist; platform.setTransform(pos, 0); platform.getFixtureList().get(0).setUserData("p"); platform.setUserData(this); } public void resume(){ dir.x= vel.x; dir.y = vel.y; } public void pause(){ vel.x = dir.x; vel.y = dir.y; dir.x = 0; dir.y = 0; platform.setLinearVelocity(dir); } public void update(float deltaTime) { if(dir.x < 0 && platform .getPosition().x < pos.x-maxDist) { platform .getPosition().x =pos.x; dir.mul(-1); } if(dir.x > 0 && platform .getPosition().x> pos.x+maxDist) { platform .getPosition().x =pos.x+maxDist; dir.mul(-1); } platform.setLinearVelocity(dir); } private Body createBox(World world,BodyType type, float width, float height, float density) { BodyDef def = new BodyDef(); def.type = type; Body box = world.createBody(def); PolygonShape poly = new PolygonShape(); poly.setAsBox(width/2, height/2); Fixture f = box.createFixture(poly, density); poly.dispose(); return box; } } 

рдордВрдЪ рдореВрд▓ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджреВрд░реА рддрдп рдХрд░реЗрдЧрд╛ред

WorldController


WorldController рдореЗрдВ, update() рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 boolean grounded ; public void update(float delta) { Array<MovingPlatform> platforms = world.getPlatforms(); //   for(int i = 0; i < platforms.size; i++) { MovingPlatform platform = platforms.get(i); platform.update(Math.max(1/60.0f, delta)); } grounded = isPlayerGrounded(Gdx.graphics.getDeltaTime()); //  processInput(); //   world.getPlayer().update(delta); } 


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЖрдВрджреЛрд▓рди рдХреА рдПрдХ рдирдИ рджрд┐рд╢рд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
  //            private void processInput() { Player player = world.getPlayer(); //    if (keys.get(Keys.LEFT)) player.getVelocity().x =- Player.SPEED; //    if (keys.get(Keys.RIGHT)) player.getVelocity().x = Player.SPEED; //   if (keys.get(Keys.UP)) //    if(grounded) // player.jump(); //    if(!grounded) //  world.getPlayer().setFriction(0f); //   else{ if(keys.get(Keys.RIGHT) || keys.get(Keys.LEFT)) world.getPlayer().setFriction(0.2f); else world.getPlayer().setFriction(100f); } } 


рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ рдХрд┐ рдЪрд░рд┐рддреНрд░ рдЬрдореАрди рдкрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рднреА рд╕рдВрдкрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ, рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рдВрдкрд░реНрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдпрджрд┐ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╡рд░реНрдг рдХреЗ рдиреАрдЪреЗ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдареЛрд╕ рд╕рддрд╣ рдкрд░ рд╣реИред
  private boolean isPlayerGrounded(float deltaTime) { world.groundedPlatform = null; List<Contact> contactList = world.getWorld().getContactList(); for(int i = 0; i < contactList.size(); i++) { Contact contact = contactList.get(i); if(contact.isTouching() && (contact.getFixtureA() == world.getPlayer().playerSensorFixture || contact.getFixtureB() == world.getPlayer().playerSensorFixture)) { Vector2 pos = world.getPlayer().getPosition(); WorldManifold manifold = contact.getWorldManifold(); boolean below = true; for(int j = 0; j < manifold.getNumberOfContactPoints(); j++) { below &= (manifold.getPoints()[j].y < pos.y - 0.4f); } if(below) { if(contact.getFixtureA().getUserData() != null && contact.getFixtureA().getUserData().equals("p")) { world.groundedPlatform = (MovingPlatform)contact.getFixtureA().getBody().getUserData(); } if(contact.getFixtureB().getUserData() != null && contact.getFixtureB().getUserData().equals("p")) { world.groundedPlatform = (MovingPlatform)contact.getFixtureB().getBody().getUserData(); } return true; } return false; } } return false; } 


рдЪрд░рд┐рддреНрд░ рдХрд╣рд╛рдВ рд╣реИ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдШрд░реНрд╖рдг рдХрд╛ рдмрд▓ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рд╢реВрдиреНрдп рдШрд░реНрд╖рдг рдХреЗ рд╕рд╛рде, рдЪрд░рд┐рддреНрд░ рдордВрдЪ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдЧрд╣ рдореЗрдВ рд░рд╣реЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрд▓рд╛рдЗрдб рдХрд░рдирд╛ рд╣реИред


рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдШрд░реНрд╖рдг рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рд╡рд┐рджреЗрд╢реА рдореИрдиреБрдЕрд▓ рдХреЛ рджреЗрдЦрд╛ ... рдпрд╣ рддрд░реАрдХрд╛ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдШрд░реНрд╖рдг рдмрд▓ рдХреЛ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдмрджрд▓реЗрдВред рдпрд╣ рд╣реИ, isPlayerGrounded рд╡рд┐рдзрд┐ рдореЗрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦреЗрдВ:
 if (!keys.get(Keys.LEFT) && !keys.get(Keys.RIGHT)) contact.setFriction(200F); else contact.setFriction(0F); 

рдлрд┐рд░, рдЕрдЧрд░ рдЪрд░рд┐рддреНрд░ рдмрд╕ рдЦрдбрд╝рд╛ рд╣реИ, рддреЛ рд╡рд╣ рдмрд╣реБрдд рдШрд░реНрд╖рдг рдХреЗ рдХрд╛рд░рдг рдордВрдЪ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдЧрд╛ред рдпрджрд┐ рдЪрд░рд┐рддреНрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдШрд░реНрд╖рдг рдХреЛ рдХрдо рдХрд░реЗрдВред



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдм рдХреБрдЫред рд╣рдорд╛рд░рд╛ рдЪрд░рд┐рддреНрд░ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ, рд╕рд╛рде рд╣реА рдХреВрдж рднреА рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

WorldRenderer


WorldRenderer рд╡рд░реНрдЧ рдореЗрдВ, WorldRenderer рдХреЛ WorldRenderer ред
 public class WorldRenderer { Box2DDebugRenderer renderer; public static float CAMERA_WIDTH = 10f; public static float CAMERA_HEIGHT = 15f; public float ppuX; public float ppuY; MyWorld world; public OrthographicCamera cam; public WorldRenderer(MyWorld world, float w, float h, boolean debug) { renderer = new Box2DDebugRenderer(); this.world = world; CAMERA_WIDTH = w; CAMERA_HEIGHT = h; ppuX = (float)Gdx.graphics.getWidth() / CAMERA_WIDTH; ppuY = (float)Gdx.graphics.getHeight() / CAMERA_HEIGHT; this.cam = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT); SetCamera(CAMERA_WIDTH / 2f, CAMERA_HEIGHT / 2f); } public void SetCamera(float x, float y){ this.cam.position.set(x, y,0); this.cam.update(); } public void dispose(){ world.dispose(); } public void render(float delta) { renderer.render(world.getWorld(), cam.combined); world.getWorld().step(delta, 4, 4); } } 


render() рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реА рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдмрдЧ рдореЛрдб рдореЗрдВ Box2DebugRenderer рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, render() рд╡рд┐рдзрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

world.getWorld().step(delta, 4, 4); рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рднреМрддрд┐рдХреА рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреНрд░рд╛рдЗрдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рднреМрддрд┐рдХреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
PS рдореИрдВ рдЦреБрдж Box2D рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

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


All Articles