当前位置: 首页 > 知识库问答 >
问题:

LibGdx屏幕:渲染和生命周期

印季
2023-03-14

我有一个问题,我认为它与屏幕渲染及其生命周期有关。基本上我有两个屏幕(菜单和游戏)。在GameScreen渲染方法中,我称之为World。更新,然后我的渲染。在(GameScreen的)隐藏方法中,我从Redner类中处理SpriteBatch。

因此,当我将屏幕从游戏更改为菜单(intheworld.update)时,Java崩溃。据我所知,飞机失事了。所以我的问题是,当我在渲染周期中间设置一个新的屏幕时,渲染周期还是要用它的旧屏幕完成吗?意思是,我在打电话给巴奇。在渲染完成之前进行处理,这就是我遇到问题的原因?

谢谢你的帮助

public class GameScreen extends AbstractGameScreen {
    private static final String TAG = GameScreen.class.getName();

    private WorldController worldController;
    private WorldRenderer worldRenderer;

    private boolean paused;

    public GameScreen(Game game) {
        super(game);
    }

    @Override
    public void render(float deltaTime) {
        // Do not update game world when paused
        if (!paused) {
            // Update game world by the time that has passed since last render time
            worldController.update(deltaTime);
        }
        // Sets the clear screen color to: Cornflower Blue
        Gdx.gl.glClearColor(0x64 / 255.0f, 0x95 / 255.0f, 0xed / 255.0f, 0xff / 255.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        // Render game world to screen
        worldRenderer.render();
    }

    @Override
    public void resize(int width, int height) {
        worldRenderer.resize(width, height);
    }

    @Override
    public void show() { // Similar as create method
        worldController = new WorldController(game);
        worldRenderer = new WorldRenderer(worldController);
        Gdx.input.setCatchBackKey(true);
    }

    @Override
    public void hide() { // Similar to dispose method
        worldRenderer.dispose();
        Gdx.input.setCatchBackKey(false);
    }

    @Override
    public void pause() {
        paused = true;
    }

    @Override
    public void resume() {
        super.resume();
        // Only called on Android
        paused = false;
    }
}

共有1个答案

仉梓
2023-03-14

这基本上是正确的。从其render方法中调用setScreen的屏幕本身将调用hide,然后将在其render方法中继续执行其余代码。所以你在尝试画画之前就杀死了你的雪碧。

因此,不要在隐藏方法中调用disment。事实上,它可能是不好的做法,屏幕曾经调用处置本身。你可以为拥有它的游戏类保留它。例如,你可以在你的游戏课上做这样的事情:

@Override
public void render() {
    super.render();
    if (getScreen() != gameScreen && gameScreen != null) {
        gameScreen.dispose();
        gameScreen = null;
    }
}

顺便说一下,您可能应该将SpriteBatch放在游戏子类中,让所有不同的屏幕共享它。它是一个相当大的对象,可以毫无理由地进行分配和解除分配。

 类似资料:
  • 我正在使用LWJGL 2.8.5开发一个3D可视化应用程序。在阅读了项目主页上的第一个教程后,我还阅读了一本OpenGL书籍,进行了更深入的分析。我看到OpenGL中的典型过程是在init函数中绘制场景,然后简单地在一个循环中调用显示的更新。 但是,当我尝试使用LWJGL时,我在显示屏中得到了闪烁效果。消除闪烁的唯一方法是在显示更新周期中重绘场景。为什么会发生这种情况? 为了更好地解释我的问题,我

  • 我有一个大学项目,用LibGDX制作关于粉碎游戏的游戏,我做了这个项目,当玩家生命为0时,它从游戏屏幕类切换到EndGameScreen类,但是这种情况发生了失败的渲染,我实际上不确定这是否是因为setScreen方法或我的EndGameScreen类是不正确的 游戏屏幕类 EndGameScreen类 }

  • 我一直有一个问题,在我的屏幕渲染。 基本上,我有一个扩展游戏的整体类,我为我的游戏的各种页面创建了一些其他类,如主菜单、实际游戏等。当我在其中一个类上调用setScreen(屏幕)时,该屏幕的渲染循环被调用,但我似乎不能绘制任何东西。 我所做的是在整个游戏类中创建了正交摄影机和spritebatch,并通过它们的构造函数方法将其传递给屏幕。然而,我似乎什么都不会画。屏幕仍会清除背景。 很抱歉,我目

  • 我想在敌人身体的顶部添加文字。 降级问题从这里开始: https://gamedev.stackexchange.com/questions/73688/why-is-my-text-is-too-large-even-when-scaled-to-05f-in-libgdx 问题是文本非常非常大,我无法将其缩小。有一个解决方案,可以添加另一个摄影机/视口。这是正常的-对于HUD屏幕。 但我需要敌

  • 多亏了我在这个论坛上解决其他问题的帮助,我成功地推进了我的项目,但另一个障碍出现在我的道路上。 我有麻烦在libgdx java实现多个屏幕。我想知道如何实现多个屏幕(一个用于主菜单,一个用于播放,一个用于加载屏幕,...)。 关于我应该如何构造我的屏幕类的一个例子或一些解释将非常有帮助。我试着实现我自己的屏幕管理器,但不太顺利...还有一些关于我应该如何处理屏幕的提示,因为每次从主菜单到播放或选

  • 本文向大家介绍Android横竖屏幕切换生命周期详解,包括了Android横竖屏幕切换生命周期详解的使用技巧和注意事项,需要的朋友参考一下 一、简介 二、代码 /activityLifeCycle_3Screen/AndroidManifest.xml 核心代码:android:configChanges="keyboardHidden|orientation|screenSize" com.fr