很简单,形状抽屉不渲染任何内容,只是一个黑屏。为什么使用起来如此复杂?我无法弄清楚这一点,因为它只是不渲染任何内容,为什么堆栈溢出要求更多细节?多么愚蠢的功能啊。这个蠢东西能达到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();
}
}
仅使用宽度和高度而不是图像的纹理构造函数创建全黑纹理。所以如果你在黑上画黑,你就看不到任何东西。您应该在 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 上发布,请在任何类中使用静态字段时务必小心,因为它们可能会在游戏会话之间停留,泄漏内存并导致无效状态。