استخدام PathModifier أو MoveYModifier لمحاكاة قفز الكائنات

StackOverflow https://stackoverflow.com/questions/8830425

  •  27-10-2019
  •  | 
  •  

سؤال

أنا أستخدم هذه الطريقة في AndEngine لتحديد المشهد الذي يلمسه المستخدم.

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

     }
    return false;
}

ما أريد القيام به هو أنه عندما يتم النقر على المشهد، أريد السماح للاعب بالقفز.

الآن هناك شيئان هل من الأفضل استخدام PathModifier، أو MoveYModifier مع اعتباره وضعًا أفقيًا؟إذا كان الأمر كذلك يرجى تقديم مثال على ذلك.شكرًا

يحرر:

لقد تمكنت من استخدام الفيزياء لمحاكاة القفزة باستخدام هذا..

@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;
}

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

هل كانت مفيدة؟

المحلول

استخدم ال MoveYModifier.تذكر أنه يمكنك تسجيل أي عدد تريده من المعدلات.لذلك، على سبيل المثال، إذا كانت اللعبة عبارة عن لعبة منصة والشخصية تتحرك دائمًا على المحور X، ويمكنه القفز إذا أراد (مثل Gravity Guy أو Yoo Ninja، على الرغم من أن هذه الألعاب تغير الجاذبية وهو شيء آخر).

يمكنك أن تفعل مثل:

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);

يحرر:

بالنسبة لسؤالك الثاني:

  1. إنشاء متغير boolean mIsJumping في مشهدك؛عندما تبدأ القفزة - اضبطها على true.إذا قام المستخدم بالنقر على الشاشة و mIsJumping == true, لا القفز.
  2. الآن سجل أ ContactListener لك PhysicsWorld.عندما يكون هناك اتصال بين اللاعب والأرض، اضبطه mIsJumping ل false.

هناك العديد من عينات الاستخدام ContactListenerفي منتديات AndEngine، أ بحث سريع ينتج بعض.إذا كنت بحاجة إلى مثال، يمكنك أن تسأل عن واحد :)

تحرير 2: ContactListener عينة:

  1. لديك متغيرين للاحتفاظ بمعرفات اللاعب والأرض: private static final String PLAYER_ID = "player", GROUND_ID = "ground";
  2. عندما تقوم بإنشاء الجسم الأرضي وجسم اللاعب، قم بتعيين معرفاتهم كبيانات المستخدم: playerBody.setUserData(PLAYER_ID); و groundBody.setUserData(GROUND_ID);
  3. إنشاء ContactListener كحقل في المشهد الخاص بك:

    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) { }
    };
    
  4. أخيرًا، قم بتسجيل مستمع جهة الاتصال: physicsWorld.setContactListener(mContactListener);

تحرير 3:

لتحريك الكائن الخاص بك فوق المحور X، يمكنك تطبيق القوة باستخدام Body.applyForce طريقة، أو تطبيق دفعة باستخدام Body.applyLinearImpulse طريقة.العب مع الحجج واعثر على ما يصلح بعد ذلك.

يجب أن يتكون المتجه من جزء X فقط؛يحاول Vector2 force = Vector2Pool.obtain(50, 0);.ثم طبق القوة بهذه الطريقة: body.applyForce(force, body.getWorldCenter());.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top