我正在使用LibGDX制作游戏。现在我有两个问题。
首先,我试图抓住钥匙,以便游戏暂停。我已经在Gdx.input.setCatchBackKey(true)
课程中调用了Game
方法。这是代码:
public class CvSGame extends Game {
public Preferences prefs;
@Override
public void create() {
Gdx.input.setCatchBackKey(true);
prefs = Gdx.app.getPreferences("game_pref");
//setScreen(new SplashScreen(this));
//setScreen(new HomeScreen(this));
//setScreen(new GameScreen(this));
GamePlay.initialized(this);
}
}
GamePlay.initialized
是一种设置Game
的方法,GameScreen
实现Screen
和InputProcessor
。
在GameScreen
中,我已拨打setInputProcessor
。 GameScreen
的代码是:
public class GameScreen implements Screen, InputProcessor{
CvSGame parent;
public GameScreen(CvSGame pParent){
parent = pParent;
Gdx.input.setInputProcessor(this);
}
@Override
public void show() {
}
@Override
public void resize(int width, int height) {
}
@Override
public void render(float delta) {
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
@Override
public boolean keyDown(int keycode) {
if(keycode == Keys.BACK) {
pauseGame();
}
return false;
}
@Override
public boolean keyUp(int keycode) {
return false;
}
@Override
public boolean keyTyped(char character) {
return false;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
return false;
}
@Override
public boolean scrolled(int amount) {
return false;
}
private void pauseGame(){
GamePlay.gameState = GamePlay.PAUSED;
}
}
我认为,如果我的Android设备上的“后退”按钮被按下,它将调用keyDown
方法并调用方法pauseGame
。
但是,这没有发生。我的游戏正在退出,并且未调用keyDown
方法(如果调用方法keyDown,我已经尝试记录消息,但消息永远不会出现)。
我遇到的第二个问题是使用方法pause()
暂停游戏。我认为如果主页按钮或设备收到呼叫,将调用pause
中的方法GameScreen
。所以,我想如果我想在按下主页按钮时暂停我的游戏,我会在方法pauseGame
中调用方法pause
。它运作良好。但问题出现在我按下后退按钮以便游戏退出。在游戏退出并且我再次尝试启动它之后,我的纹理没有被加载。
顺便说一下,目前我没有使用AssetManager
,而是调用方法在构造函数中加载资源。
答案 0 :(得分:3)
据我了解,您需要在致电InputProcessor
之前设置setCatchBackKey
。您可以通过将GameScreen
构造函数更改为:
public GameScreen(CvSGame pParent) {
parent = pParent;
Gdx.input.setInputProcessor(this);
Gdx.input.setCatchBackKey(true);
}
相关问题:In libgdx, how do I get input from the back button?
至于纹理没有加载。确保在游戏被销毁(dispose
功能)时,您正在卸载所有纹理并处理它们。重新创建游戏时,请务必再次加载它们。
列出的所有类here都需要手动处理,否则会导致泄漏。关于纹理,您可能会遇到加载纹理的问题,而无需先处理旧版本。
答案 1 :(得分:0)
对于您的用例(在按下后面调用pause
方法),您不需要做任何特殊操作来捕获Back键。 Libgdx将在您注册的pause
上调用ApplicationListener
方法。请参阅ApplicationListener.pause()
javadoc说明:
暂停应用程序时调用。应用程序在销毁之前暂停,当用户按下Android上的“主页”按钮或发生来电时。在桌面上,这只会在调用dispose()之前立即调用。
Game
ApplicationListener
会自动转发pause
到当前的Screen
。
答案 2 :(得分:0)
您在课堂上实施InputProcessor
吗?而且,正如@MCeley所说,你应该按顺序放置这些代码:
Gdx.input.setInputProcessor(this);
Gdx.input.setCatchBackKey(true);
此外,在pauseMenu()
方法中,添加一个布尔参数,这样一个好的旧标志:
private void pauseGame(boolean isPaused){
if(isPaused) {
GamePlay.gameState = GamePlay.PAUSED;
} else {
GamePlay.gameState = GamePlay.UNPAUSED;
}
}
在GameScreen
类中添加布尔值作为标志和字段。记住,标记就像一个标记,它是一种更好的方法来对抗或逆转它。在接受我的答案之前,你必须研究序列如何工作的流程,从最后开始而不是从开头开始。你必须通过重新跟踪步骤找出它是如何实现的。请注意,这在某种程度上是伪代码。