Использование fillcircle и pixmap в libgdx

Я использую libgdx. Я хочу смоделировать туман в своей игре с помощью растрового изображения, но у меня возникла проблема при создании круга "fogless". Сначала я делаю растровое изображение, залитое черным цветом (немного прозрачно). После заполнения я хочу нарисовать на нем закрашенный круг, но результат не тот, который я ожидал.

this.pixmap = new Pixmap(640, 640, Format.LuminanceAlpha);
Pixmap.setBlending(Blending.None); // disable Blending
this.pixmap.setColor(0, 0, 0, 0.9f);
this.pixmap.fill();
//this.pixmap.setColor(0, 0, 0, 0);
this.pixmap.fillCircle(200, 200, 100);
this.pixmapTexture = new Texture(pixmap, Format.LuminanceAlpha, false);

В процедуре render()

public void render() {
  mapRenderer.render();
  batch.begin();
  batch.draw(pixmapTexture, 0, 0);
  batch.end();
}

Если я использую Формат. Альфа при создании растрового изображения и текстуры я не вижу более полупрозрачного круга.

Вот моя проблема:

введите здесь описание изображения

Проблема

Может ли кто-нибудь помочь мне? Что мне делать, что мне нужно сделать, чтобы нарисовать полный прозрачный круг? Спасибо.

ОБНОВЛЕНИЕ Я нашел решение своей проблемы. Я должен отключить смешивание, чтобы избежать проблемы.


Теперь мой код:

FrameBuffer fbo = new FrameBuffer(Format.RGBA8888, 620, 620, false);
Texture tex = EnemyOnRadar.assetManager.get("data/sugar.png", Texture.class);

batch.begin();
// others
batch.end();

fbo.begin();
batch.setColor(1,1,1,0.7f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw( tex, 100, 100);
batch.end();
fbo.end();

Но я не вижу круга (это изображение png, представляет собой прозрачный фон, белый закрашенный круг).


person user2498846    schedule 06.02.2014    source источник
comment
Я обновил свой ответ, проверьте это. ЕСЛИ у вас есть дополнительные вопросы по этому поводу, обновите этот вопрос вместо публикации ответа. Если вы попробуете код, который я вам дам, но он не сработает, обновите вопрос, вставьте код и дайте мне знать, каков результат. Так что я и другие могут помочь вам. Спасибо   -  person Springrbua    schedule 06.02.2014
comment
другая ссылка: stackoverflow.com/ вопросы/14729961/   -  person Springrbua    schedule 07.02.2014
comment
Как вы делаете это сейчас? Вы используете PixMap с отключенным смешиванием? Или вы используете решение FBO, которое я предложил?   -  person Springrbua    schedule 20.02.2014


Ответы (1)


Я не уверен, что это работает для вас, но я просто делюсь этим: вы можете использовать FrameBuffers и сделать следующее:

  1. Рисуйте все, что хотите, на экране.
  2. Завершите свой SpriteBatch и начните свой FrameBuffer, снова начните SpriteBatch.
  3. Нарисуйте Туман, который заполняет весь «экран» (FrameBuffer) черным непрозрачным цветом.
  4. Нарисуйте круг «Без тумана» в виде белого круга в том месте, где вы хотите удалить туман.
  5. Установите альфа-канал FrameBuffers (прозрачность) на 0.7 или что-то в этом роде.
  6. Закончите SpriteBatch и FrameBuffer, чтобы нарисовать его на экране.

Что просходит? Вы рисуете обычную сцену, без тумана. Вы создаете «виртуальный экран», заливаете его черным и перерисовываете черный белый кружок. Теперь вы устанавливаете прозрачность для этого «виртуального экрана» и перерисовываете им свой реальный экран. Часть экрана, находящаяся под белым кругом, кажется светлой, а остальная черная часть делает сцену темнее. Что почитать: 2D-эффект огня с libgdx примерно то же самое, что и туман. Мой вопрос к этому: освещение Libgdx без box2d

EDIT: еще один учебник.

Дайте мне знать, если это поможет!

РЕДАКТИРОВАТЬ: Некоторый псевдокод: При создании:

fbo = new FrameBuffer(Format.RGBA8888, width, height, false);

В рендере:

fbo.begin();
glClearColor(0f, 0f, 0f, 1f);    // Set the clear color to black, non transparent
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);  // Clear the "virtual screen" with the clear color
spriteBatch.begin();  // Start the SpriteBatch
// Draw the filled circles somehow // Draw your Circle Texture as a white, not transparent Texture
spriteBatch.end(); // End the spritebatch
fbo.end(); // End the FrameBuffer
spriteBatch.begin();   // start the spriteBatch, which now draws to the real screen
// draw your textures, sprites, whatever
spriteBatch.setColor(1f, 1f, 1f, 0.7f); // Sets a global alpha to the SpriteBatch, maybe it applies alo to the stuff you have allready drawn. If so just call spriteBatch.end() before and than spriteBatch.begin() again.
spriteBatch.draw(fbo, 0, 0);  // draws the FBO to the screen.
spriteBatch.end();

скажи мне, если это работает

person Springrbua    schedule 06.02.2014
comment
Не могли бы вы написать мне пример кода, как рисовать в FrameBuffer? Я никогда не использовал его раньше. Кстати, могу я забыть PixMap? - person user2498846; 06.02.2014
comment
На самом деле я должен сказать, что я никогда не использовал FrameBuffer, потому что я тоже новичок, но я прочитал много руководств: P Я обновляю свой ответ! Я не знаю, возможно ли это с pixmap... Будем надеяться, что у кого-то еще есть совет для вас. - person Springrbua; 06.02.2014
comment
Это не работа. На самом деле, если это сработает, и кругов будет 2 или более, и они перекрывают друг друга, то их альфа суммируется. Поэтому я понятия не имею, что мне делать. - person user2498846; 06.02.2014
comment
Их альфа не будет суммироваться, потому что вы не устанавливаете альфу для своих кругов, вы устанавливаете ее для всего FBO. ваши круги должны иметь альфа-значение 1! Эта строка: spriteBatch.setCOlor(1,1,1,0.7); устанавливает альфа-значение для spriteBAtch, которое рисует ваш FBO. - person Springrbua; 06.02.2014
comment
Не могли бы вы написать пример кода? Я запутался. Могу ли я использовать PixMap или использовать FrameBuffer? Моя проблема связана с неожиданными линиями и объединенными областями, где заполненная область не прозрачна. - person user2498846; 06.02.2014
comment
Попробуйте код моего обновленного ответа. Просто закомментируйте свой материал PixMap и напишите это вместо этого. Вместо Pixmap.fillCircle() вы можете загрузить самодельную текстуру с прозрачным фоном и белым кругом на ней. И посмотрите на ссылки, которые я разместил - person Springrbua; 06.02.2014
comment
Я проверил. Это не сработало. Но попробую текстурную версию. - person user2498846; 06.02.2014