0

画面上でダイナミックなボディをスムーズに動かすための解決策を見つけるために、私は多くのことを試みました。マウス ジョイントは私には機能しません。滑らかな動きには役立たないラバー バンド効果があります。また、線速度を適用してボールを動かそうとしましたが、できませんでした。体に単純なタッチの動きを与えるオプションは何ですか? たとえば、グローホッケーに似ていますか?

答えは、AndEngine に固有のものである必要はありません。Cocos2d も同様に機能します。

Touchリスナーを登録し、次を使用して「移動」アクションで体を動かそうとしました:

public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
         switch(pSceneTouchEvent.getAction()){
         case TouchEvent.ACTION_DOWN:

             break;
            case TouchEvent.ACTION_MOVE:
                strikerBody.setLinearVelocity((pSceneTouchEvent.getX()-strikerBody.getPosition().x * PIXEL_TO_METER_RATIO_DEFAULT),(pSceneTouchEvent.getY()-strikerBody.getPosition().y * PIXEL_TO_METER_RATIO_DEFAULT));

                break;
            case TouchEvent.ACTION_UP:

                 break;
            default:
                break;
        }}

体は正しい方向に動きますが、指の動きが少し速ければ、速度の大きさが増すにつれて、指から離れていきます。

4

3 に答える 3

2

マウスジョイントを使わないと物理体の動きが楽になりません。マウス ジョイントの定義の値を変更すると、確実に目的の効果が得られます。

マウス ジョイントのデフォルトの動作は非常に弾力性があります。必要に応じて変更する必要があります。1 つの値セット、私に役立つものを提供します。あなたがあなたの側をチェックすること。

mouseJointDef.bodyA = this.mGroundBody;
mouseJointDef.bodyB = body;
mouseJointDef.dampingRatio = 4f;
mouseJointDef.frequencyHz = 30;
mouseJointDef.maxForce = (1000.0f * body.getMass());
mouseJointDef.collideConnected = true;
于 2013-07-12T16:23:26.727 に答える
1

提案をありがとうございました。最終的に、線形速度を使用して動作するようになりました。今はかなりスムーズです。ユーザーがタッチを使用して画面上で体を動かそうとすると、指が体に触れたり離れたりすることがあります。したがって、線速度は次の 2 つの場合に割り当てられます。

  1. 移動中に指が体に触れているとき ( onAreaTouched )
  2. 指がボディに触れておらず、動いている場合 ( onSceneTouchEvent )

    両方のイベントで次の行を使用すると、動きがスムーズになりました。

    case TouchEvent.ACTION_MOVE: body.setLinearVelocity((pSceneTouchEvent.getX()-body.getPosition().x * PIXEL_TO_METER_RATIO_DEFAULT),(pSceneTouchEvent.getY()-body.getPosition().y * PIXEL_TO_METER_RATIO_DEFAULT));

于 2013-07-12T17:33:22.827 に答える
0

私が見る限り、 setPosition は役に立ちません (体が速度を失い、衝突に影響を与えるため)?

2つのタッチイベント間の時間を測定し、それに応じて速度を計算します。速度は時間/時間であるため、ベロは(一定の時間で)ちょうどいいので、指の動きが速いときの速度が遅いことを説明できますね。 ?

このようなことを試してください:

public class YourTouchListener {
  long lastTouch = 0;
  public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, 
    final ITouchArea pTouchArea, final float pTouchAreaLocalX, 
    final float pTouchAreaLocalY) {

      switch(pSceneTouchEvent.getAction()){
      case TouchEvent.ACTION_DOWN:
        this.lastTouch = System.currentTimeMillis();
        break;
      case TouchEvent.ACTION_MOVE:
        long time = System.getCurrentTimeMillis() - lastTouch;
        if (time > 0)
          strikerBody.setLinearVelocity(
            1000* (pSceneTouchEvent.getX() - strikerBody.getPosition().x * 
              PIXEL_TO_METER_RATIO_DEFAULT)/time,               
            1000 * (pSceneTouchEvent.getY()-strikerBody.getPosition().y * 
              PIXEL_TO_METER_RATIO_DEFAULT)/time);
        break;
      case TouchEvent.ACTION_UP:
        this.lastTouch = 0;
        break;
      default:
        break;
    }
  }
}

これが最初の試行で正しく機能することを約束することはできません (bc 時間単位が正しいかどうかはわかりませんが、秒を想定しているため、(1000 * way) / (seconds*1000) が正しいはずです) またはそれはまったく機能しますが、試したことはありません。

TouchEvent.ACTION_DOWNおそらく、ボディが a なしでは動かず、TouchEvent.ACTION_MOVE時間を測定していない場合 (0 による除算)に備えて、setPosition(x,y) を使用する必要があります。

于 2013-07-12T16:22:57.533 に答える