LibGDX HTML 部署中的 GwtApplication 异常(TypeError)
LibGDX GwtApplication Exception (TypeError) in HTML Deployment
我尝试在 HTML 中部署我的 libgdx 游戏。在桌面和 Android 中它运行良好。当我执行 ./gradlew html:dist
时,它编译正常并且我有一个在 html 文件夹中创建的 dist 文件夹。我成功地在浏览器上启动了游戏:
但是,当我点击任何会改变屏幕的按钮时,游戏崩溃了:
错误是:
GwtApplication: exception: (TypeError) : a.g[a.b] is undefined
(TypeError) : a.g[a.b] is undefined
在控制台中,我有:
Error: java.lang.RuntimeException: com.google.gwt.core.client.JavaScriptException: (TypeError) : a.g[a.b] is undefined
两个问题 (1, 2) 有同样的问题,但 none 解决了我的问题。
----- 这是我换屏的方法 ----
例如,当用户点击统计信息时,我的代码会这样做:
button_stats.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y){
stage.addAction(Actions.sequence(Actions.fadeOut(0.2f), Actions.run(new Runnable(){
@Override
public void run() {
ScreenManager.getInstance().showScreen(ScreenEnum.STATS);
}
})));
}
});
这是我的屏幕管理员:
public class ScreenManager {
// Singleton: unique instance
private static ScreenManager instance;
// Reference to game
private SpeedRun2Game game;
// Singleton: private constructor
private ScreenManager() {
super();
}
// Singleton: retrieve instance
public static ScreenManager getInstance() {
if (instance == null) {
instance = new ScreenManager();
}
return instance;
}
// Initialization with the game class
public void initialize(SpeedRun2Game game) {
this.game = game;
}
// Show in the game the screen which enum type is received
public void showScreen(com.gangscred.speedrun2.screens.ScreenEnum screenEnum, Object... params) {
// Get current screen to dispose it
Screen currentScreen = game.getScreen();
// Show new screen
Screen newScreen = screenEnum.getScreen(game , params);
game.setScreen(newScreen);
// Dispose previous screen
if (currentScreen != null) {
currentScreen.dispose();
}
}
}
最后是我的 screenEnum:
public enum ScreenEnum {
STATS{
public Screen getScreen(SpeedRun2Game game, Object... params){
return new StatsScreen(game);
}
}
----- 编辑 -----
我按照建议向我的 gwt 编译器添加了 style = 'PRETTY' 选项,现在出现此错误:
Error: java.lang.RuntimeException: com.google.gwt.core.client.JavaScriptException: (TypeError) : this$static.uniforms[this$static.currProgram] is undefined
出于某种原因,在 HTML 中,您不能在新的 Runnable 中使用静态方法。所以当你想换屏的时候,需要去掉fadeout:
button_stats.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y){
ScreenManager.getInstance().showScreen(ScreenEnum.STATS);
}
});
或者你可以保留淡出但删除你的静态功能并直接改变屏幕:
SpeedRun2Game game;
...
button_stats.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y){
stage.addAction(Actions.sequence(Actions.fadeOut(0.2f), Actions.run(new Runnable(){
@Override
public void run() {
game.setScreen(new StatsScreen(game));
}
})));
}
});
我尝试在 HTML 中部署我的 libgdx 游戏。在桌面和 Android 中它运行良好。当我执行 ./gradlew html:dist
时,它编译正常并且我有一个在 html 文件夹中创建的 dist 文件夹。我成功地在浏览器上启动了游戏:
但是,当我点击任何会改变屏幕的按钮时,游戏崩溃了:
错误是:
GwtApplication: exception: (TypeError) : a.g[a.b] is undefined (TypeError) : a.g[a.b] is undefined
在控制台中,我有:
Error: java.lang.RuntimeException: com.google.gwt.core.client.JavaScriptException: (TypeError) : a.g[a.b] is undefined
两个问题 (1, 2) 有同样的问题,但 none 解决了我的问题。
----- 这是我换屏的方法 ----
例如,当用户点击统计信息时,我的代码会这样做:
button_stats.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y){
stage.addAction(Actions.sequence(Actions.fadeOut(0.2f), Actions.run(new Runnable(){
@Override
public void run() {
ScreenManager.getInstance().showScreen(ScreenEnum.STATS);
}
})));
}
});
这是我的屏幕管理员:
public class ScreenManager {
// Singleton: unique instance
private static ScreenManager instance;
// Reference to game
private SpeedRun2Game game;
// Singleton: private constructor
private ScreenManager() {
super();
}
// Singleton: retrieve instance
public static ScreenManager getInstance() {
if (instance == null) {
instance = new ScreenManager();
}
return instance;
}
// Initialization with the game class
public void initialize(SpeedRun2Game game) {
this.game = game;
}
// Show in the game the screen which enum type is received
public void showScreen(com.gangscred.speedrun2.screens.ScreenEnum screenEnum, Object... params) {
// Get current screen to dispose it
Screen currentScreen = game.getScreen();
// Show new screen
Screen newScreen = screenEnum.getScreen(game , params);
game.setScreen(newScreen);
// Dispose previous screen
if (currentScreen != null) {
currentScreen.dispose();
}
}
}
最后是我的 screenEnum:
public enum ScreenEnum {
STATS{
public Screen getScreen(SpeedRun2Game game, Object... params){
return new StatsScreen(game);
}
}
----- 编辑 -----
我按照建议向我的 gwt 编译器添加了 style = 'PRETTY' 选项,现在出现此错误:
Error: java.lang.RuntimeException: com.google.gwt.core.client.JavaScriptException: (TypeError) : this$static.uniforms[this$static.currProgram] is undefined
出于某种原因,在 HTML 中,您不能在新的 Runnable 中使用静态方法。所以当你想换屏的时候,需要去掉fadeout:
button_stats.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y){
ScreenManager.getInstance().showScreen(ScreenEnum.STATS);
}
});
或者你可以保留淡出但删除你的静态功能并直接改变屏幕:
SpeedRun2Game game;
...
button_stats.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y){
stage.addAction(Actions.sequence(Actions.fadeOut(0.2f), Actions.run(new Runnable(){
@Override
public void run() {
game.setScreen(new StatsScreen(game));
}
})));
}
});