Как переместить тело спрайта с помощью andEngine? - PullRequest
2 голосов
/ 23 июля 2011

Я хочу переместить тело спрайта вместе со строкой в ​​некоторой части строки, просто я могу перемещать только спрайт, но тело не движется.

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

Ответы [ 4 ]

8 голосов
/ 06 января 2012

Вы можете использовать body.setLinearVelocity(); для перемещения тела, спрайт будет автоматически следовать за телом, потому что вы указали физический соединитель.

2 голосов
/ 06 мая 2014
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());
}
}
1 голос
/ 29 августа 2011

для перемещения тела необходимо использовать setTransform

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

и помните, что вы должны разделить x и y по умолчанию на 32

0 голосов
/ 22 февраля 2013

Вы также можете пойти

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

и вам нужно разделить на 32, потому что box2d не работает в пикселях, поэтому, чтобы получить его в пикселях, вам нужно разделить на 32

...