Использование PathModifier или MoveYModifier для имитации спрайта - PullRequest
3 голосов
/ 12 января 2012

Я использую этот метод в 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;
}

Как вы сказали в ответ, изменив гравитацию.Единственная проблема заключается в том, что когда пользователь продолжает касаться экрана, спрайты продолжают расти вверх и вверх.Как я могу установить его так, чтобы пользователь мог щелкнуть только один раз и не мог заставить его прыгать снова, пока спрайт не упал на землю, что является прямоугольником?

1 Ответ

3 голосов
/ 12 января 2012

Используйте 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 s на форумах AndEngine, быстрый поиск 1031 * дает немного.Если вам нужен пример, вы можете запросить один из них:игрок и земля: private static final String PLAYER_ID = "player", GROUND_ID = "ground"; Когда вы создаете тело земли и тело игрока, задайте их идентификаторы в качестве пользовательских данных: playerBody.setUserData(PLAYER_ID); и groundBody.setUserData(GROUND_ID);

Создатьa 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) { }
};

Наконец, зарегистрируйте прослушиватель этого контакта: physicsWorld.setContactListener(mContactListener);

EDIT 3:

Чтобы переместить ваш спрайт по оси X, вы можете применить силу, используя метод Body.applyForce, или применить импульс, используя метод Body.applyLinearImpulse.Поиграйте с аргументами и найдите, что работает дальше.

Вектор должен состоять только из части X;Попробуйте Vector2 force = Vector2Pool.obtain(50, 0);.Затем примените силу следующим образом: body.applyForce(force, body.getWorldCenter());.

...