问题描述
长话短说:在调整窗口大小(甚至按1像素)之前,spritebatch不会渲染任何内容。
长话:我正在按照Brent Aureli的有关如何创建游戏Flappy Bird的教程进行学习:每个游戏状态(标题菜单,播放屏幕,暂停屏幕等)都是{{1} }。 State
以States
的形式管理Stack<State>
。 GameStateManager
调用位于堆栈顶部的GameStateManager
的经典循环方法。
我的问题:我在空堆栈中插入的第一个State
(无论哪个)都可以。但是,如果我弹出/推入另一状态,它将不再呈现(我得到glClearColor屏幕)。如果我只是按另一种状态,则在我单击游戏窗口底部的角并调整大小之前都不会渲染。然后一切再次呈现。
大约4周前,我下载了libgdx和Android sdk。我真的很困惑。
这是代码:
State
所以基本上:public class MyGame extends ApplicationAdapter {
public static final int V_WIDTH = 800;
public static final int V_HEIGHT = 480;
public static final String title = "MyGame";
private GameStateManager gsm;
private SpriteBatch sb;
@Override
public void create () {
sb = new SpriteBatch();
gsm = new GameStateManager();
Gdx.gl.glClearColor(0,1,1);
gsm.push(new FooState(gsm));
}
@Override
public void render () {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
gsm.update(Gdx.graphics.getDeltaTime());
gsm.render(sb);
}
@Override
public void dispose () {
}
@Override
public void resize(int width,int height) {
gsm.resize(width,height);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
public abstract class State {
protected OrthographicCamera cam;
protected GameStateManager gsm;
protected Viewport viewport;
protected State(GameStateManager gsm){
this.gsm = gsm;
cam = new OrthographicCamera();
viewport = new FitViewport(Arlesian.V_WIDTH/2,Arlesian.V_HEIGHT/2,cam);
viewport.apply();
}
protected abstract void handleinput();
public abstract void update(float dt);
public abstract void render(SpriteBatch sb);
public abstract void resize(int width,int height);
public abstract void dispose();
}
public class GameStateManager {
private Stack<State> states;
public GameStateManager(){
states = new Stack<State>();
}
public void push(State state){
states.push(state);
}
public void pop(){
states.pop();
}
public void set(State state){
states.peek().dispose();
states.pop();
states.push(state);
}
public void update(float dt){
states.peek().handleinput();
states.peek().update(dt);
}
public void render(SpriteBatch sb){
states.peek().render(sb);
}
public void resize(int width,int height){
states.peek().resize(width,height);
}
}
public class FooState extends State {
public FooState(GameStateManager gsm) {
super(gsm);
cam.setToOrtho(false,MyGame.V_WIDTH/2,MyGame.V_HEIGHT/2);
}
@Override
protected void handleinput() {
if(Gdx.input.isTouched()){
gsm.set(new FooState2(gsm));
}
}
@Override
public void update(float dt) {
cam.update();
}
@Override
public void render(SpriteBatch sb) {
}
@Override
public void resize(int width,int height) {
}
@Override
public void dispose() {
}
}
public class FooState2 extends State {
private Texture foo;
private StretchViewport viewport;
public FooState2(GameStateManager gsm) {
super(gsm);
foo = new Texture("badlogic.jpg");
cam.setToOrtho(false,MyGame.V_HEIGHT/2);
}
@Override
protected void handleinput() {
}
@Override
public void update(float dt) {
cam.update();
}
@Override
public void render(SpriteBatch sb) {
sb.setProjectionMatrix(cam.combined);
sb.begin();
sb.draw(foo,0);
sb.end();
}
@Override
public void resize(int width,int height) {
}
@Override
public void dispose() {
foo.dispose();
}
}
除了在我触摸屏幕后立即将FooState
推入FooState2
之外什么也没做。
会发生什么:我触摸屏幕,然后进入handleInput,更新,渲染的GameStateManager
循环(我非常肯定这要归功于Syso)。但是badlogic徽标不会呈现,而是显示glClearColor屏幕。然后,我单击应用程序窗口的边框并调整一下大小,然后badlogic徽标再次呈现。
另一项测试:如果我只是将FooState2完全推入GameStateManager中,那么不需要我调整窗口大小即可呈现badlogic徽标。
能帮我吗?
提前谢谢!
对不起,我的英语不好。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)