2

タッチを使用してスプライトでボディをドラッグ アンド ドロップしたい。スプライトをドラッグ アンド ドロップする方法は知っていますが、体を動かそうとすると... 動作せず、体が動かなくなります。さらに、体に触れるとアプリ全体がクラッシュすることがあります :x 指の移動中に他の体と衝突する物理体をドラッグ アンド ドロップする方法を教えてください。私は3日間探していて、落ち込んでいます:[

私は 3 つの同様のボディを作成しました。1 つは動的 (ホッケー ゲームのようなボールの跳ね返りのシミュレーション) で、そのうちの 2 つはキネマティック (プレイヤーが動かすことができます) です。動かしたいカラダの宣言をお見せします。表示するためにコードが必要かどうかはわかりませんが、非常に悪いチュートリアルにあるいくつかのインターフェイスを実装しました。:s

public class MainActivity extends SimpleBaseGameActivity implements IOnSceneTouchListener, IOnAreaTouchListener

宣言:

//Declaration:
         final Sprite face = new Sprite(CAMERA_WIDTH/2+200f, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager()) {
            @Override
            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
                this.setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY() - this.getHeight() / 2);
                return true;
            }
        };
        final FixtureDef MyFixtureDef = PhysicsFactory.createFixtureDef(0.2f,0.4f,0.6f);

        this.scene.registerUpdateHandler(this.mPhysicsWorld);
        face.setScale(3);

体:

final Body facebody = PhysicsFactory.createCircleBody(
        this.mPhysicsWorld, face, BodyType.KinematicBody,
        CIRCLE_FIXTURE_DEF);
    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face,
        facebody, true, true));
    facebody.setUserData("player1");

方法:

マウスジョイントをやってみた

  public MouseJoint createMouseJoint(IAreaShape face, float x, float y) {
final Body boxBody = this.mPhysicsWorld.getPhysicsConnectorManager()
    .findBodyByShape(face);

Vector2 v = boxBody.getWorldPoint(new Vector2(x / 32, y / 32));

MouseJointDef mjd = new MouseJointDef();
// mjd.bodyA = ballbody;
mjd.bodyB = boxBody;
mjd.dampingRatio = 0.2f;
mjd.frequencyHz = 30;
mjd.maxForce = (float) (200.0f * boxBody.getMass());
mjd.collideConnected = true;
mjd.target.set(v);
return (MouseJoint) this.mPhysicsWorld.createJoint(mjd);
}

onAreaTouched も?

@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
    if(pSceneTouchEvent.isActionDown()) {
        final IAreaShape face = (IAreaShape) pTouchArea;
        if(this.mMouseJointActive == null) {
            //this.mEngine.vibrate(100);
            this.mMouseJointActive = this.createMouseJoint(face, pTouchAreaLocalX, pTouchAreaLocalY);
        }
        return true;
    }
    return false;
}

ここでただ推測する

        @Override
        public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
            // TODO Auto-generated method stub
            if(pSceneTouchEvent.isActionDown()) {
                Debug.d("here!");
return true;
            }
            return false;
        }

    }

クラスに関する質問:

MainActivity 内でクラス player を宣言すると、次のようになります。

 class Player {
final Body facebody;
final Sprite face = new Sprite(MainActivity.CAMERA_WIDTH / 2+200f,240, MainActivity.mFaceTextureRegion ,getVertexBufferObjectManager()) {
        @Override
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
            final float pTouchAreaLocalX, final float pTouchAreaLocalY) {

        switch (pSceneTouchEvent.getAction()) {
        case TouchEvent.ACTION_MOVE:
            // Here 'body' refers to the Body object associated with
            // this sprite
            facebody.setTransform(pSceneTouchEvent.getX(),
                pSceneTouchEvent.getY(), facebody.getAngle());
            break;
        default:
            break;
        }
        return true;
        }
    };

    Player(Body f) {
        facebody = f;
    }

    }

すべてが完璧ですが、player.faceこの宣言では OnCreateScene で宣言できないと叫びます。

final Player player= new Player( PhysicsFactory.createCircleBody(   this.mPhysicsWorld, player.face, BodyType.KinematicBody,CIRCLE_FIXTURE_DEF));

これをどのように解決しますか?

4

2 に答える 2

4

ok finally I found good solution take it to onCreateScene:

        final AnimatedSprite face;
    final Body body;

    final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);


        face = new AnimatedSprite(CAMERA_WIDTH/2+200, CAMERA_HEIGHT/2, this.mCircleFaceTextureRegion, this.getVertexBufferObjectManager());
        face.setScale(3);
        body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);

    this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
    face.animate(new long[]{200,200}, 0, 1, true);
    face.setUserData(body);
    body.setUserData("player");
    this.mScene.registerTouchArea(face);
    this.mScene.attachChild(face);

on AreaTouched:

    @Override
public boolean onAreaTouched( final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea,final float pTouchAreaLocalX, final float pTouchAreaLocalY) {

    if(pSceneTouchEvent.isActionMove()) {

        final AnimatedSprite face = (AnimatedSprite) pTouchArea;
        final Body faceBody = (Body)face.getUserData();
        faceBody.setTransform(pSceneTouchEvent.getX() / PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, pSceneTouchEvent.getY() / PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, faceBody.getAngle());
        return true;
    }
    return false;
}

I didn't make class player, I took it to onCreateScene. And important part of drag and drop is to devide X and Y by PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT.

于 2012-07-13T09:46:58.767 に答える
0

問題を複雑にしすぎていると思います。一歩一歩進んでください:

  1. スプライトとそのスプライトのボディを作成します。あなたの問題の音によって、運動学的ではなく身体を動的にすることも試みますが、それはあなたの呼びかけです.
  2. スプライトの宣言で、onAreaTouched をオーバーライドします。次のように設定します。

    sprite = new Sprite(0, 0, this.mTextureRegion, activity.getVertexBufferObjectManager()) {
        @Override
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
    
            switch(pSceneTouchEvent.getAction()){
                case TouchEvent.ACTION_MOVE:
                    //Here 'body' refers to the Body object associated with this sprite
                    body.setTransform(pSceneTouchEvent.getX(),
                                      pSceneTouchEvent.getY(),
                                      body.getAngle());
                    break;
                default:
                    break;
            }
            return true;
        }
    };
    

これの最も重要な部分は、スプライトではなく、体を動かしていることです。これにより、スプライトが変換されます。

その後、顔をどのように動作させたいかに応じて、オブジェクトをキネマティックにするかダイナミックにするかを試します。

于 2012-07-10T18:45:31.367 に答える