2017-08-17 73 views
1

我有一個程序,我使用ShapeRenderer在每一幀上繪製一些行。在每一幀我想畫在前面的頂部,消除一定量的幀。 所以我在做的是先繪製一個alpha小於1的黑色矩形,然後繪製當前幀。在桌面電腦上運作良好,結果是這樣的Android上的LibGdx`ShapeRenderer`不支持alpha通道

enter image description here

但在Android這是行不通的。它呈現像這樣。

enter image description here

我試圖繪製矩形

Gdx.gl.glEnable(GL20.GL_BLEND); 
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 

還試圖塞汀alpha通道8位AndroidApplicationConfiguration的這些工作(config.a = 8) 沒有之前使混合。我還能嘗試什麼? 也有更好的方式來實現我想要的?

屏幕代碼

package com.waterpaw.trochoids.screen; 

import java.util.ArrayList; 
import java.util.List; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Input.Keys; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 
import com.badlogic.gdx.utils.viewport.ScreenViewport; 
import com.waterpaw.trochoids.Trochoid; 
import com.waterpaw.trochoids.Trochoids; 

public class GameScreen extends BaseScreen { 
    private ShapeRenderer sr; 

    private ScreenViewport viewport; 

    private List<Trochoid> trochoids = new ArrayList<Trochoid>(); 

    public GameScreen(Trochoids game) { 
     super(game); 

     viewport = new ScreenViewport(); 
     Gdx.input.setInputProcessor(this); 
     sr = new ShapeRenderer(); 
    } 

    private int resized; 

    @Override 
    public void resize(int width, int height) { 
     viewport.update(width, height); 

     trochoids.clear(); 
     trochoids.add(new Trochoid(viewport.getWorldWidth(), viewport.getWorldHeight())); 
     resized = 2; 
    } 

    @Override 
    public void render(float delta) { 
     if(resized-- > 0) { 
      Gdx.gl.glClearColor(0f, 0f, 0f, 0f); 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     } 
     processInput(); 

     if(!trochoids.get(0).isPaused()) { 
      updateTrochoids(); 
      renderTrochoids(); 
     } 
    } 

    private void processInput() { 
     if(Gdx.input.isKeyJustPressed(Keys.P)) { 
      if(trochoids.get(0).isPaused()) { 
       trochoids.get(0).unpause(); 
      } else { 
       trochoids.get(0).pause(); 
      } 
     } else if(Gdx.input.isKeyJustPressed(Keys.SPACE)) { 
      touchDown(0, 0, 0, 0); 
     } 
    } 

    @Override 
    public void dispose() { 
     sr.dispose(); 
    } 

    @Override 
    public boolean touchDown(int x, int y, int pointer, int button) { 
     trochoids.get(0).initialize(); 
     return true; 
    } 

    public void renderTrochoids() { 
     sr.setProjectionMatrix(viewport.getCamera().combined); 

     float w = viewport.getWorldWidth(); 
     float h = viewport.getWorldHeight(); 
     sr.setColor(0, 0, 0, 0.1f); 
     sr.begin(ShapeRenderer.ShapeType.Filled); 
     sr.rect(-w/2, -h/2, w, h); 
     sr.end(); 

     sr.begin(ShapeRenderer.ShapeType.Line); 
     for(int i = 0; i < trochoids.size(); i++) { 
      trochoids.get(i).render(sr); 
     } 
     sr.end(); 
    } 

    private void updateTrochoids() { 
     for(int i = 0; i < trochoids.size(); i++) { 
      trochoids.get(i).update(); 
     } 
    } 
} 
+0

繪圖緩衝區(或幀緩衝區)的內部格式是否具有alpha通道(RGB而不是RGBA)? – Rabbid76

+0

@ Rabbid76我怎麼看?不應該設置config.a = 8解決這個問題? – alfoks

+1

將配置的所有四種顏色設置爲8.手機僅支持一組特定的組合。 5658幾乎肯定不是其中之一,因此LibGDX必須爲您選擇,這可能是不可預測的。但這不是你的問題。 – Tenfour04

回答

1

LibGDX在Android上使用雙緩衝,所以你的技術將無法正常工作。繪製到FrameBuffer,以確保您之前的繪圖不會每隔一幀清除一次。然後將FrameBuffer的顏色紋理繪製到每一幀的屏幕上。

+0

謝謝!我試圖避免這種情況,因爲我在某個地方看到它很貴,但我會試一試。 – alfoks

+1

當您將FrameBuffer繪製到屏幕上時,請確保混合處於關閉狀態。應該不是你正在做的事情的問題。 – Tenfour04