我刚开始使用Parse作为我的后端解决方案。 我遇到登录/登录错误。这些方法没有任何Parse错误。但是我认为这是登录/登录屏幕上的交易失败了。
这是登录错误:
09-29 12:52:43.521 27557-27557/com.test.MyGame.android E/libEGL﹕ call to OpenGL ES API with no current context (logged once per thread)
09-29 12:52:43.531 27557-27557/com.test.MyGame.android D/AndroidRuntime﹕ Shutting down VM
09-29 12:52:43.531 27557-27557/com.test.MyGame.android E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.test.MyGame.android, PID: 27557
java.lang.IllegalArgumentException: Error compiling shader:
at com.badlogic.gdx.graphics.g2d.SpriteBatch.createDefaultShader(SpriteBatch.java:157)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.<init>(SpriteBatch.java:120)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.<init>(SpriteBatch.java:73)
at com.badlogic.gdx.scenes.scene2d.Stage.<init>(Stage.java:99)
at com.test.MyGame.screens.MainScreen.<init>(MainScreen.java:55)
at com.test.MyGame.screens.LogInScreen$1$1.done(LogInScreen.java:163)
at com.test.MyGame.screens.LogInScreen$1$1.done(LogInScreen.java:153)
at com.parse.ParseTaskUtils$2$1.run(ParseTaskUtils.java:115)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
这是登录代码:
logInButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
//Validate data
boolean validationError = false;
StringBuilder validationErrorMessage =
new StringBuilder("Please");
if(isEmpty(userName)){
validationError = true;
validationErrorMessage.append("enter a username");
}
if(isEmpty(password)) {
if(validationError) {
validationErrorMessage.append(", and");
}
validationError = true;
validationErrorMessage.append("enter a password");
}
validationErrorMessage.append(".");
//If there was an validation erro display it:
if(validationError) {
//TODO **
return;
}
//Show progress wheel
//*******************
//Call login
ParseUser.logInInBackground(userName.getText().toString(), password.getText().toString(), new LogInCallback() {
@Override
public void done(ParseUser parseUser, ParseException e) {
//Dismiss progress wheel TODO**
//*****************************
if(e != null) {
System.out.println("LogIn" + e);
} else {
//Release app access, they are logged in:
game.setScreen(new MainScreen(game));
}
}
});
}
});
现在,我如何理解错误,它是在类MainScreen中引起的,我的应用程序将在登录完成后将其设置为屏幕。我不确定是这种情况吗?但是当我在没有登录/注册的情况下启动它时,MainScreen无故障运行。
MainScreen:
public class MainScreen implements Screen {
final MyGame game;
private int screenWidth=1000;
private int screenHeight=2000;
private OrthographicCamera camera;
private Viewport view;
public Texture background, test, testDown;
private Stage uiStage;
private Skin uiSkin;
private String header = "Home";
//UI
private ImageTextButton tombstoneButton, storeButton, memoriesButton;
private ImageTextButton.ImageTextButtonStyle textButtonStyle;
private TextureRegionDrawable tombstone_TRD, tombstone_TRD_Down;
private Table buttonTable;
public MainScreen(MyGame game) {
game = game;
//Set's up camera
camera = new OrthographicCamera(screenWidth, screenHeight);
camera.setToOrtho(false, screenWidth, screenHeight);
//Set's up viewport
view = new StretchViewport(screenWidth, screenHeight, camera);
view.apply();
loadAssets();
uiStage = new Stage(view);
//font = new BitmapFont();
uiSkin = new Skin();
}
public void loadAssets() {
background = game.getAssets().getTexture(game.getAssets().background);
test = game.getAssets().getTexture(game.getAssets().testButton);
testDown = game.getAssets().getTexture(game.getAssets().testButtonDown);
}
@Override
public void show() {
//Initializing UI components
tombstone_TRD_Down = new TextureRegionDrawable(new TextureRegion(testDown));
tombstone_TRD = new TextureRegionDrawable(new TextureRegion(test));
textButtonStyle = new ImageTextButton.ImageTextButtonStyle();
textButtonStyle.font = tombstone.buttonsFont;
textButtonStyle.up = uiSkin.newDrawable(uiSkin.newDrawable(tombstone_TRD));
textButtonStyle.down = uiSkin.newDrawable(uiSkin.newDrawable(tombstone_TRD_Down));
tombstoneButton = new ImageTextButton("Tombstone", textButtonStyle);
//ButtonTable
buttonTable = new Table();
buttonTable.setBounds(100,700,800,500);
buttonTable.add(tombstoneButton).size(800,200);
buttonTable.row();
buttonTable.add(tombstoneButton).size(395,200).pad(5);
//Adds table of buttons to stage
uiStage.addActor(buttonTable);
//Process input from buttons
Gdx.input.setInputProcessor(game.inputMultiplexer);
game.inputMultiplexer.addProcessor(uiStage);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update();
game.batch.setProjectionMatrix(camera.combined);
game.batch.begin();
//Draws background
game.batch.draw(background,0,0,screenWidth,screenHeight);
//Draws header/topic text
game.headerFont.draw(tombstone.batch, header, 250, 1600);
game.batch.end();
uiStage.act(Gdx.graphics.getDeltaTime());
uiStage.draw();
}
@Override
public void resize(int width, int height) {
view.update(width, height, false);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
根据Parse的文档,我应该在调用done()时无错误地使用Intent进行交易。但是我使用了libgdx框架,所以如果我可以在完成后设置一个新屏幕,那将会更容易。
先谢谢。如果需要更多代码,我会提供。
答案 0 :(得分:2)
第二个原因可能是线程问题,即您正在尝试从GL线程以外更新GL内容。您可能需要从GL线程内部创建一个Handler,然后使用该Handler调用setScreen方法。
尝试在成功登录的其他部分内做一些事情:
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
game.setScreen(new MainScreen(game));
}
});