#java #android #libgdx
#java #Android #libgdx
Вопрос:
Итак, я разрабатываю игру для Android / настольных компьютеров с libgdx. В последнее время я добился большого прогресса, но одна проблема остается.
У меня есть блок if / else, который проверяет, есть ли у пользователя имя, сохраненное в общих настройках. Если таковой нет, появится окно libgdx с вводом текста и кнопкой. Как только нажимается кнопка отправки, информация об игроках отправляется на сервер, сервер отправляет обратно список рекордов, и для их отображения создается таблица. Проблема в том, что на данный момент я не вижу свою таблицу. Строки отладки отрисованы, и я на 100% уверен, что данные возвращаются чистыми, поскольку я могу распечатать все это.
Однако, если у пользователя действительно есть имя в общих настройках и блок if / else переходит к else без появления окна ввода, та же самая функция buildHighScores() работает отлично.
Я понимаю, что глупо выполнять всю эту работу в прослушивателе кликов, но я пробовал перемещать вещи повсюду и выполнять в разных порядках, но безуспешно. Я также знаю, что все это можно было бы структурировать лучше, но я не уверен, почему это не работает. Спасибо.
…инициализируйте все….
// click listener for input window button
btnSubmitName.addListener(new ClickListener() {
@Override
public void clicked(
com.badlogic.gdx.scenes.scene2d.InputEvent event, float x,
float y) {
super.clicked(event, x, y);
stage.addAction(Actions.sequence(Actions.fadeOut(1), Actions.run(new Runnable() {
@Override
public void run() {
try {
// check database if name is taken
if(netcode.IsNameTaken(txtVal) == false) {
prefs.putString("name", txtVal);
prefs.flush();
System.out.println("thnx " txtVal " m8");
/////////////////////////////////////////
// doesn't display table, only debug lines
/////////////////////////////////////////
buildHighScores();
inputOK = true;
}
else System.out.println("name is taken");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
})));
}
});
if(prefs.getString("name", null) == null)
{
System.out.println("ok...");
try {
netcode.setState(0);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Adding Input Window...");
stage.addActor(window);
}
else
{
System.out.println("Name not null...");
//////////////////////////
// displays table perfectly
//////////////////////////
buildHighScores();
}
…stage.действие и stage.ничья…
public void buildHighScores() {
playerdata.setPlayerName(prefs.getString("name"));
System.out.println("hey " playerdata.getPlayerName());
highScoreString = prefs.getString("highscore");
String decodedString = Base64Coder.decodeString(highScoreString);
System.out.println(decodedString);
playerdata.setHighScore(Integer.parseInt(decodedString));
try {
netcode.setState(1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// connect to server and update play
try {
netcode.serverConnect(playerdata);
} catch (ConnectException e) {
System.out.println("socket exception brah");
//gsm.setState(0);
e.printStackTrace();
//stage.addActor(errorWindow);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// get high score list from server
HighScoreList = netcode.GetHighScores();
// not necessary
for(int i = 0 ; i < HighScoreList.size() ; i ) {
String tmp = new String(i 1 " " HighScoreList.get(i).getPlayerName() " " HighScoreList.get(i).getHighScore());
HighScoresList.add(tmp);
//System.out.println(tmp);
}
// build scoresTable with the high score list we got from server
scoresTable.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
for (int i = 0 ; i < HighScoresList.size() ; i ){
scoresTable.add(new Label("" (i 1), labelStyle)).left();
scoresTable.add().width(Gdx.graphics.getWidth()/6);
scoresTable.add(new Label(HighScoreList.get(i).getPlayerName(), labelStyle)).left();
scoresTable.add().width(Gdx.graphics.getWidth()/6);
scoresTable.add(new Label("" HighScoreList.get(i).getHighScore(), labelStyle)).left();
scoresTable.row();
//System.out.println(i);
}
scoresTable.debug();
// add scoresTable to a scrollpane
scrollpane = new ScrollPane(scoresTable);
// create table to display high scores
table.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
table.add(label);
table.row();
table.add(textfield).width(Gdx.graphics.getWidth()/2);
table.row();
table.add(scrollpane).fill().height(Gdx.graphics.getHeight()/2);
table.row();
table.add(button2);
table.debug();
stage.clear();
stage.addActor(table);
}
Комментарии:
1. в условии if вам нужно сбросить текущий фрейм / действие.. чтобы сохраненные изменения вступили в силу
2. Является ли экземпляр Preferences, который вы используете, синглтоном? (Вы убедитесь, что существует только один ее экземпляр) потому что я столкнулся с ошибкой создания нескольких копий, а затем промывка вообще не сработала. Кроме того, вы уверены, что таблица инициализирована должным образом? (Я не использовал таблицу, я создал свой собственный просмотр списка, но это была не таблица)