Только один спрайт хочет оживить, вместо этого они все делают.AndEngine - PullRequest
1 голос
/ 08 ноября 2011

Я создаю приложение для Android с помощью Andengine. Одна часть приложения требует, чтобы пользователи выбирали несколько спрайтов из группы спрайтов на экране, в результате чего выбранные спрайты приобретают другой цвет (т. Е. Переходят на следующую плитку). Я объявил их всех как анимированные спрайты, и я использую одну и ту же текстуру для каждого. Проблема в том, что после выбора спрайта каждый спрайт перемещается на следующую плитку, а не только на ту, которую я выбрал. Как мне сделать только одно изменение спрайта?

Вот где я настраиваю текстуры и еще много чего:

private Texture mGreenTextureAtlas;
private  TiledTextureRegion mGreenBallFaceTextureRegion;

@Override
        public void onLoadResources() {
                /* Textures. */
                ...
                this.mGreenTextureAtlas = new Texture(32, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
                        ...
                TextureRegionFactory.setAssetBasePath("gfx/");

                /* TextureRegions. */

                        ...
                this.mGreenBallFaceTextureRegion =  TextureRegionFactory.createTiledFromAsset(this.mGreenTextureAtlas, this, "green_ball.png", 0, 16, 2, 1); // 64x32
                this.mEngine.getTextureManager().loadTextures(this.mCueTextureAtlas, this.mGreenTextureAtlas , this.mBackgroundTexture, this.mPocketTexture);
        }

Вот где я на самом деле создаю спрайты и применяю текстуры:

face = new AnimatedSprite(pX, pY, this.mGreenBallFaceTextureRegion);
body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
encapsed = new Encapsulator(body, face, Encapsulator.AVOID_BALL, mFaceCount);
ballsList.add(encapsed);

Я инкапсулирую каждый спрайт, его тело и некоторые другие данные в объект, который я создал, а затем добавляю этот объект в ArrayList.

Вот обработчик события onTouch.

@Override
        public boolean onAreaTouched( final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea,final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
            if(pSceneTouchEvent.isActionDown()) {
                final AnimatedSprite face = (AnimatedSprite) pTouchArea;

                for(int i=0; i<ballsList.size(); i++)
                {
                    if(face.equals(ballsList.get(i).animatedFace))
                    {
                        ballsList.get(i).toggleType(face);
                        System.out.println("Ball " + ballsList.get(i).id + " is now " + ballsList.get(i).type);
                    }                       
                }               

                return true;
            }
            return false;
        }

Наконец, вот метод toggleType в классе Encapsulator, который отвечает за переход к следующей плитке:

public void toggleType(AnimatedSprite face)
    {
        if(this.type == AVOID_BALL)
        {
            this.type = HIT_BALL;
            face.nextTile();
        }
        else if(this.type == HIT_BALL)
        {
            this.type = AVOID_BALL;
            face.setCurrentTileIndex(0);
        }
    }

Извините, если это немного затянуто. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 08 ноября 2011

Я немного погуглил и нашел решение. При создании спрайтов мне пришлось использовать метод textureregion.clone (). Я нашел решение по этой ссылке:

http://www.andengine.org/forums/development/two-sprites-sharing-the-same-tiledtextureregion-t4339.html

...