الهيجان البدني

مساء الخير ، عزيزي القارئ! أنا ، مبرمج جافا للمبتدئين ، لم أستطع التعود على مكتبة Box2D لفترة طويلة. أولاً ، نظرًا لحقيقة أنه تمت كتابته من أجل C ++ ، وليس هناك وثائق لذلك ، ولا أعرف بناء جملة C. ثانياً ، نظرًا لحقيقة أن الدروس المفصلة في هذه المكتبة متاحة فقط كامتداد لـ libGDX. بعد أسبوعين من الصراع الصعب ، تمكنت أخيرًا من فهم كيفية العمل مع هذه المكتبة ، وفي هذا المقال سأتحدث عنها (وأظهرها).

أنا أعمل في Eclipse ، سيتم ربط المقالة مع بيئة التطوير هذه. للبدء ، قم بتنزيل أداة تجميع libGDX وقم بإنشاء بنية قياسية. نحن بحاجة إلى تطبيق سطح المكتب مع تمديد Box2D. ثم انتقل إلى Eclipse ، انقر فوق ملف → استيراد → Gradle → Gradle Project وحدد المسار إلى التجميع الخاص بك.

هنا صورة توضح كيف يبدو لي. أضفت حزمة Utils مع فئة الثوابت إلى المجلد Core ، والذي يحتوي على ثابت واحد فقط - عدد البكسل لكل متر. هذا هو أن العالم ليس عملاقا.

صورة


فيما يلي رمز فئة DesktopLauncher من com.mygdx.game.desktop:

الصق هذا الرمز في الفصل ونسيانه
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(); //   config.width = 720; //   config.height = 480; config.backgroundFPS = 60; config.foregroundFPS = 60; new LwjglApplication(new MyGdxGame(), config); } } 


سيكون هناك الكثير من التعليمات البرمجية ، لذلك سوف أرفقها في المفسدين. يتم تغيير فئة MyGdxGame فقط من حزمة com.mygdx.game.

لذلك ، دعونا نحاول القيام بشيء بسيط إلى حد ما في طلبنا. مسار الكرة يصطدم بالجدار من الألواح ، وينتشر. شيء مثل هذا:

صورة


فكرة 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; //        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(); //    verticals = createverticals(80, 80); verticals = createverticals(100, 80); verticals = createverticals(120, 80); verticals = createverticals(90, 111); verticals = createverticals(110, 111); verticals = createverticals(100, 141); horizontals = createhorizontals(85, 95); horizontals = createhorizontals(115, 95); horizontals = createhorizontals(100, 126); //   - wall = createwall(430, 170); wall = createwall(-430, 170); } 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); inputUpdate(delta); cameraUpdate(delta); } //     public void inputUpdate(float delta) { int HF = 0; if (Gdx.input.isKeyPressed(Keys.SPACE)) { HF = 5; } ball.setLinearVelocity(HF * 5, ball.getLinearVelocity().y); } //      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(20 / Constants.PPM, 90 / 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 createverticals(int xo, int xy) { Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(xo / Constants.PPM, xy / Constants.PPM); def.fixedRotation = false; fBody = world.createBody(def); PolygonShape shape = new PolygonShape(); shape.setAsBox(5 / Constants.PPM, 10 / Constants.PPM); fBody.createFixture(shape, 1.0f); def.bullet = true; shape.dispose(); return fBody; } //   public Body createhorizontals(int xo, int xy) { Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(xo / Constants.PPM, xy / Constants.PPM); def.fixedRotation = false; fBody = world.createBody(def); PolygonShape shape = new PolygonShape(); shape.setAsBox(13 / Constants.PPM, 5 / Constants.PPM); fBody.createFixture(shape, 1.0f); def.bullet = true; shape.dispose(); return fBody; } } 


اتضح عظيم ، أليس كذلك؟ من خلال تغيير العديد من المعلمات ، يمكنك تحقيق ما تحتاجه بالضبط! ولا تكتب الكثير من أسطر التعليمات البرمجية.

ولكن الآن أريد أن أرى ضربة مرنة. ودع هناك المزيد من الأشياء على المسرح. نحصل على النتيجة التالية:

صورة

وهنا هو الكود:
 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(); //   ball = createPlayer(); //   floor = createfloor(); wall = createwall(100, 170); wall = createwall(-60, 170); //   .   ,   verticals = createverticals(5, 50); verticals = createverticals(10, 50); verticals = createverticals(15, 50); verticals = createverticals(20, 50); verticals = createverticals(25, 50); verticals = createverticals(30, 50); verticals = createverticals(35, 50); verticals = createverticals(5, 55); verticals = createverticals(10, 55); verticals = createverticals(15, 55); verticals = createverticals(20, 55); verticals = createverticals(25, 55); verticals = createverticals(30, 55); verticals = createverticals(35, 55); verticals = createverticals(5, 60); verticals = createverticals(10, 60); verticals = createverticals(15, 60); verticals = createverticals(20, 60); verticals = createverticals(25, 60); verticals = createverticals(30, 60); verticals = createverticals(35, 60); verticals = createverticals(5, 70); verticals = createverticals(10, 70); verticals = createverticals(15, 70); verticals = createverticals(20, 70); verticals = createverticals(25, 70); verticals = createverticals(30, 70); verticals = createverticals(35, 70); verticals = createverticals(5, 80); verticals = createverticals(10, 80); verticals = createverticals(15, 80); verticals = createverticals(20, 80); verticals = createverticals(25, 80); verticals = createverticals(30, 80); verticals = createverticals(35, 80); } 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); inputUpdate(delta); cameraUpdate(delta); } //    public void inputUpdate(float delta) { ball.setAngularVelocity(3.0f); } 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(20 / Constants.PPM, 800 / 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 createverticals(int xo, int yo) { Body pBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(xo / Constants.PPM, yo / Constants.PPM); def.fixedRotation = false; pBody = world.createBody(def); CircleShape shape = new CircleShape(); shape.setRadius(2 / Constants.PPM); //     FixtureDef fd = new FixtureDef(); //  fd.restitution = 1.0f; //  fd.density = 5.0f; //  fd.friction = 0.01f; fd.shape = shape; pBody.createFixture(fd); def.bullet = true; shape.dispose(); return pBody; } } 


إنشاء عربة في 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(); //   ball = createPlayer(20 / Constants.PPM, 70 / Constants.PPM); ball1 = createPlayer(50 / Constants.PPM, 70 / Constants.PPM); floor = createfloor(); wall = createwall(430, 170); wall = createwall(-430, 170); verticals = createverticals(); } 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); inputUpdate(delta); cameraUpdate(delta); } public void inputUpdate(float delta) { //   .         ball.setLinearVelocity(3.0f, ball.getLinearVelocity().y); ball1.setLinearVelocity(3.0f, ball.getLinearVelocity().y); verticals.setLinearVelocity(3.0f, verticals.getLinearVelocity().y); } 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(float xo, float yo) { Body pBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(xo, yo); 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 createverticals() { Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(30 / Constants.PPM, 90 / Constants.PPM); def.fixedRotation = true; fBody = world.createBody(def); PolygonShape shape = new PolygonShape(); shape.setAsBox(30 / Constants.PPM, 3 / Constants.PPM); fBody.createFixture(shape, 0.001f); shape.dispose(); return fBody; } } 


إذا نظرت إلى الكود ، ستلاحظ أن هذه ليست عربة حقيقية ، بل هي عصا على العجلات. الذهاب المتحمسين! يوجد مقطع فيديو على Youtube حيث تم تصنيع ICE رباعي الأشواط في Box2D. هل نحن أسوأ؟ في انتظار التعليقات لنجاحك!

صورة


المزيد من الاشتباكات!
 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(); //      ball = createPlayer(20 / Constants.PPM, 150 / Constants.PPM); ball1 = createPlayer(35 / Constants.PPM, 200 / Constants.PPM); ball2 = createPlayer(35 / Constants.PPM, 300 / Constants.PPM); ball3 = createPlayer(20 / Constants.PPM, 400 / Constants.PPM); ball4 = createPlayer(35 / Constants.PPM, 200 / Constants.PPM); ball5 = createPlayer(45 / Constants.PPM, 500 / Constants.PPM); floor = createfloor(); wall = createwall(100, 170); wall = createwall(-60, 170); } 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(float xo, float yo) { Body pBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(xo, yo); def.fixedRotation = false; pBody = world.createBody(def); CircleShape shape = new CircleShape(); shape.setRadius(10 / Constants.PPM); pBody.createFixture(shape, 0.0001f); def.bullet = true; // ,      FixtureDef fd = new FixtureDef(); fd.restitution = 1.0f; fd.density = 5.0f; fd.friction = 0.01f; fd.shape = shape; pBody.createFixture(fd); 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; } } 


وآخر 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 ، وسيتم إنشاء تطبيقات ممتازة للغاية! شكرا لك على القراءة حتى النهاية! سأحاول الإجابة على جميع الأسئلة الواردة في التعليقات!

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


All Articles