Экран обновления AndEngine - PullRequest
       3

Экран обновления AndEngine

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

У меня есть живые обои, которые я создал с помощью android canvas. После тестирования я счел необходимым использовать возможности OpenGL, поэтому я экспериментирую с AndEngine. Мне интересно, как я могу добиться следующего.

У меня есть фоновое изображение, которое заполняет весь экран, со множеством маленьких растровых изображений, плавающих поверх (не анимированные движения)

Пока у меня есть это для фонового изображения:

    @Override
public void onLoadResources()
{
    mtexture = new Texture(1024, 1024, TextureOptions.BILINEAR);
    TextureRegionFactory.setAssetBasePath("gfx/");
    mtextureRegion = TextureRegionFactory.createFromResource(mtexture , this, R.drawable.background1, 0, 0);
    this.mEngine.getTextureManager().loadTexture(this.mtexture );
}

@Override
public Scene onLoadScene(){
    final Scene scene = new Scene(1);

    Sprite background = new Sprite(0, 0, CAMERA_WIDTH*2, CAMERA_HEIGHT, mtextureRegion ) 
    SpriteBackground sb = new SpriteBackground(background);
    scene.setBackground(sb);
    scene.setBackgroundEnabled(true);
    return scene;
}

Это прекрасно работает для фона, но мне нужны движущиеся спрайты.

В своем коде холста я делаю следующее, чтобы обновить положение и физику движущихся объектов и рисовать холст каждые несколько мс

        private final Runnable drawScreen = new Runnable() {
        public void run() {
            drawFrame();
        }};

-

    void drawFrame() {
        final SurfaceHolder holder = getSurfaceHolder();

        Canvas c = null;
        try {
            c = holder.lockCanvas();
            if (c != null) {
                    //draw
            }
        } finally {
            if (c != null) holder.unlockCanvasAndPost(c);
        }

        mHandler.removeCallbacks(drawScreen);
        mHandler.postDelayed(drawScreen, 10);
    }

Каков подходящий способ сделать это на AndEngine? использовать один и тот же код и заменять вызовы openGL?

Я посмотрел на GLEngine, я должен отправлять Runnables в очередь GlThread?

РЕДАКТИРОВАТЬ - я думаю, что нашел ответ ... UpdateHandler. Но как я могу сообщить обработчику об обновлении (то есть вызвать метод onUpdate). Если я создаю синхронизированный обработчик, что произойдет, если я буду звонить слишком часто, будет ли создана очередь запросов?

1 Ответ

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

Прежде всего, не используйте конструктор Scene(int), он устарел.Вместо этого используйте Scene().

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

scene.registerUpdateHandler(mUpdateHandler);

Таким образом, код в методе mUpdateHandler.onUpdate выполняется каждый раз при обновлении сцены (каждый кадр).Вы не вызываете это вручную.Если вы хотите остановить его, вызовите:

scene.unregisterUpdateHandler(mUpdateHandler);

Итак, метод onUpdate это всегда , выполняемый в UpdateThread, так что вы можете быть уверены, что можете внести любые изменения в сущноститы хочешь там.Таким образом, вы можете перемещаться и спрайтовать, и т.д. ...

Кстати, почему ширина фона CAMERA_WIDTH*2?Это означает, что отображается только левая половина вашего спрайта.Если вы не планируете перемещать камеру, то правая половина не будет отображаться.

...