рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрд░рд┐рдп рдкрд╛рдардХ! рдореИрдВ, рдПрдХ рд╢реБрд░реБрдЖрддреА рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░, рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ Box2D рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдЕрднреНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдпрд╣ рд╕реА ++ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╕реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдкрд╛рда рдХреЗрд╡рд▓ libGDX рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдХреЗ рдХрдард┐рди рд╕рдВрдШрд░реНрд╖ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ (рдФрд░ рдЗрд╕реЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛)ред
рдореИрдВ
рдЧреНрд░рд╣рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдЦ рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
libGDX рдХрд▓реЗрдХреНрдЯрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдПрдХ рдорд╛рдирдХ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВред рд╣рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ Box2D рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЧреНрд░рд╣рдг рдкрд░ рдЬрд╛рдПрдВ, рдлрд╝рд╛рдЗрд▓ тЖТ рдЖрдпрд╛рдд тЖТ рдЧреНрд░реЗрдб тЖТ рдЧреНрд░реЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
рдпрд╣рд╛рдБ рдПрдХ рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреЛрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдпреВрдЯрд┐рд▓реНрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд┐рд░ - рдкреНрд░рддрд┐ рдореАрдЯрд░ рдкрд┐рдХреНрд╕рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ рд╡рд┐рд╢рд╛рд▓ рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдБ com.mygdx.game.desktop рд╕реЗ DesktopLauncher рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
рдЗрд╕ рдХреЛрдб рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдПрдВpackage com.mygdx.game.desktop; import com.badlogic.gdx.backends.lwjgl.LwjglApplication; import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; import com.mygdx.game.MyGdxGame; public class DesktopLauncher { public static void main(String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
рдмрд╣реБрдд рдХреЛрдб рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рджреВрдВрдЧрд╛ред Com.mygdx.game рдкреИрдХреЗрдЬ рд╕реЗ рдХреЗрд╡рд▓ MyGdxGame рд╡рд░реНрдЧ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИред
рддреЛ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЧреЗрдВрдж рдХрд╛ рд░рд╛рд╕реНрддрд╛ рддрдЦреНрддреЛрдВ рд╕реЗ рджреАрд╡рд╛рд░ рдореЗрдВ рдЯрдХрд░рд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдмрд┐рдЦрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

рд╡рд┐рдЪрд╛рд░ 1. рдмреЙрд▓рд┐рдВрдЧ package com.mygdx.game; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; import com.badlogic.gdx.physics.box2d.CircleShape; import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.World; import utils.Constants; public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; private OrthographicCamera camera; private boolean DEBUG = false; private World world; private Body ball; private Body floor; private Body wall; private Body verticals; private Body horizontals; private Box2DDebugRenderer b2dr;
рдпрд╣ рдорд╣рд╛рди, рд╕рд╣реА рдирд┐рдХрд▓рд╛? рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдХрд░, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣реА рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП! рдФрд░ рдХреЛрдб рдХреА рдЗрддрдиреА рд╕рд╛рд░реА рд▓рд╛рдЗрдиреЗрдВ рди рд▓рд┐рдЦреЗрдВред
рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдПрдХ рд▓реЛрдЪрджрд╛рд░ рдЭрдЯрдХрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рдордВрдЪ рдкрд░ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдиреЗ рджреЗрдВред рд╣рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

рдФрд░ рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ: package com.mygdx.game; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; import com.badlogic.gdx.physics.box2d.CircleShape; import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.World; import utils.Constants; public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; private OrthographicCamera camera; private boolean DEBUG = false; private World world; private Body ball; private Body floor; private Body wall; private Body verticals; private Body horizontals; private Box2DDebugRenderer b2dr; public void create() { float w = Gdx.graphics.getWidth(); float h = Gdx.graphics.getHeight(); camera = new OrthographicCamera(); camera.setToOrtho(false, w / 2, h / 2); world = new World(new Vector2(0, -9.8f), false); b2dr = new Box2DDebugRenderer();
Box2D рдореЗрдВ рдХрд╛рд░реНрдЯ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рд╢рд╡реЛрдВ рдХреЛ рдмрд╛рдВрдзрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд GIF рдХреЗрд╡рд▓ рд╕рд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ? package com.mygdx.game; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; import com.badlogic.gdx.physics.box2d.CircleShape; import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.World; import utils.Constants; public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; private OrthographicCamera camera; private boolean DEBUG = false; private World world; private Body ball; private Body ball1; private Body floor; private Body wall; private Body verticals; private Body horizontals; private Box2DDebugRenderer b2dr; public void create() { float w = Gdx.graphics.getWidth(); float h = Gdx.graphics.getHeight(); camera = new OrthographicCamera(); camera.setToOrtho(false, w / 2, h / 2); world = new World(new Vector2(0, -9.8f), false); b2dr = new Box2DDebugRenderer();
рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрд╛рдбрд╝реА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдкрд╣рд┐рдпреЛрдВ рдкрд░ рдПрдХ рдЫрдбрд╝реА рд╣реИред рдЙрддреНрд╕рд╛рд╣реА рдЬрд╛рдУ! Youtube рдкрд░ рдПрдХ
рд╡реАрдбрд┐рдпреЛ рд╣реИ рдЬрд╣рд╛рдВ Box2D рдореЗрдВ рдЪрд╛рд░ рд╕реНрдЯреНрд░реЛрдХ рд╡рд╛рд▓рд╛ ICE рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рд╣рдо рдмрджрддрд░ рд╣реИрдВ? рдЕрдкрдиреА рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ!

рдЕрдзрд┐рдХ рдЭрдбрд╝рдк! package com.mygdx.game; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; import com.badlogic.gdx.physics.box2d.CircleShape; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.World; import utils.Constants; public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; private OrthographicCamera camera; private boolean DEBUG = false; private World world; private Body ball; private Body ball1; private Body ball2; private Body ball3; private Body ball4; private Body ball5; private Body floor; private Body wall; private Body verticals; private Body horizontals; private Box2DDebugRenderer b2dr; public void create() { float w = Gdx.graphics.getWidth(); float h = Gdx.graphics.getHeight(); camera = new OrthographicCamera(); camera.setToOrtho(false, w / 2, h / 2); world = new World(new Vector2(0, -9.8f), false); b2dr = new Box2DDebugRenderer();
рдФрд░ рдЖрдЬ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо GIFред рдЗрдЪреНрдЫреБрдХ рд╡рд┐рдорд╛рди рднреМрддрд┐рдХреА рдХреЗ рдкрд╛рда рд╕реЗ рд╣рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рдпрд╣ рдХреЛрдб рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░реВрдк (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдордирдорд╛рдирд╛) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЧреЗрдорд┐рдВрдЧ рднреМрддрд┐рдХреА рдХреЗ рд▓рд┐рдП рдЕрд╕реАрдо рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЦреБрд▓реЗрдВред

рдЭреБрдХрд╛ рд╣реБрдЖ рд╡рд┐рдорд╛рди public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; private OrthographicCamera camera; private boolean DEBUG = false; private World world; private Body ball; private Body floor; private Body wall; private Body plos; private Body verticals; private Body horizontals; private Box2DDebugRenderer b2dr; public void create() { float w = Gdx.graphics.getWidth(); float h = Gdx.graphics.getHeight(); camera = new OrthographicCamera(); camera.setToOrtho(false, w / 2, h / 2); world = new World(new Vector2(0, -9.8f), false); b2dr = new Box2DDebugRenderer(); ball = createPlayer(); floor = createfloor(); wall = createwall(430, 170); wall = createwall(-430, 170); plos = createplos(); } public void render() { update(Gdx.graphics.getDeltaTime()); Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); b2dr.render(world, camera.combined.scl(Constants.PPM)); } public void resize(int width, int height) { camera.setToOrtho(false, width / 2, height / 2); } public void dispose() { world.dispose(); b2dr.dispose(); } public void update(float delta) { world.step(1 / 60f, 6, 2); cameraUpdate(delta); } public void cameraUpdate(float delta) { Vector3 position = camera.position; position.x = ball.getPosition().x * Constants.PPM; position.y = ball.getPosition().y * Constants.PPM; camera.position.set(position); camera.update(); } public Body createPlayer() { Body pBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(30 / Constants.PPM, 190 / Constants.PPM); def.fixedRotation = false; pBody = world.createBody(def); CircleShape shape = new CircleShape(); shape.setRadius(10 / Constants.PPM); pBody.createFixture(shape, 1.0f); def.bullet = true; shape.dispose(); return pBody; } public Body createfloor() { Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.StaticBody; def.position.set(0, 0); def.fixedRotation = true; fBody = world.createBody(def); PolygonShape shape = new PolygonShape(); shape.setAsBox(480 / Constants.PPM, 70 / Constants.PPM); fBody.createFixture(shape, 0.001f); shape.dispose(); return fBody; } public Body createwall(int xo, int yo) { Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.StaticBody; def.position.set(xo / Constants.PPM, yo / Constants.PPM); def.fixedRotation = true; fBody = world.createBody(def); PolygonShape shape = new PolygonShape(); shape.setAsBox(50 / Constants.PPM, 100 / Constants.PPM); fBody.createFixture(shape, 0.001f); shape.dispose(); return fBody; } public Body createplos() { Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(0f , -0.6f ); vertices[1] = new Vector2(1f , -0.6f ); vertices[2] = new Vector2(1f , 1f); PolygonShape shape = new PolygonShape(); Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.StaticBody; def.position.set(20 / Constants.PPM, 90 / Constants.PPM); def.fixedRotation = true; fBody = world.createBody(def); shape.set(vertices); fBody.createFixture(shape, 0.001f); shape.dispose(); return fBody; } }
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЖрдк Box2D рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдФрд░ рдмреЗрд╣рдж рдЙрддреНрдХреГрд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреИрджрд╛ рд╣реЛрдВрдЧреЗ! рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛!