рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрд░рд┐рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ habr.com! рдпрд╣ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рддреАрд╕рд░рд╛ рд▓реЗрдЦ рд╣реИред рдореИрдВ рджрд┐рди рднрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдЦреБрдж рдХреЛ рдЕрджреНрднреБрдд Box2D рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рджреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рдпрджрд┐ рдЖрдкрдиреЗ
рдкрд╣рд▓реЗ рдФрд░
рджреВрд╕рд░реЗ рд▓реЗрдЦ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдЕрд╡рд╢реНрдп рджреЗрдЦреЗрдВ, рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реЛрдЧрд╛! рдореИрдВ
рдЧреНрд░рд╣рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓реЗрдЦ рдХреЛ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд╣рд╛? рдЖрдЧреЗ рдкрдврд╝реЗрдВ - рдФрд░ рдмрд╣реБрдд рдЬрд▓реНрдж рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛! Spoiler: рд╣рдо рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реНрдерд╛рдпреА рдЧрддрд┐ рдорд╢реАрди (рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд┐рдд) рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░, рд╢рд╛рдпрдж, рд╣рдо рдорд╢реАрди рдЦреБрдж рдмрдирд╛рдПрдВрдЧреЗ!
рдЪрд┐рддреНрд░рд╛ 1. рд╕рджрд╛ рдЧрддрд┐ рдорд╢реАрдиред
рддреЛ, рдЖрдЬ рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ:
рдЪрд┐рддреНрд░рд╛ 2. рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдорд╢реАрдиред
рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкреЛ рдирд╣реАрдВ рд╣реИ! рдЖрдЬ рд╣рдо рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдПрдХ рдорд╢реАрди рдмрдирд╛рдПрдВрдЧреЗ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЗ рдЕрдкреНрд░рднреЗрджреНрдп рд╣реЛрдЧрд╛! рдпрд╣
рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП "рдЧрд╛рдбрд╝реА" рдирд╣реАрдВ рд╣реИред
LibGDX рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП
, рдкрд╣рд▓рд╛ рд▓реЗрдЦ рджреЗрдЦреЗрдВред
рдпрд╣рд╛рдБ рдПрдХ рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рднрд╛ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИред рдореИрдВрдиреЗ рдХреЛрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдпреВрдЯрд┐рд▓реНрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд┐рд░ - рдкреНрд░рддрд┐ рдореАрдЯрд░ рдкрд┐рдХреНрд╕рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ рд╡рд┐рд╢рд╛рд▓ рдирд╣реАрдВ рд╣реИред
рдЪрд┐рддреНрд░рд╛ 3. рдореЗрд░рд╛ рдирд┐рд░реНрдорд╛рдгред
рдпрд╣рд╛рдБ 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();
MyGdxGame рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб com.mygdx.game рдкреИрдХреЗрдЬ рд╕реЗ рд╣реИред рд╕рдм рдХреБрдЫ рдХреЛрдб рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╣реИред
рд╣рдо рджреБрдирд┐рдпрд╛ рдФрд░ рдорд╢реАрди рдмрдирд╛рддреЗ рд╣реИрдВред 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.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 com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef; import utils.Constants; public class MyGdxGame extends ApplicationAdapter { private OrthographicCamera camera; private boolean DEBUG = false; private World world; private Box2DDebugRenderer b2dr;
рдЪрд┐рддреНрд░ 4. рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ?
рд╣рдо рдЕрдкрдиреА рдХрд╛рд░ рдХреЛ рдПрдХ рдореЛрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕рдХреЗ рдкрд╣рд┐рдпреЗ рдХреЛ рдШреБрдорд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдКрд░реНрдЬрд╛ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдо рдЕрдкрдиреА рд╕реНрдерд╛рдпреА рдЧрддрд┐ рдорд╢реАрди рдмрдирд╛рддреЗ рд╣реИрдВ!
рдФрд░ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╕реНрддрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рднреЗрдЬреЗрдВ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк Box2D рдореЗрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ!
рдкреБрдирд╢реНрдЪ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВ! рдЧреЗрдорд┐рдВрдЧ рднреМрддрд┐рдХреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдВ!