有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用libgdx渲染游戏时遇到的java问题

我试图用libgdx来表示一些图像。为此,我有矩形和纹理变量。问题是,当我让代码以这种方式运行时,它只绘制了一次图像,然后立即清除。如果我画了这些图像,我希望它们能保留下来

 @Override
        public void render () {
            int x,y;
            Gdx.gl.glClearColor(1, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            batch.begin();
            if(matrixBuilt!=true){
            for(x=0;x<matrix.length;x++){
                for(y=0;y<matrix.length;y++){
                    System.out.println(matrix[x][y]);
                    switch(matrix[x][y]){
                    case 1: batch.draw(numberOne, numberOneR.x, numberOneR.y);
                    break;
                    case 2: batch.draw(numberTwo, numberTwoR.x, numberTwoR.y);
                    break;
                    case 3: batch.draw(numberThree, numberThreeR.x, numberThreeR.y);
                    break;
                    case 4: batch.draw(numberFour, numberFourR.x, numberFourR.y);
                    break;
                    case 5: batch.draw(numberFive, numberFiveR.x, numberFiveR.y);
                    break;
                    case 6: batch.draw(numberSix, numberSixR.x, numberSixR.y);
                    break;
                    case 7: batch.draw(numberSeven, numberSevenR.x, numberSevenR.y);
                    break;
                    case 8: batch.draw(numberEight, numberEightR.x, numberEightR.y);
                    break;
                    case 9: batch.draw(numberNine, numberNineR.x, numberNineR.y);
                    break;
                    case 10: batch.draw(emptySquare, emptySquareR.x, emptySquareR.y);
                    break;
                    }   
                }
            }
            matrixBuilt=true;
            }


            batch.end();
        }

尽管我在批处理之前做了batch.draw(emptySquare, emptySquareR.x, emptySquareR.y);。end();没关系,但我不想那样。。。。这将使代码非常扩展。。。有什么线索吗?谢谢

编辑:

所以我把这些放在create方法上:

Gdx.graphics.setContinuousRendering(false);
Gdx.graphics.requestRendering();

如果我没有用鼠标穿过屏幕,渲染只会发生一次,因为如果我这样做,它会重新绘制,我不希望发生这种情况,我希望图像是静态的,下面是我的代码:

 public void render () {

    int x,y,squareCounter=0;

    batch.begin();
    for(x=0;x<matrix.length;x++){
        for(y=0;y<matrix.length;y++){
            System.out.println(matrix[x][y]);
            switch(matrix[x][y]){
            case 1: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberOneR.x=startingX;numberOneR.y=startingY; }
                batch.draw(numberOne, numberOneR.x, numberOneR.y);
                squareCounter++;
                startingX+=40;
                numberOneR.x=startingX;
            break;
            case 2:
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberTwoR.x=startingX;numberTwoR.y=startingY; }
                batch.draw(numberTwo, numberTwoR.x, numberTwoR.y);
                squareCounter++;
                startingX+=40;
                numberTwoR.x=startingX;
            break;
            case 3: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberThreeR.x=startingX;numberThreeR.y=startingY; }
                batch.draw(numberThree, numberThreeR.x, numberThreeR.y);
                squareCounter++;
                startingX+=40;
                numberThreeR.x=startingX;
            break;
            case 4: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberFourR.x=startingX;numberFourR.y=startingY; }
                batch.draw(numberFour, numberFourR.x, numberFourR.y);
                squareCounter++;
                startingX+=40;
                numberFourR.x=startingX;
            break;
            case 5: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberFiveR.x=startingX;numberFiveR.y=startingY; }
                batch.draw(numberFive, numberFiveR.x, numberFiveR.y);
                squareCounter++;
                startingX+=40;
                numberFiveR.x=startingX;
            break;
            case 6: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberSixR.x=startingX;numberSixR.y=startingY; }
                batch.draw(numberSix, numberSixR.x, numberSixR.y);
                squareCounter++;
                startingX+=40;
                numberSixR.x=startingX;
            break;
            case 7: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberSevenR.x=startingX;numberSevenR.y=startingY; }
                batch.draw(numberSeven, numberSevenR.x, numberSevenR.y);
                squareCounter++;
                startingX+=40;
                numberSevenR.x=startingX;
            break;
            case 8: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberEightR.x=startingX;numberEightR.y=startingY; }
                batch.draw(numberEight, numberEightR.x, numberEightR.y);
                squareCounter++;
                startingX+=40;
                numberEightR.x=startingX;
            break;
            case 9: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;numberNineR.x=startingX;numberNineR.y=startingY; }
                batch.draw(numberNine, numberNineR.x, numberNineR.y);
                squareCounter++;
                startingX+=40;
                numberNineR.x=startingX;
            break;
            case 10: 
                if(squareCounter==9) {squareCounter=0;startingX=125;startingY-=40;emptySquareR.x=startingX;emptySquareR.y=startingY; }
                batch.draw(emptySquare, emptySquareR.x, emptySquareR.y);
                squareCounter++;
                startingX+=40;
                emptySquareR.x=startingX;
            break;
            }   
        }
    }
    batch.end();
}

共 (1) 个答案

  1. # 1 楼答案

    这里的问题是,在render方法中,调用:

    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    

    它首先设置ClearColor,然后用它清除屏幕,例如将整个屏幕设置为该颜色
    可能的解决办法是:

    1. 删除2个呼叫,这将停止清除。但这也意味着,在你再次调用这些方法之前,你画的所有东西都会留在屏幕上
    2. 像大多数游戏一样,每一帧都画出所有(可见的)东西。在您的情况下,删除if(!matrixBuilt)条件就足够了
    3. 把这些东西画到FrameBuffer上一次,然后用这个FrameBuffer把这些东西画到屏幕上,如@Tenfour04所述
    4. 使用@Tenfour04提到的非连续渲染,这将阻止gameloop一直调用render()方法。相反,您需要调用Gdx.graphics.requestRendering();来调用render()

    我想,在这种情况下,最后一种解决方案是最好的,因为显示的内容或多或少是静态的,非连续渲染可以节省电池
    您可以在用户输入等事件上调用Gdx.graphics.requestRendering();
    对于其他在屏幕上移动更多东西的游戏(如平台等),第二种方法在大多数情况下是最好的