Andengine MotionStreakПример и скриншоты

1

Я хочу захватить экран, создав сцену в RenderTexture, я попытался сделать это в MotionStreakExample, и все в порядке, но когда я копирую код в свой проект, у меня есть эта фотография (возможно, есть некоторые проблемы с текстурами... я не могу понять): Изображение 174551

@Override
public Engine onCreateEngine(EngineOptions pEngineOptions) {
    return new Engine(pEngineOptions) {

        private boolean mRenderTextureInitialized;

        private RenderTexture mRenderTextures ;
        private Sprite mRenderTextureSprites ;

        @Override
        public void onDrawFrame(final GLState pGLState) throws InterruptedException {
            final boolean firstFrame = !this.mRenderTextureInitialized;

            if(firstFrame) {
                this.initRenderTextures(pGLState);
                this.mRenderTextureInitialized = true;
            }

            final int surfaceWidth = WIDTH*2;
            final int surfaceHeight = HEIGHT;


            this.mRenderTextures.begin(pGLState, false, true);
            {
                /* Draw current frame. */
                super.onDrawFrame(pGLState);

                /* Draw previous frame with reduced alpha. */
            }
            this.mRenderTextures.end(pGLState);


            {
                pGLState.pushProjectionGLMatrix();
                pGLState.orthoProjectionGLMatrixf(0, surfaceWidth, 0, surfaceHeight, -1, 1);
                {
                    this.mRenderTextureSprites.setAlpha(1);
                    this.mRenderTextureSprites.onDraw(pGLState, this.mCamera);
                }
                pGLState.popProjectionGLMatrix();
            }

            if (needToSave)
            {
                needToSave = false;
                FSHelper.saveBitmapToFile(this.mRenderTextures.getBitmap(pGLState), SAVED_PATH+"/test.png");
            }

            /* Flip RenderTextures. */

        }

        private void initRenderTextures(final GLState pGLState) {
            final int surfaceWidth = WIDTH*2;
            final int surfaceHeight = HEIGHT;

            final VertexBufferObjectManager vertexBufferObjectManager = mEngine.getVertexBufferObjectManager();
                this.mRenderTextures = new RenderTexture(mEngine.getTextureManager(), surfaceWidth, surfaceHeight);
                this.mRenderTextures.init(pGLState);

                final ITextureRegion renderTextureATextureRegion = TextureRegionFactory.extractFromTexture(this.mRenderTextures);
                this.mRenderTextureSprites = new Sprite(0, 0, renderTextureATextureRegion, vertexBufferObjectManager);
        }
    };
}

PS. этот крест с красным фоном - это спрайт на моей сцене.

Теги:
opengl-es-2.0
screenshot
andengine

2 ответа

1
Лучший ответ

Я нашел ответ! Текстуры загружаются динамически, и в первом кадре я вообще не загружаю текстуры, потому что у меня есть диалог выбора и создаю все текстуры после него. Мне нужно вызвать initRenderTextures каждый раз при изменении текстур.

  • 1
    Убедитесь, что вы уничтожаете старые!
1

Andengine уже имеет инфраструктуру для снятия скриншотов, попробовали ли вы это использовать? Взгляните на пример: https://github.com/nicolasgramlich/AndEngineExamples/blob/GLES2/src/org/andengine/examples/ScreenCaptureExample.java

  • 0
    я знаю об этой функции (и использую ее сейчас вместо описанного метода), но максимальное разрешение этого скриншота - DEVICE.WIDHTxDEVICE.HEIGHT, и я хочу больше =)
  • 0
    Может быть, вы могли бы изменить ScreenGrabber AndEngine в соответствии с вашими потребностями. Во всяком случае, я более внимательно посмотрел на предоставленное вами изображение и код, и думаю, что, возможно, знаю, что не так. Кажется, вы берете самый первый кадр, верно? Разноцветный беспорядок выглядит как случайный снимок памяти, и я видел некоторые признаки того, что текстуры в AndEngine загружаются асинхронно. Возможно, вы делаете снимок экрана слишком рано, до того как изображения полностью загрузятся. Попробуйте дать двигателю пару сотен миллисекунд, прежде чем сделать снимок экрана.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню