【问题标题】:Can't draw a ninepatch image and stage at the same time不能同时绘制九幅图像和舞台
【发布时间】:2014-02-14 13:59:21
【问题描述】:

每当我尝试绘制一个 Ninepatch 图像和一个舞台时,最后的事情就是被绘制。我曾尝试使用正交相机,但没有成功。我尝试过的:

batch.setProjectionMatrix(camera.combined);
ninePatch.draw(batch, xPos, yPos, width, height);
stage.act(delta);
stage.draw();

camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
stage.setCamera(camera)

编辑:代码

CreateQuiz 类

public class CreateQuiz implements Screen{

    public CreateQuiz(Quiz quiz){
    this.quiz = quiz;
    }

    private Quiz quiz;
    private FallDownPanel fallDownPanel;
    private OrthographicCamera camera;

    @Override
    public void render(float delta) {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    quiz.beginBatch();
    fallDownPanel.render(quiz.getSpriteBatch(), delta);
    quiz.endBatch();
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void show() {
    fallDownPanel = new FallDownPanel(FallDownPanel.START_LOWER_SIDE, 200, quiz.getTextureAtlas().createPatch("fallDownWindow"));
    Stage stage = new Stage(fallDownPanel.getWidth(), fallDownPanel.getHeight(), false);
    TextFieldStyle style = quiz.getGreenTextFieldStyle();
    style.font.scale(-0.30f);
    TextFieldQuiz test = new TextFieldQuiz("Hej åäö 123 !", style, 0, 2, 400, 16);
    test.setTextFieldListener(new TextFieldListener() {
        @Override
        public void keyTyped (TextField textField, char key) {
        if (key == '\n') {
            textField.getOnscreenKeyboard().show(false);
        }
        }
    });
    stage.addActor(test);
    Gdx.input.setInputProcessor(stage);
    fallDownPanel.setStage(stage);
    camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    stage.setCamera(camera);
    fallDownPanel.setCamera(camera);
    }

    @Override
    public void hide() {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void dispose() {

    }

}

FallDownPanel.class

    public class FallDownPanel {

    //With repeat
    public FallDownPanel(int startSide, int size, NinePatch ninePatch){
    Tween.registerAccessor(FallDownPanel.class, new FallDownPanelTween());
    Tween.registerAccessor(Widget.class, new WidgetTween());
    tweenManager = new TweenManager();
    final int screenWidth = Gdx.graphics.getWidth();
    final int screenHeight = Gdx.graphics.getHeight();
    int target = 0;
    int tweenType = 0;

    if(startSide == START_LEFT_SIDE){
        setSize(size, screenHeight);
        xPos = -size;
        yPos = 0;
        target = 0;
        tweenType = FallDownPanelTween.POSITION_X;
    }

    else if(startSide == START_RIGHT_SIDE){
        setSize(size, screenHeight);
        xPos = screenWidth;
        yPos = 0;
        target = screenWidth - size;
        tweenType = FallDownPanelTween.POSITION_X;
    }

    else if(startSide == START_UPPER_SIDE){
        setSize(screenWidth, size);
        xPos = 0;
        yPos = screenHeight + size;
        target = screenHeight - size;
        tweenType = FallDownPanelTween.POSITION_Y;
    }

    else if(startSide == START_LOWER_SIDE){
        setSize(screenWidth, size);
        xPos = 0;
        yPos = -size;
        target = 0;
        tweenType = FallDownPanelTween.POSITION_Y;
    }

    Tween.to(this, tweenType, 1).target(target).start(tweenManager);
    this.tweenType = tweenType;
    this.startSide = startSide;

    this.ninePatch = ninePatch;
    }

    private TweenManager tweenManager;
    private NinePatch ninePatch;
    private Stage stage;
    private OrthographicCamera camera;

    private float xPos, yPos;
    private int width, height;
    private int tweenType;
    private int startSide;
    public static final int START_LEFT_SIDE = 0, START_RIGHT_SIDE = 1, START_UPPER_SIDE = 2, START_LOWER_SIDE = 3;

    public void render(SpriteBatch batch, float delta){
    tweenManager.update(delta);
    batch.setProjectionMatrix(camera.combined);
    ninePatch.draw(batch, xPos, yPos, width, height);
    stage.act(delta);
    stage.draw();
    }

    public void setX(float x){
    this.xPos = x;
    }

    public void setY(float y){
    this.yPos = y;
    }

    public float getX(){
    return xPos;
    }

    public float getY(){
    return yPos;
    }

    public float getWidth(){
    return width;
    }

    public float getHeight(){
    return height;
    }

    private void setSize(int w, int h){
    width = w;
    height = h;
    }

    public Stage getStage() {
    return stage;
    }

    public void setStage(Stage stage) {
    this.stage = stage;
    startWidgetTweens();
    }

    private void startWidgetTweens(){
    float size = getShortestSide();
    Array<Actor> actors = stage.getActors();
    for(int i = 0; i < actors.size; i++){
        Widget w = (Widget) actors.get(i);
        Tween.to(w, tweenType, 1).target(0).start(tweenManager);
    }
    }

    private float getShortestSide() {
    if(startSide == START_LEFT_SIDE){
        return width;
    }

    else if(startSide == START_RIGHT_SIDE){
        return width;
    }

    else if(startSide == START_UPPER_SIDE){
        return height;
    }

    else if(startSide == START_LOWER_SIDE){
        return height;
    }

    return -1;
    }

    public void setCamera(OrthographicCamera camera) {
    this.camera = camera;
    }

}

【问题讨论】:

  • 将 Ninepatch 作为 Actor 添加到舞台上,应该没问题。如果你渲染东西,正确的顺序很重要。您可能会使用 NinePatch/stage 透支所有内容,这就是您看不到其他任何内容的原因。请务必添加整个渲染方法
  • 我已经编辑了帖子!
  • @BennX 你能让舞台的背景透明吗?
  • 我解决了,我停止了当前批次,因为舞台有它自己的批次,或者类似的东西。然后我只调用了 stage.act() 和 stage.draw();谢谢@Bennx
  • 哦,是的,忘记了。平铺地图也有同样的问题。舞台有它自己的精灵批次,如果你有两个活跃的精灵,它们会同时出现,这会导致麻烦。

标签: java libgdx stage


【解决方案1】:

始终确保您一次只有一个活跃的RendererRenderers 是:

  • Batch
  • SpriteBatch
  • ShapeRenderer
  • Box2DDebugRenderer如果我没记错的话
  • ModelBatch 用于 3D

我希望我没有忘记一个。
确保在调用begin() 获取新的之前,始终调用end() 获取活动的。
还要记住,Stage 有自己的SpriteBatch,如果您调用stage.draw(),它会为此SpriteBatch 调用begin()。所以请确保您在stage.draw() 之前是end() 活动的Renderer
如果您需要ShapeRenderer 或任何其他渲染器来绘制Actor(可能是调试的原因),您必须结束stages SpriteBatch,您可以使用draw() 方法获得它。确保在方法结束时再次begin()
希望这已经足够清楚了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多