Запустите анимацию с расширением AndEngine Live Wallpaper - PullRequest
2 голосов
/ 08 января 2012

У меня есть такой код:

public class SnowFallService extends BaseLiveWallpaperService implements IOnAreaTouchListener{

    // ===========================================================
    // Constants
    // ===========================================================

    private static final int CAMERA_WIDTH = 480;
    private static final int CAMERA_HEIGHT = 800;

    private ArrayList<Sprite> allSnow = new ArrayList<Sprite>();
    // ===========================================================
    // Fields
    // ===========================================================

    private ScreenOrientation screenOrientation;

    private static TextureRegion snowTexture;
    private static TextureRegion backgroundTexture;
    private static Textures texture = null;

    private Scene mScene;

    public org.anddev.andengine.engine.Engine onLoadEngine() {
        return new org.anddev.andengine.engine.Engine(new EngineOptions(true, this.screenOrientation, new FillResolutionPolicy(), new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT)));
    }

    public void onLoadResources() {
        texture = new Textures(this, getEngine());
    }

    public void onUnloadResources() {

    }

    public Scene onLoadScene() {

        final Scene mScene = new Scene();
        backgroundTexture = texture.getBackground();
        mScene.attachChild(new Sprite(0, 0, backgroundTexture));
        snowTexture = texture.getSnowTextureRegion();

        mScene.registerUpdateHandler(new IUpdateHandler() {
            private long lastRaindropAdd = 0;

            @Override
            public void onUpdate(final float pSecondsElapsed) {
                int size = allSnow.size();
                int tmpInt = 0;
                Random randGen = new Random();
                for (int i = 0; i < size; i++) {
                    if (allSnow.get(i) != null){
                        Sprite snow = allSnow.get(i);

                        tmpInt = randGen.nextInt(4);
                        snow.setPosition(snow.getX() + (randGen.nextInt(5) - randGen.nextInt(5)) * randGen.nextInt(3), snow.getY() + tmpInt);

                        if (snow.getY() > CAMERA_HEIGHT || snow.getX() > CAMERA_WIDTH) {
                            synchronized(snow) {
                                size--;
                                allSnow.remove(i);
                                mScene.detachChild(snow);
                            }
                        }
                    }
                }

                tmpInt = randGen.nextInt(5000);

                if (System.currentTimeMillis() - lastRaindropAdd  > tmpInt) {
                    lastRaindropAdd = System.currentTimeMillis();

                    tmpInt = randGen.nextInt(CAMERA_WIDTH);

                    Sprite snow = getRaindrop(tmpInt, 0);
                    allSnow.add(snow);
                    mScene.attachChild(snow);
                }
            }

            @Override
            public void reset() {
            }
        });
        return mScene;
    }

    public void onLoadComplete() {
        // TODO Auto-generated method stub

    }

    public void onPauseGame() {
        // TODO Auto-generated method stub

    }

    public void onResumeGame() {
        // TODO Auto-generated method stub

    }

    public Sprite getRaindrop(float x, float y) {
        return (new Sprite(x, y, snowTexture.deepCopy()));
    }

    @Override
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent,ITouchArea pTouchArea, float pTouchAreaLocalX, float pTouchAreaLocalY) {
        if(pSceneTouchEvent.isActionDown()) {
            // HERE I WANT PLACE CODE, THAT WILL START ANIMATION.
            return true;
        }
        return false;
    }
}

Так как же запустить анимацию по клику? Я хочу сделать что-то вроде маленького мультфильма.

Ответы [ 2 ]

4 голосов
/ 10 января 2012

В вашем методе onLoadScene после регистрации обработчик обновлений отключите его.

mUpdateHandler.setEnabled(false);

А в методе onAreaTouched включите его.

mUpdateHandler.setEnabled(true);

Кстати, я думаю, что не рекомендуется каждый раз создавать случайный экземпляр в методе onUpdate.

1 голос
/ 10 января 2012

Здесь Джош описывает, как переопределить метод onTouch (andEngine неправильно обрабатывает события касания для живых обоев, поэтому вы должны сделать это самостоятельно).В двух словах, все, что вам нужно сделать, это переопределить следующую функцию в классе BaseWallpaperGLEngine (класс является частью расширения живых обоев andEngine:

@Override
        public void onTouchEvent (MotionEvent event)
        {
        }
...