libgdx:Spritebatch在调整大小之前不渲染

libgdx:Spritebatch在调整大小之前不渲染,libgdx,resize,render,spritebatch,Libgdx,Resize,Render,Spritebatch,长话短说:我的spritebatch在调整窗口大小(甚至1像素)之前不会渲染任何内容 长话短说:我正在学习布伦特·奥雷利关于如何创建游戏《飞禽》的教程:每个游戏状态(标题菜单、游戏屏幕、暂停屏幕等)都是一个状态。状态由GameStateManager以堆栈的形式管理。GameStateManager调用位于堆栈顶部的State的经典循环方法 我的问题:我在空堆栈中推入的第一个状态(以哪个为准)呈现得很好。但是,如果我弹出/推送到另一个状态,它将不再渲染(我得到glClearColor屏幕)。如果

长话短说:我的spritebatch在调整窗口大小(甚至1像素)之前不会渲染任何内容

长话短说:我正在学习布伦特·奥雷利关于如何创建游戏《飞禽》的教程:每个游戏状态(标题菜单、游戏屏幕、暂停屏幕等)都是一个
状态
状态
GameStateManager
堆栈的形式管理。
GameStateManager
调用位于堆栈顶部的
State
的经典循环方法

我的问题:我在空堆栈中推入的第一个
状态
(以哪个为准)呈现得很好。但是,如果我弹出/推送到另一个状态,它将不再渲染(我得到glClearColor屏幕)。如果我只是按下另一个状态,则在我单击游戏窗口的下角并调整大小之前,不会进行渲染。然后一切都重新呈现

大约4周前,我下载了libgdx和androidsdk。我真的很困惑

代码如下:

公共类MyGame扩展应用程序适配器{
公共静态最终内部V_宽度=800;
公共静态最终内部V_高度=480;
公共静态最终字符串title=“MyGame”;
私人游戏经理gsm;
私家侦探对某人;
@凌驾
公共void创建(){
sb=新的SpriteBatch();
gsm=新GameStateManager();
Gdx.gl.glClearColor(0,1,0,1);
gsm.push(newfoostate(gsm));
}
@凌驾
公共无效渲染(){
Gdx.gl.glClear(GL20.gl\u颜色\u缓冲\u位);
gsm.update(Gdx.graphics.getDeltaTime());
(某人);
}
@凌驾
公共空间处置(){
}
@凌驾
公共空心调整大小(整型宽度、整型高度){
gsm.调整大小(宽度、高度);
}
@凌驾
公共空间暂停(){
}
@凌驾
公众简历(){
}
}
公共抽象类状态{
保护正交摄像机;
受保护的GameStateManager gsm;
受保护的视口;
受保护状态(GameStateManager gsm){
这个.gsm=gsm;
cam=新的正交摄影机();
视口=新的FitViewport(Arlesian.V_宽度/2,Arlesian.V_高度/2,cam);
viewport.apply();
}
受保护的抽象无效handleInput();
公开摘要无效更新(浮动dt);
公开摘要无效呈现(SpriteBatch sb);
公共抽象空间大小调整(整数宽度、整数高度);
公开摘要无效处置();
}
公共类GameStateManager{
私有堆栈状态;
公共GameStateManager(){
状态=新堆栈();
}
公共无效推送(状态){
状态。推送(状态);
}
公共空间{
states.pop();
}
公共无效集(状态){
states.peek().dispose();
states.pop();
状态。推送(状态);
}
公共无效更新(浮动dt){
states.peek().handleInput();
states.peek().update(dt);
}
公共无效渲染(SpriteBatch sb){
表示(某人);
}
公共空心调整大小(整型宽度、整型高度){
states.peek().resize(宽度、高度);
}
}
公共类FooState扩展了State{
公共食品状态(GameStateManager gsm){
超级(gsm);
cam.setToOrtho(假,MyGame.V_宽度/2,MyGame.V_高度/2);
}
@凌驾
受保护的无效handleInput(){
if(Gdx.input.isTouched()){
gsm.set(new FooState2(gsm);;
}
}
@凌驾
公共无效更新(浮动dt){
cam.update();
}
@凌驾
公共无效渲染(SpriteBatch sb){
}
@凌驾
公共空心调整大小(整型宽度、整型高度){
}
@凌驾
公共空间处置(){
}
}
公共类FooState2扩展了状态{
私人秘书处;
私有拉伸视口;
公共FooState2(GameStateManager gsm){
超级(gsm);
foo=新纹理(“badlogic.jpg”);
cam.setToOrtho(假,MyGame.V_宽度/2,MyGame.V_高度/2);
}
@凌驾
受保护的无效handleInput(){
}
@凌驾
公共无效更新(浮动dt){
cam.update();
}
@凌驾
公共无效渲染(SpriteBatch sb){
sb.设置投影矩阵(凸轮组合);
某人开始做某事;
某人画(foo,0,0);
(某人结束);
}
@凌驾
公共空心调整大小(整型宽度、整型高度){
}
@凌驾
公共空间处置(){
foo.dispose();
}

}
当我测试示例代码时,只要单击屏幕,就会呈现badlogic纹理。不需要调整大小。我想你忘了在你发布的代码中添加class
State
。问题可能出在这节课上。你好,首先感谢你抽出时间来帮助我。我添加了State类的代码。它所做的只是声明一个新的正交摄影机并应用一个视口。如果不应用视口,则会出现相同的问题,但尝试调整大小以解决问题只会导致错误。我不知道我应该修改什么。。。提前感谢您在删除line
viewport.apply()
时,它似乎再次工作,但在调试它时,我在相机中找不到任何更改。同样非常奇怪的是,调整窗口大小可以修复它,尽管所有的
resize
方法(在
状态
子类中)都是空的,所以视口中没有任何更改。。。这可能是libGDX的
Viewport
类中的一个bug,但我对此不确定。我似乎找不到问题所在。抱歉:(好吧,至少感谢你在代码的有效性上向我保证。我还被resize方法是空的这一事实弄糊涂了,但解决了这个问题!我还尝试在任何resize()中搜索代码行)当然,在接口ApplicationListener中没有。在抽象类ApplicationAdapter ei中没有