2011-12-10 31 views
0

我正在研究一個小遊戲/項目,我決定使用AndEngine,因爲基本上該引擎中的添加/刪除物理功能是我所需要的。但似乎我有一個小問題。我必須在場景中添加36張不同的圖片,並能夠在選擇時刪除它們。問題是我的圖像被損壞,並沒有顯示所有的圖像,只是前兩個。我錯過了什麼,或者我錯了嗎?下面是我得到我的設備上:Android AndEngine物理 - 圖像問題

Broken images

這裏是我的代碼:

public class Game extends BaseExample implements IAccelerometerListener, IOnSceneTouchListener, IOnAreaTouchListener { 

// =========================================================== 
// Constants 
// =========================================================== 
private static final int CAMERA_WIDTH = 980; 
private static final int CAMERA_HEIGHT = 560; 

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


private BitmapTextureAtlas mBitmapTextureAtlas; 

private TextureRegion firstSprite; 
private TextureRegion secondSprite; 
private TextureRegion thirdSprite; 
private TextureRegion fourthSprite; 
private TextureRegion fifthSprite; 
private TextureRegion sixSprite; 
private TextureRegion sevenSprite; 
private TextureRegion eightSprite; 
private TextureRegion nineSprite; 
private TextureRegion tenSprite; 

private Scene mScene; 

private PhysicsWorld mPhysicsWorld; 
private int mFaceCount = 0; 

@Override 
public Engine onLoadEngine() { 
    Toast.makeText(this, "Touch the screen to add objects. Touch an object to remove it.", Toast.LENGTH_LONG).show(); 
    final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 

    final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera); 
    engineOptions.getTouchOptions().setRunOnUpdateThread(true); 
    return new Engine(engineOptions); 
} 

@Override 
public void onLoadResources() { 
    this.mBitmapTextureAtlas = new BitmapTextureAtlas(128, 128, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
    this.firstSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "1.png", 0, 0); // 64x32 
    this.firstSprite.setTextureRegionBufferManaged(false); 
    this.secondSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "2.png", 0, 32); // 64x32 
    this.secondSprite.setTextureRegionBufferManaged(false); 
    this.thirdSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "3.png", 0, 32); // 64x32 
    this.thirdSprite.setTextureRegionBufferManaged(false); 
    this.fourthSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "4.png", 0, 32); // 64x32 
    this.fourthSprite.setTextureRegionBufferManaged(false); 
    this.fifthSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "5.png", 0, 32); // 64x32 
    this.fifthSprite.setTextureRegionBufferManaged(false); 
    this.sixSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "6.png", 0, 32); // 64x32 
    this.sixSprite.setTextureRegionBufferManaged(false); 
    this.sevenSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "7.png", 0, 32); // 64x32 
    this.sevenSprite.setTextureRegionBufferManaged(false); 
    this.eightSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "8.png", 0, 32); // 64x32 
    this.eightSprite.setTextureRegionBufferManaged(false); 
    this.nineSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "9.png", 0, 32); // 64x32 
    this.nineSprite.setTextureRegionBufferManaged(false); 
    this.tenSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "10.png", 0, 32); // 64x32 
    this.tenSprite.setTextureRegionBufferManaged(false); 
    this.mEngine.getTextureManager().loadTexture(this.mBitmapTextureAtlas); 

} 

@Override 
public Scene onLoadScene() { 
    this.mEngine.registerUpdateHandler(new FPSLogger()); 

    this.mScene = new Scene(); 
    this.mScene.setBackground(new ColorBackground(204f, 204f, 204f)); 
    this.mScene.setOnSceneTouchListener(this); 

    this.mPhysicsWorld = 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); 

    final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f); 
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixtureDef); 
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixtureDef); 
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixtureDef); 
    PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixtureDef); 

    this.mScene.attachChild(ground); 
    this.mScene.attachChild(roof); 
    this.mScene.attachChild(left); 
    this.mScene.attachChild(right); 

    this.mScene.registerUpdateHandler(this.mPhysicsWorld); 

    this.mScene.setOnAreaTouchListener(this); 

    return this.mScene; 
} 

@Override 
public void onLoadComplete() { 

} 

@Override 
public boolean onAreaTouched(TouchEvent pSceneTouchEvent, 
     ITouchArea pTouchArea, float pTouchAreaLocalX, 
     float pTouchAreaLocalY) { 

    if(pSceneTouchEvent.isActionDown()) { 
     this.removeFace((Sprite)pTouchArea); 
     return true; 
    } 

    return false; 
} 

@Override 
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 
    if(this.mPhysicsWorld != null) { 
     if(pSceneTouchEvent.isActionDown()) { 
      this.addFace(pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); 
      return true; 
     } 
    } 
    return false; 
} 

@Override 
public void onAccelerometerChanged(AccelerometerData pAccelerometerData) { 
    final Vector2 gravity = Vector2Pool.obtain(pAccelerometerData.getX(), pAccelerometerData.getY()); 
    this.mPhysicsWorld.setGravity(gravity); 
    Vector2Pool.recycle(gravity); 
} 

private void addFace(final float pX, final float pY) { 
    this.mFaceCount++; 

    Sprite face = null; 
    Body body = null; 

    final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f); 

    /*if(this.mFaceCount % 2 == 0) { 
     face = new Sprite(pX, pY, this.firstSprite); 
     body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
    } else { 
     face = new Sprite(pX, pY, this.secondSprite); 
     body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
    }*/ 

    switch(this.mFaceCount){ 
    case 1: 
      face = new Sprite(pX, pY, this.firstSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 2: 
      face = new Sprite(pX, pY, this.secondSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 3: 
      face = new Sprite(pX, pY, this.thirdSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 4: 
      face = new Sprite(pX, pY, this.fourthSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 5: 
      face = new Sprite(pX, pY, this.fifthSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 6: 
      face = new Sprite(pX, pY, this.sixSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 7: 
      face = new Sprite(pX, pY, this.sevenSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 8: 
      face = new Sprite(pX, pY, this.eightSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 9: 
      face = new Sprite(pX, pY, this.nineSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 
    case 10: 
      face = new Sprite(pX, pY, this.tenSprite); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef); 
     break; 

    } 

    if(this.mFaceCount<=9){ 
     this.mScene.registerTouchArea(face); 
     this.mScene.attachChild(face); 
     this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true)); 
    } 
} 

@Override 
public void onResumeGame() { 
    super.onResumeGame(); 

    this.enableAccelerometerSensor(this); 
} 


private void removeFace(final Sprite face) { 
    final PhysicsConnector facePhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(face); 

    this.mPhysicsWorld.unregisterPhysicsConnector(facePhysicsConnector); 
    this.mPhysicsWorld.destroyBody(facePhysicsConnector.getBody()); 

    this.mScene.unregisterTouchArea(face); 
    this.mScene.detachChild(face); 

    System.gc(); 
    } 

} 

任何想法哪裏是我的錯?

回答

2

主要問題是您的onLoadResources方法。

一個紋理(你的案例中的BitmapTextureAtlas)就是一個包含所有小圖片的大畫布。

現在,方法BitmapTextureAtlasTextureRegionFactory.createFromAsset(..)接收2個數字參數(最後2個參數)。這些用於紋理上的圖像位置。

現在,看看你在做什麼:將所有圖像加載到同一位置!所以一些圖像(最後一個圖像加載 - 10.png)覆蓋其他...

欲瞭解更多信息,閱讀關於紋理& TextureRegions here

,你必須在你的代碼的另一個問題 - 在你addFace方法,當你調用PhysicsFactory.createBoxBody(...)身體創建,它會自動連接物理世界,即使你沒有註冊它之間的物理連接器和精靈之間,即使你不把精靈附加到場景中。

只有創建一個身體,當你是肯定你需要它。否則,確保你銷燬它。

+0

所以,按照我的理解,從你的回答,讓所有的圖像我必須從不同的位置開始。但在我的情況下,我必須用36種不同的圖像來做到這一點。那麼有沒有什麼竅門可以做,或者我只需要改變所有的位置。 –

+0

更改所有位置。如果圖像大小相同,則可以循環執行。實際上,製作一個存儲圖像大小的數組,然後遍歷它並創建您的紋理區域。 – Jong

+1

有一個BuildableBitmapTextureAtlas,它使用一些AI將你的精靈放在紋理上,而不需要手動設置位置。我不使用它,但可以查看[SVG示例](http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/SVGTextureRegionExample.java)看它在使用中。 – jmcdale

0

this.tenSprite = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas,this,「10.png」,0,32);

這是烏爾圖像的declration現在看看到底0,32是相同的所有圖像,你只需要改變它64,64