Frage

Ich verwende diese Methode in AndEngine, um die Szene zu bestimmen, die vom Benutzer berührt wird.

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

     }
    return false;
}

Wenn ich auf die Szene tippe, möchte ich dem Spieler erlauben, zu springen.

Nun zwei Dinge, wäre es besser, PathModifier oder MoveYModifier zu verwenden, wenn man bedenkt, dass es sich um den Querformatmodus handelt? Wenn ja, geben Sie bitte ein Beispiel dafür an. Danke

BEARBEITEN:

Ich habe es geschafft, mithilfe der Physik einen Sprung zu simulieren.

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

Wie Sie in der Antwort gesagt haben, indem Sie die Schwerkraft ändern.Das einzige Problem ist, wenn der Benutzer den Bildschirm berührt, steigen die Sprites immer weiter an.Wie kann ich festlegen, dass der Benutzer nur einmal klicken kann und ihn nicht erneut springen lässt, bis das Sprite auf den Boden trifft, der ein Rechteck ist?

War es hilfreich?

Lösung

Verwenden Sie den MoveYModifier. Denken Sie daran, dass Sie so viele Modifikatoren registrieren können, wie Sie möchten. Wenn zum Beispiel das Spiel ein Plattformspiel ist und sich der Charakter immer auf der X-Achse bewegt und er springen kann, wenn er will (wie Gravity Guy oder Yoo Ninja, obwohl diese Spiele die Schwerkraft ändern, was etwas anderes ist).

Sie könnten Folgendes tun:

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:

Für Ihre zweite Frage:

  1. Erstellen Sie einen variablen boolean mIsJumping in Ihrer Szene. Wenn der Sprung beginnt - setzen Sie ihn auf true. Wenn der Benutzer auf den Bildschirm und den generischen Codetagcode tippt, springen Sie nicht .
  2. Registrieren Sie jetzt ein ContactListener zu Ihrem mIsJumping == true. Wenn zwischen dem Spieler und dem Boden Kontakt besteht, setzen Sie PhysicsWorld auf mIsJumping.

    Es gibt viele Beispiele für die Verwendung von falses in AndEngine-Foren, a Schnellsuche liefert einige. Wenn Sie ein Beispiel benötigen, können Sie nach einem fragen :)

    BEARBEITEN 2: ContactListener-Beispiel:

    1. Haben Sie 2 Variablen, um IDs für den Spieler und den Boden zu speichern: ContactListener
    2. Wenn Sie den Grundkörper und den Spielerkörper erstellen, legen Sie deren IDs als Benutzerdaten fest: private static final String PLAYER_ID = "player", GROUND_ID = "ground"; und playerBody.setUserData(PLAYER_ID);
    3. Erstellen Sie einen groundBody.setUserData(GROUND_ID); als Feld in Ihrer Szene:

      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. Registrieren Sie zuletzt den Kontakt-Listener: ContactListener

      BEARBEITEN 3:

      Um Ihr Sprite über die X-Achse zu bewegen, können Sie eine Kraft mit der physicsWorld.setContactListener(mContactListener);-Methode oder einen Impuls mit der Body.applyForce-Methode anwenden. Spielen Sie mit den Argumenten herum und finden Sie heraus, was als nächstes funktioniert.

      Der Vektor sollte nur aus einem X-Teil bestehen. Versuchen Sie es mit Body.applyLinearImpulse. Wenden Sie dann die Kraft folgendermaßen an: Vector2 force = Vector2Pool.obtain(50, 0);.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top