Android AndEngine Physics - выпуск изображений - PullRequest
0 голосов
/ 10 декабря 2011

Я работаю над небольшой игрой / проектом и решаю использовать AndEngine для него, потому что в принципе все, что мне нужно, это функциональность Add / Remove Physics в этом движке.Но, похоже, у меня есть небольшая проблема с этим.Я должен добавить около 36 различных картинок на сцену и быть в состоянии удалить их при выборе.Проблема в том, что мои изображения повреждены, и он не показывает все изображения, только первые два.Я что-то упустил или я делаю это неправильно?Вот что я получаю на своем устройстве:

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 ]

2 голосов
/ 10 декабря 2011

Основная проблема связана с вашим методом onLoadResources.

Текстура (в вашем случае BitmapTextureAtlas) - это просто большой холст, содержащий все маленькие изображения.

Теперь метод BitmapTextureAtlasTextureRegionFactory.createFromAsset(..) получает 2 числовых параметра (2 последних параметра).Они используются для положения изображения на текстуре.

Теперь посмотрим, что вы делаете: загрузка всех изображений в одну и ту же позицию!Поэтому некоторые изображения (последнее загруженное изображение - 10.png) перекрывают другие ...

Для получения дополнительной информации читайте о Textures & TextureRegions здесь .

Другая проблемачто вы имеете в своем коде - В вашем методе addFace, когда вы вызываете PhysicsFactory.createBoxBody(...), тело создано , и оно автоматически присоединяется к вашему физическому миру, даже если вы этого не делаетезарегистрируйте физический соединитель между ним и между спрайтом, и даже если вы не прикрепите спрайт к сцене.

создайте тело только тогда, когда вы уверены, что вам понадобится,В противном случае, убедитесь, что вы уничтожили его.

0 голосов
/ 27 мая 2013

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

это изображение вашего изображения, теперь посмотрите в конце, 0,32 одинаково для всего изображения, вам просто нужно изменить его 64,64

...