【问题标题】:LibGDX render not called after resize调整大小后未调用 LibGDX 渲染
【发布时间】:2017-10-03 14:22:27
【问题描述】:

我正在用 LibGDX 制作一个简单的 2D 游戏。这是我的第一个项目。

在我的手机上一切正常,没什么不好(6.0.1),但在其他手机上(无论是什么版本)它都不起作用。很明显render方法不起作用,但我不知道为什么。我尝试添加super.render();,但它变成了红色,所以它不起作用或者我犯了一些错误。

这是一个菜单屏幕,先显示什么。它运行良好,而不是我玩死,而不是我再次调用它并崩溃。

public class MenuScreen implements Screen {

private DualisAutosapp game;
private OrthographicCamera camera;
...
  public MenuScreen(DualisAutosapp game)
    {
    super();
    Gdx.app.log("Menu","Started");


    this.game = game;

    camera = new OrthographicCamera();
    camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

    Gdx.app.log("Menu","Camera");

    logoTexture = new Texture(Gdx.files.internal("background.png"));
    logoTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
    logo = new Sprite(logoTexture);
    Gdx.app.log("Menu","Background");

    startTexture = new Texture(Gdx.files.internal("start.png"));
    startTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
    start = new Sprite(startTexture);
    Gdx.app.log("Menu","Start");

    carChooseTexture = new Texture(Gdx.files.internal(prefs.getString("playercar", "player/mazda2.png")));
    carChooseTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
    carChoose = new Sprite(carChooseTexture);
    Gdx.app.log("Menu","Car");

    font = new BitmapFont(Gdx.files.internal("font/joystix_monospace.fnt"), Gdx.files.internal("font/joystix_monospace.png"), false);


    batch = new SpriteBatch();
    Gdx.app.log("Menu","batch");

    calculateSpriteLocation(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
    Gdx.app.log("Menu","calculate");
    }

   @Override
   public void show() {

   }

   @Override
   public void resize(int width, int height) {
       camera = new OrthographicCamera();
       camera.setToOrtho(false,Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

       calculateSpriteLocation(width,height);
   }

   @Override
   public void render (float delta) {
       Gdx.app.log("Menu","render");
       Gdx.gl.glClearColor(1, 1, 1, 1);
       Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    ...
   }
   @Override
    public void resume() {
    Gdx.app.log("Menu","Rizjúm");
    carChooseTexture = new Texture(Gdx.files.internal(prefs.getString("playercar", "player/mazda2.png")));
    carChooseTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
    carChoose = new Sprite(carChooseTexture);
    }

    @Override
    public void hide() {

    }

    private void calculateSpriteLocation(int width, int height)
    {
        logo.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        logo.setPosition(width/2-logo.getWidth()/2, height/2-logo.getHeight()/2);

        start.setSize(Gdx.graphics.getWidth()/3.6f, Gdx.graphics.getHeight()/6.4f);
        start.setPosition(width/2-start.getWidth()/2, height/2-start.getHeight()/2);

        carChoose.setSize(Gdx.graphics.getWidth()/3.6f, Gdx.graphics.getHeight()/6.4f);
        carChoose.setPosition(width/2-carChoose.getWidth()/2, height/10-carChoose.getHeight()/2);
    }
}

在渲染日志崩溃之前一切正常。

编辑

游戏类

public class DualisAutosapp extends Game {

  @Override
  public void create () {
      showMenuScreen();
  }

  public void switchScreen(Screen newScreen){
      Screen previousScreen = getScreen();
      setScreen( newScreen );

      if (previousScreen != null)
      {
          previousScreen.dispose();
      }
  }

  public void showMenuScreen()
  {
      switchScreen(new MenuScreen(this));
  }

  public void showGameScreen()
  {
      switchScreen(new GameScreen(this));
  }

  public void showCarChangeScreen() {
      switchScreen( new CarChange(this));
  }
}

【问题讨论】:

  • 请出示您的Game 班级?以及为什么要在resize 方法中创建相机。
  • 游戏类已添加。这是一个教学视频系列。它来自那里。
  • 添加崩溃日志?
  • 01-07 23:31:26.492 26218-26245/hu.qnszt.dualisautosapp A/libc:致命信号 11 (SIGSEGV) 位于 0x57348008 (code=1),线程 26245 (Thread-1698)
  • 只有一行错误?

标签: java android libgdx render


【解决方案1】:

首先我建议你遵循Libgdx API的Game/ScreenLife cycle方法。如果不覆盖 Game 的生命周期方法,则调用 Screen 对应的方法。

您可以随时初始化对象,但这不是一个好方法。最好在Screen 接口的show 方法中初始化所有屏幕对象。

在 Game 类中一次创建所有屏幕的对象,并且只在 setScreen(screen) 方法中使用该对象。

@Override
public void show() {
   ..//create objects
}

使用dispose() 方法并销毁您在show() 中创建的对象。 方法resize() 可用于根据设备大小更新相机的视口。 根据您的要求(如音乐暂停)使用pause()resume(),但不适用于对象初始化。

【讨论】:

    【解决方案2】:

    好吧,我认为您不应该每次都将 Game 类传递给屏幕构造函数,您可以尝试使用类似的方法进行屏幕管理。

    import com.badlogic.gdx.Screen;
    
    public enum MyScreens {
    
        GAME_SCREEN {
            public Screen getScreenInstance() {
                return new GameScreen();
            }
        },
        MAIN_MENU {
            public Screen getScreenInstance() {
                return new MainMenu();
            }
        },
        SPLASH_SCREEN {
            public Screen getScreenInstance() {
                return new SplashScreen();
            }
        };
        public abstract Screen getScreenInstance();
    
    }
    
    
    
    import com.badlogic.gdx.Screen;
    import com.badlogic.gdx.utils.IntMap;
    
    public class ScreenManager {
    
        private static ScreenManager instance;
        private Game game;
        private IntMap<Screen> screens;
    
        private ScreenManager() {
            screens = new IntMap<Screen>();
        }
    
        public static ScreenManager getInstance() {
            if (instance == null) {
                instance = new ScreenManager();
            }
            return instance;
    
        }
    
        public void initialize(Game game) {
            this.game = game;
        }
    
        public void show(MyScreens screen) {
    
            if (game == null) {
                return;
            }
            if (!screens.containsKey(screen.ordinal())) {
                screens.put(screen.ordinal(), screen.getScreenInstance());
            }
            game.setScreen(screens.get(screen.ordinal()));
        }
    
        public void dispose(MyScreens screen) {
            if (!screens.containsKey(screen.ordinal())) {
                return;
            }
            screens.remove(screen.ordinal()).dispose();
        }
    
        public void dispose() {
            for (Screen screen : screens.values()) {
                screen.dispose();
            }
            screens.clear();
            instance = null;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      相关资源
      最近更新 更多