开发者

andengine apply force

does anyone know why applyforce only works on one of my sprites? Also when I press the other sprites it also applies force to the one individual sprite. The nextTile method works fine.

enter code herepackage com.martynnorman.jude;

/** * @author Nicolas Gramlich * @since 11:54:51 - 03.04.2010 */ public class MainActivity extends BaseGameActivity implements IOnAreaTouchListener { // =========================================================== // Constants // ===========================================================

private static final int CAMERA_WIDTH = 720;
private static final int CAMERA_HEIGHT = 480;
int centerX;
int centerY;


// ===========================================================
// Fields
// ===========================================================

private Camera mCamera;

private BitmapTextureAtlas mBitmapTextureAtlas;
private TiledTextureRegion mFaceTextureRegion;
private BitmapTextureAtlas mBitmapTextureAtlas2;
private TiledTextureRegion mFaceTextureRegion2;
Random random = new Random();
Ball sprite;
int scale;
Scene scene;
private BitmapTextureAtlas mFontTexture;
private Font mFont;
Text textcenter;
int t = 1;
Ball rgSprite[] = new Ball[10];
private PhysicsWorld mPhysicsWorld;
Body body;
int isTouched;
final Vector2 gravity2 = new Vector2(0, 20);
final Vector2 gravity = new Vector2(0, 0);

private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);

// ===========================================================
// Constructors
// ===========================================================

// ===========================================================
// Getter & Setter
// ===========================================================

// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================

@Override
public Engine onLoadEngine() {
    this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
    return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mCamera));
}

@Override
public void onLoadResources() {

    this.mBitmapTextureAtlas = new BitmapTextureAtlas(64, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "gfx/ball.png", 0, 0, 2, 1);
    this.mBitmapTextureAtlas2 = new BitmapTextureAtlas(64, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    this.mFaceTextureRegion2 = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas2, this,"gfx/ball2.png", 0, 0, 2, 1);
    this.mFontTexture = new BitmapTextureAtlas(256, 256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    this.mFont = new Font(this.mFontTexture, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.BLACK);
    this.mEngine.getTextureManager().loadTextures(this.mBitmapTextureAtlas, mBitmapTextureAtlas2);
    this.mEngine.getFontManager().loadFont(this.mFont);
    this.mEngine.getTextureManager().loadTexture(this.mFontTexture);


}

@Override
public Scene onLoadScene() {

     createAETimeHandler(2);
     /* final Text textcenter = new Text(100, 60, this.mFont, "touched", HorizontalAlign.CENTER);
      this.mFontTexture = new BitmapTextureAtlas(256, 256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
      this.mFont = new Font(this.mFontTexture, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.BLACK);*/
     final Scene scene = new Scene();
     scene.setOnAreaTouchListener(this);
     scene.setBackground(new ColorBackground(0.6274f, 0.6274f, 0.8784f)); 





  mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false);
  scene.registerUpdateHandler(mPhysicsWorld);
  mPhysicsWorld.setGravity(gravity);

  final Shape ground = new Rectangle(0, CAMERA_HEIGHT - 2, CAMERA_WIDTH, 2);
  final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);
  PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixtureDef);
  scene.attachChild(ground);

  final Shape left = new Rectangle(0, 0, 2, CAMERA_HEIGHT);
  final Shape right = new Rectangle(CAMERA_WIDTH - 2, 0, 2, CAMERA_HEIGHT);
  final Shape roof = new Rectangle(0, 0, CAMERA_WIDTH, 2);
  PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixtureDef);
  PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixtureDef);
  PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixtureDef);
  scene.attachChild(left);
  scene.attachChild(right);
  scene.attachChild(roof);


     // scene.setOnSceneTouchListener((IOnSceneTouchListener) this);
    //final Ball hit = new Ball(random.nextInt(600)+1, random.nextInt(400)+1, this.mFaceTextureRegion.clone());
    //final Ball hit2 = new Ball(random.nextInt(600)+1, random.nextInt(400)+1, this.mFaceTextureRegion2.clone());
    //body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, hit2, BodyType.DynamicBody, FIXTURE_DEF);
    //scene.attachChild(hit2); 
    //hit2.setScale(2);
    //scene.registerTouchArea(hit2);
    //this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(hit2, body, true, true));

        for (int i = 0; i < rgSprite.length; i++) {


                rgSprite[i] =  new Ball(random.nextInt(600)+1, 200, this.mFaceTextureRegion.clone());

                    }


        mPhysicsWorld.setGravity(gravity2);

        for (Ball sprite : rgSprite) { 


            body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, sprite, BodyType.DynamicBody, FIXTURE_DEF);
            this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sprite, body, true, true));
            scene.registerTouchArea(sprite);
            scene.attachChild(sprite);
            sprite.setScale(2);
       }

        //scene.attachChild(hit); 
        //hit.setScale(2);
        //scene.registerTouchArea(hit);





    return scene;


}
@Override
public void onLoadComplete() {

}
private void createAETimeHandler(float mEffectSpawnDelay)
{ TimerHandler spriteTimerHandler2;
    this.getEngine().registerUpdateHandler(spriteTimerHandler2 = new TimerHandler(mEffectSpawnDelay, true, new ITimerCallback()
    {                      
        @Override
        public void onTimePassed(final TimerHandler pTimerHandler)
        {     

            /*if (isTouched == 1){


                mFaceTextureRegion.setCurrentTileIndex(0);
                isTouched = 2;



            }  */          

        }
    }));
}



// ===========================================================
// Methods
// ===========================================================

// ===========================================================
// Inner and Anonymous Classes
// ===========================================================




@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent, ITouchArea pTouchArea, float pTouchAreaLocalX,float pTouchAreaLocalY) {
    if(this.mPhysicsWorld != null) {

         if (pSceneTouchEvent.getAction() == MotionEvent.ACTION_DOWN) {          
           this.onOff((AnimatedSprite)pTouchArea);

               } 
        }    return false;
}开发者_StackOverflow社区       
private void onOff(final AnimatedSprite ball) {
    ball.nextTile();
    body.applyForce(new Vector2(200,-1500), new Vector2(body.getWorldCenter()));
}

}


It is because you only have one Body-variable, and it gets overwritten by the loop. When all sprites have been created you only know the body of the last sprite.

You must apply the force to the body associated with the sprite you click.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜