andengine施力

时间:2011-07-28 17:37:45

标签: android andengine

有谁知道为什么applyforce只适用于我的一个精灵?此外,当我按下其他精灵时,它也会对一个单独的精灵施加力。 nextTile方法工作正常。

enter code here包com.martynnorman.jude;

/ **  * @author Nicolas Gramlich  * @since 11:54:51 - 03.04.2010  * / 公共类MainActivity扩展BaseGameActivity实现IOnAreaTouchListener {     // ================================================ ===========     //常数     // ================================================ ===========

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

私有静态最终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;
}       
private void onOff(final AnimatedSprite ball) {
    ball.nextTile();
    body.applyForce(new Vector2(200,-1500), new Vector2(body.getWorldCenter()));
}

}

1 个答案:

答案 0 :(得分:2)

这是因为你只有一个Body - 变量,它会被循环覆盖。当所有精灵都被创建时,你只知道最后一个精灵的身体。

您必须将力施加到与您单击的精灵相关联的身体。