只想要一个精灵来制作动画,而不是一切都做。 Andengine

时间:2011-11-08 04:51:49

标签: android animation sprite andengine

我正在使用Andengine创建一个Android应用程序。应用程序的一部分要求用户从屏幕上的一组精灵中选择一些精灵,这会使所选的精灵变成不同的颜色(即,移动到下一个拼贴)。我将它们全部称为动画精灵,并且每个都使用相同的纹理。问题是,一旦我选择了一个精灵,每个精灵都会移动到下一个拼贴,而不仅仅是我选择的拼贴。我如何只改变一个精灵?

这是我设置纹理和诸如此类的地方:

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

我将每个sprite,它的body和一些其他数据封装到我创建的对象中,然后将该对象添加到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;
        }

最后,这是Encapsulator类中的toggleType方法,它负责移动到下一个tile:

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 个答案:

答案 0 :(得分:2)

我做了一些谷歌搜索并遇到了一个解决方案。在创建sprite时我不得不使用textureregion.clone()方法。我在这个链接找到了解决方案:

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