Shape Drawer 在 lib gdx 中不绘制任何内容

问题描述 投票:0回答:1

很简单,形状抽屉不渲染任何内容,只是一个黑屏。为什么使用起来如此复杂?我无法弄清楚这一点,因为它只是不渲染任何内容,为什么堆栈溢出要求更多细节?多么愚蠢的功能啊。这个蠢东西能达到220个字符吗?这是为什么?我需要继续写这个来问一个简单的问题吗?尚未完成,请修复此网站,以便人们更容易实际使用。

package com.davidclue.tanksii;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.ScreenUtils;
import com.davidclue.tanksii.input.InputHandler;

import space.earlygrey.shapedrawer.ShapeDrawer;

public class TanksII extends ApplicationAdapter {
    
    long lastTime = System.nanoTime();
    double amountOfTicks = 60.0;
    double ns = 1000000000 / amountOfTicks;
    double delta = 0;
    long timer = System.currentTimeMillis();
    int updates = 0;
    int frames;
    
    private PolygonSpriteBatch batch;
    private ShapeDrawer drawer;
    private TextureRegion region;
    
    public static int WIDTH = 1600, HEIGHT = 900;
    public int fullWidth, fullHeight;
    public static int tileSize = 64;
    public String title = "Tanks II";
    
    public static Handler handler;
    private Level level;
    
    @Override
    public void create() {
        batch = new PolygonSpriteBatch();
        region = new TextureRegion(new Texture(WIDTH, HEIGHT, Format.RGBA8888));
        drawer = new ShapeDrawer(batch, region);
        
        handler = new Handler();
        new Camera(0, 0);
        new InputHandler(this);
        level = new Level(this, handler);
        handler.setLevel(level);
        
        level.load("levels/default/level1.png");
    }
    private void tick() {
        handler.tick();
        Camera.tick();
    }
    @Override
    public void render() {
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;
        while (delta >= 1) {
            tick();
            updates++;
            delta--;
        }
        if (System.currentTimeMillis() - timer > 1000) {
            timer += 1000;
            System.out.println("FPS: " + frames + " TICKS: " + updates);
            frames = 0;
            updates = 0;
        }
        
        // render
        
        ScreenUtils.clear(0, 0, 0, 1);
        batch.begin();
        
        level.render(drawer);
        handler.render(drawer);
        drawer.filledRectangle(10, 10, 100, 100, Color.CYAN);
        
        batch.end();
        frames++;
    }
    @Override
    public void dispose() {
        batch.dispose();
    }
}

libgdx game-development
1个回答
0
投票

仅使用宽度和高度而不是图像的纹理构造函数创建全黑纹理。所以如果你在黑上画黑,你就看不到任何东西。您应该在 ShapeDrawer 中使用纯白色纹理,这样它就可以将其着色为您尝试使用的任何颜色。

此外,用于 ShapeDrawer 的纹理也可能是 1x1 大小。

并且,您必须始终处理

dispose()
中的纹理,否则它们会泄漏内存。

示例:

private Texture shapeDrawerTexture;

@Override
public void create() {
    batch = new PolygonSpriteBatch();
  
    Pixmap pixmap = new Pixmap(1, 1, Format.RGBA8888);
    pixmap.setColor(Color.WHITE);
    pixmap.drawPixel(0, 0);
    shapeDrawerTexture = new Texture(pixmap);
    pixmap.dispose();
    region = new TextureRegion(shapeDrawerTexture);

    drawer = new ShapeDrawer(batch, region);

    // ...
}

// ...

@Override
public void dispose() {
    batch.dispose();
    shapeDrawerTexture.dispose();
}

旁注:您的 Camera 和 InputHandler 有一些非常奇怪的地方,因为您调用它们的构造函数并立即将新创建的实例释放到 GC。

如果您要在 Android 上发布,请在任何类中使用静态字段时务必小心,因为它们可能会在游戏会话之间停留,泄漏内存并导致无效状态。

© www.soinside.com 2019 - 2024. All rights reserved.