SyntaxHighlighter

2012年1月9日月曜日

【AndEngine】TMX map を使った簡単な例 DigitalOnScreenControlでスプライトを移動

前回ではDigitalOnScreenControlでプレイヤーを操作するところまででした。

今回はDigitalOnScreenControlでプレイヤーを移動することをします。

概要
・physics worldを作成
・プレイヤーを物理シミュレーション上で動くようにBodyを作成
・DigitalOnScreenControlの操作でプレイヤーを動かす


public Scene onLoadScene() {
  this.mEngine.registerUpdateHandler(new FPSLogger());

  // Create physics world
  this.mPhysicsWorld = new FixedStepPhysicsWorld(30, new Vector2(0, 0), false, 3, 2);

  //Create the scene and register the physics world
  mScene = new Scene();
  mScene.registerUpdateHandler(this.mPhysicsWorld);

  //TMX mapの読み込み
  try {
    final TMXLoader tmxLoader = new TMXLoader(this, this.mEngine.getTextureManager(), // TextureOptions.BILINEAR_PREMULTIPLYALPHA,
        TextureOptions.NEAREST);
    this.mTMXTiledMap = tmxLoader.loadFromAsset(this, "tmx/ground1.tmx");
  } catch (final TMXLoadException tmxle) {
    Debug.e(tmxle);
  }

  // レイヤーをSceneに結びつける
  for (int i = 0; i < this.mTMXTiledMap.getTMXLayers().size(); i++){
    TMXLayer layer = this.mTMXTiledMap.getTMXLayers().get(i);
    mScene.attachChild(layer);

  }

  // カメラがTMXLayerの境界を超えないようにする
  final TMXLayer tmxLayer = this.mTMXTiledMap.getTMXLayers().get(0);
  this.mBoundChaseCamera.setBounds(0, tmxLayer.getWidth(), 0, tmxLayer.getHeight());
  this.mBoundChaseCamera.setBoundsEnabled(true);


  //プレイヤーの表示
  final int centerX = (CAMERA_WIDTH - this.mPlayerTextureRegion.getTileWidth()) / 2;
  final int centerY = (CAMERA_HEIGHT - this.mPlayerTextureRegion.getTileHeight()) / 2;

  final AnimatedSprite player = new AnimatedSprite(centerX, centerY, this.mPlayerTextureRegion);
  this.mBoundChaseCamera.setChaseEntity(player);
  final FixtureDef playerFixtureDef = PhysicsFactory.createFixtureDef(0, 0, 0.5f);
  final Body mPlayerBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, player,
      BodyType.DynamicBody, playerFixtureDef);
  this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(player,
      mPlayerBody, true, false){
    @Override
    public void onUpdate(float pSecondsElapsed){
      super.onUpdate(pSecondsElapsed);
      mBoundChaseCamera.updateChaseEntity();
    }
  });
  mScene.attachChild(player);

  //プレイヤーのコントロール
  this.mDigitalOnScreenControl = new DigitalOnScreenControl(0,
      CAMERA_HEIGHT - this.mOnScreenControlBaseTextureRegion.getHeight(),
      this.mBoundChaseCamera,
      this.mOnScreenControlBaseTextureRegion,
      this.mOnScreenControlKnobTextureRegion, 0.1f,
      new IOnScreenControlListener() {
    public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl,
        final float pValueX, final float pValueY) {
      // Set the correct walking animation
      if (pValueY == 1){
        // Up
        if (playerDirection != PlayerDirection.UP){
          player.animate(ANIMATE_DURATION, 0, 2, true);
          playerDirection = PlayerDirection.UP;
        }
      }else if (pValueY == -1){
        // Down
        if (playerDirection != PlayerDirection.DOWN){
          player.animate(ANIMATE_DURATION, 9, 11, true);
          playerDirection = PlayerDirection.DOWN;
        }
      }else if (pValueX == -1){
        // Left
        if (playerDirection != PlayerDirection.LEFT){
          player.animate(ANIMATE_DURATION, 3, 5, true);
          playerDirection = PlayerDirection.LEFT;
        }
      }else if (pValueX == 1){
        // Right
        if (playerDirection != PlayerDirection.RIGHT){
          player.animate(ANIMATE_DURATION, 6, 8, true);
          playerDirection = PlayerDirection.RIGHT;
        }
      }else{
        if (player.isAnimationRunning()){
          player.stopAnimation();
          playerDirection = PlayerDirection.NONE;
        }
      }
      // Set the player's velocity
      mPlayerBody.setLinearVelocity(pValueX * PLAYER_VELOCITY, pValueY * PLAYER_VELOCITY);
    }
  });
  this.mDigitalOnScreenControl.getControlBase().setBlendFunction(GL10.GL_SRC_ALPHA,
      GL10.GL_ONE_MINUS_SRC_ALPHA);
  this.mDigitalOnScreenControl.getControlBase().setAlpha(0.5f);
  this.mDigitalOnScreenControl.getControlBase().setScaleCenter(0, 128);
  this.mDigitalOnScreenControl.getControlBase().setScale(1.25f);
  this.mDigitalOnScreenControl.getControlKnob().setScale(1.25f);
  this.mDigitalOnScreenControl.getControlKnob().setAlpha(0.5f);
  this.mDigitalOnScreenControl.refreshControlKnobPosition();

  mScene.setChildScene(this.mDigitalOnScreenControl);

  return mScene;
}


解説
前回のコードに追記する形でonLoadScene()メソッド内のコードを載せています。

5行目でphysics worldを作成しています。
これを9行目でSceneに対UpdateHandlerとして登録しています。

physics worldについては以下を参考にしてください。
AndEnginePhysicsBox2DExtension::Creating A Physicsworld

38から49行目でBodyを作成しています。

93行目でBodyに対して速度を設定しています。

以上でプレイヤーはDigitalOnScreenControlの操作で移動することができます。





0 件のコメント:

コメントを投稿