2011-07-23 21 views
2

スプライトの本体をラインのある部分に沿って移動させたいのですが、スプライトだけを動かすことはできますが、ボディは動いていません。andEngineを使ってスプライトのボディを移動する方法は?

public Scene onLoadScene() { 
    this.mEngine.registerUpdateHandler(new FPSLogger()); 
    final Scene scene = new Scene(2); 
    scene.setBackground(new ColorBackground(0.09804f, 0.00274f, 0.0784f)); 
    this .enableAccelerometerSensor(this); 
    this.sPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); 
    final Shape ground = new Rectangle(0, CAMERA_HEIGHT - 2, CAMERA_WIDTH,2); 
    final Shape roof = new Rectangle(0, 0, CAMERA_WIDTH, 2); 
    final Shape left = new Rectangle(0, 0, 2, CAMERA_HEIGHT); 
    final Shape right = new Rectangle(CAMERA_WIDTH-2, 0,2, CAMERA_HEIGHT); 


    PhysicsFactory.createBoxBody(this.sPhysicsWorld, ground, 
      BodyType.StaticBody, wallFixtureDef); 
    PhysicsFactory.createBoxBody(this.sPhysicsWorld, roof, 
      BodyType.StaticBody, wallFixtureDef); 
    PhysicsFactory.createBoxBody(this.sPhysicsWorld, left, 
      BodyType.StaticBody, wallFixtureDef); 
    PhysicsFactory.createBoxBody(this.sPhysicsWorld, right, 
      BodyType.StaticBody, wallFixtureDef); 
    scene.getFirstChild().attachChild(ground); 
    scene.getFirstChild().attachChild(roof); 
    scene.getFirstChild().attachChild(left); 
    scene.getFirstChild().attachChild(right); 

    final int centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth())/2; 
    final int centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion.getHeight())/2; 
    final AnimatedSprite face = new AnimatedSprite(centerX - 100, centerY, this.mFaceTextureRegion); 
    final Body bodyRedBall = PhysicsFactory.createCircleBody(this.sPhysicsWorld, face, 
      BodyType.DynamicBody, wallFixtureDef); 
    this.sPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, bodyRedBall, true, true)); 
    scene.attachChild(face); 

    final AnimatedSprite face2 = new AnimatedSprite(100, 100, this.mFaceTextureRegion); 
    final Body bodyRedBall2 = PhysicsFactory.createCircleBody(this.sPhysicsWorld, face2, 
      BodyType.KinematicBody, wallFixtureDef); 
    final Path path4 = new Path(3).to(682, 223).to(482, 223).to(682, 223); 

    face2.registerEntityModifier(new LoopEntityModifier(new PathModifier(30, path4, null, new IPathModifierListener() { 
      @Override 
      public void onWaypointPassed(final PathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex) {    
      } 
     }))); 
    this.sPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face2, bodyRedBall2, true, true){ 
     @Override 
     public void onUpdate(final float pSecondsElapsed) { 
       super.onUpdate(pSecondsElapsed); 
       face2.setPosition(face2.getX(), face2.getY()); 
     } 
}); 


     scene.attachChild(face2);   
    scene.registerUpdateHandler(this.sPhysicsWorld); 
    return scene; 
} 

@Override 
public void onLoadComplete() { 
} 

@Override 
public void onAccelerometerChanged(AccelerometerData pAccelerometerData) { 
    // TODO Auto-generated method stub 
    final Vector2 gravity = Vector2Pool.obtain(pAccelerometerData.getY(), pAccelerometerData.getX()); 
    this.sPhysicsWorld.setGravity(gravity); 
    Vector2Pool.recycle(gravity); 
} 

答えて

1

のsetTransformに

yourBody.setTransform(new Vector2(x/32,y/32), 0); 

を使用すると、あなたはあなたが体を動かすためにbody.setLinearVelocity();を使用することができます32

8

で、xとyのデフォルトを分割する必要があることを忘れてはならない体を動かすために、スプライトフィジックスコネクタを指定したため、自動的にボディに追従します。

+0

おかげで分割する必要があるピクセルにそれを得るために32で分割する必要があります投稿用。それは本当に動作します –

0

あなたも

yourBody.setTransform(x/32,y/32), 0);

行くことができるとBOX2Dをピクセル単位で動作していないので、あなたは、あなたが32の

2
public class MoveBodyModifier extends MoveModifier { 

private Body mBody; 

public MoveBodyModifier(float pDuration, float pFromX, float pToX, float pFromY, float pToY, Body body) { 
    super(pDuration, pFromX, pToX, pFromY, pToY); 
    mBody = body; 
} 

@Override 
protected void onSetInitialValues(IEntity pEntity, float pX, float pY) { 
    mBody.setTransform(pX/ PhysicsConnector.PIXEL_TO_METER_RATIO_DEFAULT, 
      pY/ PhysicsConnector.PIXEL_TO_METER_RATIO_DEFAULT, mBody.getAngle()); 
} 

@Override 
protected void onSetValues(IEntity pEntity, float pPercentageDone, float pX, float pY) { 
    mBody.setTransform(pX/ PhysicsConnector.PIXEL_TO_METER_RATIO_DEFAULT, 
      pY/ PhysicsConnector.PIXEL_TO_METER_RATIO_DEFAULT, mBody.getAngle()); 
} 
} 
+0

答えにコードブロックをダンプするのではなく、あなたのコードを説明するのが一般に役に立ちます。 – ydaetskcoR

+1

**説明:** MoveModifierクラスを拡張して、スプライトとともにボディを変形/移動するコードを追加します。 MoveModifierではなくMoveBodyModifierを使用して修飾子オブジェクトを作成しますが、本文ではなくスプライトにエンティティ修飾子を登録し続けます。このように: 'MoveBodyModifier mm = new MoveBodyModifier(0.25f、fromX、toX、fromY、toY、this.playerBody); \t \t \t playerFace.registerEntityModifier(mm);「私はこれをしばらく苦労していました。完璧に働いた。ラミーに感謝します。 :-) – AndroidMechanic

+0

あなたはようこそ;) – Rami

関連する問題