2011-07-28 10 views
5

¿Alguien sabe por qué aplicaforce solo funciona en uno de mis sprites? También cuando presiono los otros sprites también aplica fuerza al único sprite individual. El método nextTile funciona bien. com.martynnorman.judeandengine aplicar fuerza

enter code here paquete;

/** * @author Nicolas Gramlich * @since 11:54:51 - 03.04.2010 */ MainActivity clase pública se extiende BaseGameActivity implementa IOnAreaTouchListener {// ========= =============================================== // // Constantes =========================================== ================

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

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

}

Respuesta

2

Se debe a que sólo tiene un Body -Variable, y se sobreescribe por el bucle. Cuando se han creado todos los sprites, solo se conoce el cuerpo del último sprite.

Debe aplicar la fuerza al cuerpo asociada con el sprite se hace clic.

+0

Sí. Lo pasé con Hashtable privado ballBodies = new Hashtable (); –

Cuestiones relacionadas