AndEngineとphysicsbox2dをお試しください

この記事では、Physics2boxなどのAndEngineの拡張機能の存在についてお話したいと思います。

AndEngineは、最も人気のあるAndtoidの無料ゲームエンジンです。 それには多くの拡張機能がありますが、そのうちの1つはphysicsbox2dです。 このライブラリを使用すると、ゲームの世界で物理学を作成できます。



HabréstepangoのAndEngineについてはすでに完全に書いています。 私は彼の仕事を喜んで利用し、同時にphysicsbox2dをねじ込みました。 それは非常に簡単であることが判明しました。



これら2つのツールのすべての機能、または一部の機能についても説明することは想定していませんが、どこから始めたいかに興味のある人だけに伝えます。 そして、ここから始めましょう:



Androidの標準プロジェクトを作成し、andengine.jarおよびandenginephysicsbox2dextension.jarライブラリを追加します。 また、ファイルlibandenginephysicsbox2dextension.soおよびarmeabilibxmp.soを含むarmeabiフォルダーが必要になります。 Nebeansでは、これらすべてをプロジェクトのlibsフォルダーに入れるだけです。 これをどうやって手に入れるか-ぼんやりと好奇心の強い人々を妨げるものについては説明しませんが、本当に興味のある人を止めません。 これで続行できます。



1. AndEngineベースのBaseGameActivityからアクティビティを継承します。

2.必要なメソッドonLoadEngineおよびonLoadSceneを実装します



コードは次のとおりです。

public class MainActivity extends BaseGameActivity { //      private static final int CAMERA_WIDTH = 800; //     private static final int CAMERA_HEIGHT = 480; //       private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f); // ,       private Camera mCamera; // ,       private Scene mScene; //  ,    . private PhysicsWorld mPhysicsWorld; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //   public Engine onLoadEngine() { DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); //      ,  //      . RatioResolutionPolicy    // .      ,    return new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mCamera)); } public void onLoadResources() { } public Scene onLoadScene() { //   .    ,     , . mScene = new Scene(1); //      ,  . this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); //      mScene.registerUpdateHandler(mPhysicsWorld); return mScene; } public void onLoadComplete() { } }
      
      







私たちは立ち上げ-そして、私たちは友好的な真空を見ます。 私たちの世界にはまだ何もありません。



2.テクスチャをロードします。 stepangoの例を少し改善しながら 、静的変数を使用します。 うわさはそれが良いということです。 これを行うには、別のクラスを作成します。



 public class Textures { private Texture mTexture; private static TextureRegion mBallTextureRegion; private static TextureRegion mBackgroundTextureRegion; public Textures(final BaseGameActivity activity, final Engine engine) { //      -   ""   //  . mTexture = new Texture(1024, 1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA); //   - 5121024. mBackgroundTextureRegion = TextureRegionFactory.createFromAsset( mTexture, activity, "gfx/bkg.png", 0, 0); //   -       // 512,0 -     . mBallTextureRegion = TextureRegionFactory.createFromAsset( mTexture, activity, "gfx/ball.png", 512, 0); engine.getTextureManager().loadTexture(mTexture); } public static TextureRegion getBackground() { return mBackgroundTextureRegion; } public static TextureRegion getBallTextureRegion() { return mBallTextureRegion; } }
      
      







対応するメソッドのアクティビティでこのオブジェクトを初期化する必要があります。



 public void onLoadResources() { //   mTextures = new Textures(this, getEngine()); }
      
      







静的オブジェクトを正しく処理していないという事実は、この例の本質ではありません。 良いことには、いくつかのシングルトンが登場するでしょう。



3.これでテクスチャができました。 onLoadSceneメソッドで、オブジェクト(側壁、床、ボール)を作成します。

メソッドは次のように変換されます。



 public Scene onLoadScene() { //   .    ,     , . mScene = new Scene(1); //      ,  . this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); //      mScene.setBackground(new SpriteBackground(new Sprite(0, 0, Textures.getBackground()))); //   -   Line line_top = new Line(0, 0, CAMERA_WIDTH, 0, 5.0f * metrics.density); Line line_left = new Line(0, 0, 0, CAMERA_HEIGHT, 5.0f * metrics.density); Line line_right = new Line(CAMERA_WIDTH, 0, CAMERA_WIDTH, CAMERA_HEIGHT, 5.0f * metrics.density); Line line_bottom = new Line(0, CAMERA_HEIGHT, CAMERA_WIDTH, CAMERA_HEIGHT, 5.0f * metrics.density); //      Body wall_top = PhysicsFactory.createLineBody(mPhysicsWorld, line_top, FIXTURE_DEF); Body wall_left = PhysicsFactory.createLineBody(mPhysicsWorld, line_left, FIXTURE_DEF); Body wall_right = PhysicsFactory.createLineBody(mPhysicsWorld, line_right, FIXTURE_DEF); Body wall_bottom = PhysicsFactory.createLineBody(mPhysicsWorld, line_bottom, FIXTURE_DEF); //    Sprite mSprite = new Sprite(0.0f, 0.0f, 100, 100, Textures.getBallTextureRegion()); //      mSprite.setPosition(100, 100); //     Body mBody = PhysicsFactory.createCircleBody(mPhysicsWorld, 100, 100, 50, 0, BodyType.DynamicBody, FIXTURE_DEF); //       this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_top, wall_top, true, true)); this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_left, wall_left, true, true)); this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_right, wall_right, true, true)); this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_bottom, wall_bottom, true, true)); mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(mSprite, mBody, true, true)); //     this.mScene.attachChild(mSprite); this.mScene.attachChild(line_top); this.mScene.attachChild(line_left); this.mScene.attachChild(line_right); this.mScene.attachChild(line_bottom); mScene.registerUpdateHandler(mPhysicsWorld); return mScene; }
      
      







以上です。 起動時には、背景があり、左上にボールがあります。 彼はすぐに倒れ始め、画面の端に到達し、跳ね返ります...そして、プログラマーの介入なしで、すべてが人生のようになります。



しばらくしてから、私は言うことができます:physics2boxは強力で興味深いものです。 ドキュメントと例には問題がありますが、より興味深いのはアプリケーションの作成プロセスです。



私の研究を助けてくれたステパンゴの記事へのリンクは次のとおりです。

habrahabr.ru/blogs/android_development/120716



All Articles