我是新的Java处。我正在写一个简单的游戏,像笨鸟先飞。我喜欢添加菜单屏幕开始游戏之前,像 - 启动游戏-Credits也许选项(也许),类似的东西。
这里是我的OnCreate基本代码:
@Override
public void create () {
batch = new SpriteBatch();
background = new Texture("background.png");
smurf = new Texture("smurf.png");
gargamel1 = new Texture("gargamel.png");
gargamel2 = new Texture("gargamel.png");
gargamel3 = new Texture("gargamel.png");
distance = Gdx.graphics.getWidth() / 2;
random = new Random();
smurfX = Gdx.graphics.getWidth() / 2 - smurf.getHeight() / 2;
smurfY = Gdx.graphics.getHeight() / 3;
shapeRenderer = new ShapeRenderer();
smurfCircle = new Circle();
enemyCircles = new Circle[numberOfEnemies];
enemyCircles2 = new Circle[numberOfEnemies];
enemyCircles3 = new Circle[numberOfEnemies];
font = new BitmapFont();
font.setColor(Color.WHITE);
font.getData().setScale(5);
font2 = new BitmapFont();
font2.setColor(Color.WHITE);
font2.getData().setScale(8);
for (int i = 0; i<numberOfEnemies; i++){
enemyOffSet[i] = (random.nextFloat() - 0.5f) * (Gdx.graphics.getHeight() - 200);
enemyOffSet2[i] = (random.nextFloat() - 0.5f) * (Gdx.graphics.getHeight() - 200);
enemyOffSet3[i] = (random.nextFloat() - 0.5f) * (Gdx.graphics.getHeight() - 200);
enemyX[i] = Gdx.graphics.getWidth() - gargamel1.getWidth() / 2 + i * distance;
enemyCircles[i] = new Circle();
enemyCircles2[i] = new Circle();
enemyCircles3[i] = new Circle();
sound = Gdx.audio.newSound(Gdx.files.internal("lose.ogg"));
}
}
有几个屏幕时,您必须在您的主类扩展Game
。
默认情况下,当你创建一个“GDX-setup.jar”主类扩展ApplicationAdapter
一个libGdx项目。
public class MultipleScreen extends Game {
现在你有一个方法:setScreen(Screen)
。用这种方法你可以改变屏幕。
下面是我经常用我的项目的模板。它还处理旧屏幕:
public class MultipleScreen extends Game {
@Override
public void create () {
}
public void changeScreen(Screen newScreen){
Screen oldScreen = getScreen();
setScreen(newScreen);
//Dispose the old screen to release resources
if(oldScreen != null)
oldScreen.dispose();
}
@Override
public void render () {
//Clear the Screen
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
//Render the current Screen
super.render();
}
@Override
public void dispose () {
//Dispose Assets which you used in the whole Game
}
}
在这里,我创建了一个新方法:changeScreen(Screen)
。此方法使用setScreen
设置屏幕和附加处置旧的Game
方法。
我们做出了榜样,我们需要两个屏幕:
public class MenuScreen implements Screen {
//We need MultipleScreen class to change the screen
private MultipleScreen game;
public MenuScreen(MultipleScreen game) {
this.game = game;
}
@Override
public void show() {
}
private float f = 0;
@Override
public void render(float delta) {
//A simple Timer which changes the screen after 10 seconds
f += delta;
if(f > 10000){
//Here you can add for example also the Level to the GameScreen which level the player choose
//game.changeScreen(new GameScreen(game, levelNumber));
game.changeScreen(new GameScreen(game));
}
}
...
}
和GameScreen其简单的显示badlogic图像:
public class GameScreen implements Screen {
private MultipleScreen game;
private SpriteBatch batch;
private Texture img;
public GameScreen(MultipleScreen game) {
this.game = game;
}
@Override
public void show() {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
}
@Override
public void render(float delta) {
//Here we don't need to add Gdx.gl.glClear...
//because we already have this in our MultipleScreen which does this for every subScreen
batch.begin();
batch.draw(img, 0, 0);
batch.end();
}
...
@Override
public void dispose() {
//This things will be disposed if we change to another Screen to save resources
batch.dispose();
img.dispose();
}
现在,我们必须做的最后一件事是,如果我们的游戏开始设置屏幕。因此,在我们的主类的create()
方法(在这种情况下MultipleScreen)我们添加:
@Override
public void create () {
changeScreen(new MenuScreen(this));
}
现在,如果游戏结束,我们将回到MenuScreen。但是,而不是创建一个新的MenuScreen每次我们可以在我们的主类中添加一个backToMenu()
方法:
private MenuScreen menuScreen;
@Override
public void create () {
menuScreen = new MenuScreen(this);
backToMenu();
}
public void backToMenu(){
setScreen(menuScreen);
}
在我们GameScreen现在我们可以简单的调用:game.backToMenu();
改回MenuScreen而无需创建一个新的。
重要
如果我们调用setScreen()
的show()
方法将被调用和类的不是构造函数。
所以每次资产你必须在show()方法在构造函数创建不否则你不会有任何资产,如果你表现出屏幕的第二次类Dispose()方法处理。
作为一个希望这个小指南将帮助您。如果您需要更多的帮助,您可以在网上找到一些教程,他们改变屏幕:
https://www.gamedevelopment.blog/full-libgdx-game-tutorial-project-setup/
做到这一点最好方法是一种国家制度。即你根据你在(菜单,播放等)什么状态更新的代码不同的一点。
因此,在渲染方法你有一个,如果类似下面的语句东西:
if (state == 0) {
menu();
else if (state == 1) {
game();
}
在每一个相应的功能,你必须为国家代码。您可以得出完全不同的事情和更新/移动其他事情也是如此。
如果你习惯使用这个概念,您可以创建具有State
和create()
方法render()
类,在主类初始化并运行每个状态相应来代替。