نيوتن كوخ مهد

مرحبا عزيزي القارئ! لقد كتبت بالفعل المقال الأول مع أساسيات Box2D في Eclipse في Java. اليوم ، باستخدام مثال Newton's Cradle ، سأعرض كيفية تكوين اتصال الكائنات في هذه المكتبة المادية الرائعة.

ماذا نتوقع أن نرى؟

صورة

الشكل 1. جيد جدا!

بالتأكيد شيء مختلف تماما عن ذلك!

لتوصيل libGDX ، راجع المقال الأول .

لم يتغير تكوين المشروع:

صورة

الشكل 2. المشروع. المجلدات والحزم.

أضفت حزمة 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); } } 


في نموذجنا المادي ، سيكون لمعامل المرونة أهمية أساسية. وكلما زاد ذلك ، زادت التذبذبات التي سيحدثها البندول. في Box2D ، يمكن لمعلمة الاسترداد الخاصة بـ FixtureDef أن تأخذ قيمًا من 0 إلى 1.0f ، حيث 0 ليست مرنة تمامًا ، و 1.0f مرنة تمامًا. أفضل نموذج لنيوتن كرادل حصلت عليه مع الرد = 0.8f:

صورة

الشكل 3 معامل المرونة = 0.8f ، لمزيد من الوضوح ، حركة بطيئة.

كود التنفيذ:
 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 Body plos; private Body plos2; private Body plos3; private Body plos1; private Body plos4; private Box2DDebugRenderer b2dr; private Body ball; private Body ball1; private Body ball2; private Body ball3; private Body ball4; 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(); //     plos = createplos(20 / Constants.PPM); plos1 = createplos(0 / Constants.PPM); plos2 = createplos(40 / Constants.PPM); plos3 = createplos(80 / Constants.PPM); plos4 = createplos(60 / Constants.PPM); //   ball = createball(20 / Constants.PPM); ball1 = createball(40 / Constants.PPM); ball2 = createball(60 / Constants.PPM); ball3 = createball(0 / Constants.PPM); ball4 = createball(80 / Constants.PPM); //       rotation(plos, ball); rotation(plos2, ball1); rotation(plos1, ball3); rotation(plos4, ball2); rotation(plos3, ball4); } //       public void rotation(Body body1, Body body2) { RevoluteJointDef rjd = new RevoluteJointDef(); rjd.bodyA = body1; rjd.bodyB = body2; rjd.collideConnected = false; //      rjd.localAnchorB.set((plos.getPosition().x) / Constants.PPM, plos.getPosition().y / Constants.PPM + 2); //      rjd.localAnchorA.set((plos.getPosition().y - 6.8f) / Constants.PPM, plos.getPosition().x / Constants.PPM); world.createJoint(rjd); } 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); inputUpdate(delta); } public void inputUpdate(float delta) { //    ,      -7 /  x, -7 /  y if (Gdx.input.isKeyPressed(Keys.SPACE)) { ball3.setLinearVelocity(-7, -7); } } //      public void cameraUpdate(float delta) { Vector3 position = camera.position; position.x = ball1.getPosition().x * Constants.PPM; position.y = ball1.getPosition().y * Constants.PPM; camera.position.set(position); camera.update(); } //   public Body createplos(float xo) { PolygonShape shape = new PolygonShape(); Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.StaticBody; def.position.set(xo, 200 / Constants.PPM); def.fixedRotation = true; fBody = world.createBody(def); shape.setAsBox(10 / Constants.PPM, 10 / Constants.PPM); fBody.createFixture(shape, 0.001f); shape.dispose(); return fBody; } //   public Body createball(float xo) { Body pBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(xo, 100 / Constants.PPM); 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 = 0.8f; //  fd.density = 10.0f; //   fd.friction = 0f; fd.shape = shape; pBody.createFixture(fd); shape.dispose(); return pBody; } } 


يمكنك تغيير المعاملات بنفسك والحصول على نتائج مختلفة. بالإضافة إلى ذلك ، يمكن تطبيق القوام على البدائية لتحقيق قدر أكبر من الواقعية.

سيتم تقديم صور GIF التالية للقيم المختلفة لمعامل المرونة.

صورة

الشكل 4. معامل المرونة يساوي 1F.

صورة

الشكل 5. معامل مرونة يساوي 0.5f.

صورة

الشكل 6. معامل المرونة يساوي 0.2f.

صورة

الشكل 7. معامل المرونة يساوي 0.

هناك الكثير من الأفكار ، وأحاول نشر النتائج إلى أقصى حد ممكن! شكرا لك على القراءة حتى النهاية ، وآمل أن تكون المقالة مفيدة لك! دعونا نجمع الفوضى الحقيقية في عالم الألعاب بفضل مكتبة Box2D!

PS سأجيب على جميع الأسئلة في التعليقات.

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


All Articles