2012-01-12 4 views
3

私はAndEngineでこのメソッドを使用して、ユーザーがタッチしているシーンを判別しています。PathModifierまたはMoveYModifierを使用してスプライトジャンプをシミュレートする

@Override 
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 
    if(pSceneTouchEvent.isActionDown()) { 
     Log.e("Arcade", "Scene Tapped"); 
        //Simulate player jumping 

    } 
    return false; 
} 

私がしたいことは、シーンがタップされているときに、プレイヤーがジャンプできるようにしたい場合です。

PathModifier、またはMoveYModifierを使用する方がよいでしょう。これはランドスケープモードだと考えていますか? いずれかの例を示してください。 おかげ

EDIT:

は、IVEは、これを使用してジャンプをシミュレートするために物理学を使用するために管理...

@Override 
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 
    if(pSceneTouchEvent.isActionDown()) { 
     Log.e("Arcade", "Scene Tapped"); 

      final Vector2 velocity = Vector2Pool.obtain(mPhysicsWorld.getGravity().x * -0.5f,mPhysicsWorld.getGravity().y * -0.5f); 
      body.setLinearVelocity(velocity); 
      Vector2Pool.recycle(velocity); 
     return true; 
    } 
    return false; 
} 

あなたは重力を変更することで、答えに言ったように。唯一の問題は、ユーザーが画面に触れ続けているときにスプライトが継続して上がったり上がったりすることです。スプライトが地面に当たるまで、ユーザーが一度だけクリックして傾けることができない場所を設定するにはどうしたらいいですか?

+0

私はパスを使用してカスタムシェイプを作成し、キャンバスに描画しました。左上隅からドラッグしてシェイプのサイズを変更しようとしていますが、そのパラメータは左上隅から再サイズに変更されます。かたち? –

答えて

3

MoveYModifierを使用してください。覚えておきますが、あなたは必要な数の修飾子を登録することができます。したがって、例えばプラットフォームゲームのゲームでキャラクターが常にX軸上を移動し、望むならば重力ガイやユン・ニンジャのようにジャンプすることができますが、これらのゲームは重力を変えます。

あなたができるように:

Entity playerEntity = ..//It doesn't matter if the player is a sprite, animated sprite, or anything else. So I'll just use Entity here, but you can declare your player as you wish. 

final float jumpDuration = 2; 
final float startX = playerEntity.getX(); 
final float jumpHeight = 100; 

final MoveYModifier moveUpModifier = new MoveYModifier(jumpDuration/2, startX, startX + jumpHeight); 
final MoveYModifier moveDownModifier = new MoveYModifier(jumpDuration/2, startX + jumpHeight, startX); 
final SequenceEntityModifier modifier = new SequenceEntityModifier(moveUpModifier, moveDownModifier); 

playerEntity.registerEntityModifier(modifier); 

EDIT:あなたの2番目の質問については

  1. シーン内の変数boolean mIsJumpingを作成します。ジャンプが始まると、trueに設定します。ユーザが画面をタップしてmIsJumping == trueを入力した場合、にジャンプしません。
  2. PhysicsWorldContactListenerを登録してください。プレーヤーと地面の間に接触があるときはいつでも、mIsJumpingfalseに設定します。

ContactListenerをAndEngineフォーラムで使用しているサンプルがたくさんありますが、quick searchがいくつかあります。あなたは例が必要な場合は、1 :)

EDIT 2を求めることができます:ContactListenerサンプル:private static final String PLAYER_ID = "player", GROUND_ID = "ground";

  • ます:

    1. は、プレイヤーと地面のIDを保持する2つの変数を持っていますplayerBody.setUserData(PLAYER_ID);groundBody.setUserData(GROUND_ID);
    2. は、シーン内のフィールドとしてContactListenerを作成します:

      グランド体とプレーヤー本体を作成し、ユーザデータとしてそのIDを設定します
      private ContactListener mContactListener = new ContactListener() { 
      /** 
      * Called when two fixtures begin to touch. 
      */ 
      public void beginContact (Contact contact) { 
          final Body bodyA = contact.getFixtureA().getBody(); 
          final Body bodyB = contact.getFixtureB().getBody(); 
      
          if(bodyA.getUserData().equals(PLAYER_ID)) { 
           if(bodyB.getUserData().equals(GROUND_ID)) 
            mIsJumping = false; 
          } 
          else if(bodyA.getUserData().equals(GROUND_ID)) { 
           if(bodyB.getUserData().equals(PLAYER_ID)) 
            mIsJumping = false; 
          } 
      
      } 
      
      /** 
      * Called when two fixtures cease to touch. 
      */ 
      public void endContact (Contact contact) { } 
      
      /** 
      * This is called after a contact is updated. 
      */ 
      public void preSolve(Contact pContact) { } 
      
      /** 
      * This lets you inspect a contact after the solver is finished. 
      */ 
      public void postSolve(Contact pContact) { } 
      }; 
      
    3. 最後に、その連絡先のリスナーを登録します。physicsWorld.setContactListener(mContactListener);

    EDIT 3:

    をX軸上にスプライトを移動するには、Body.applyForceメソッドを使用して力を加えることができる、またはBody.applyLinearImpulseメソッドを使用してインパルスを適用します。引数を使って遊び、次のものが何かを見つける。

    ベクターはX部分のみで構成する必要があります。試してくださいVector2 force = Vector2Pool.obtain(50, 0);。このようにして力を加えます:body.applyForce(force, body.getWorldCenter());

  • +0

    ありがとうございました!あなたが言及したように、私はMoveYModifierよりも優れた物理学を使ってそれを行う方法を見つけました。ジャンプは現実的に見えます。私が抱えている唯一の問題は、私の編集で述べたことです。見てみな。 –

    +0

    Box2Dまたは 'PhysicsHandler'を使用していますか? – Jong

    +0

    私は新しいGLES2 Box2Dエクステンションを使用しています。 –

    関連する問題