我是Java新手。我正在写一个像《飞扬的小鸟》这样的简单游戏。我喜欢开始游戏前的添加菜单屏幕,例如 -开始游戏-信用(可能)或类似的选择。
这是我的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"));
}
}
答案 0 :(得分:0)
状态系统是一种很好的方法。也就是说,您根据自己所处的状态(菜单,播放等)来更新不同的代码。
因此,在您的render方法中,您将具有类似于以下内容的if语句:
if (state == 0) {
menu();
else if (state == 1) {
game();
}
在每个相应的函数中,您都有该状态的代码。 您可以绘制完全不同的事物,也可以更新/移动其他事物。
如果您对此概念感到满意,则可以创建一个具有State
和create()
方法的render()
类,在主类中对其进行初始化,然后相应地运行每个状态。
答案 1 :(得分:0)
要拥有多个屏幕,必须在主类中扩展Game
。
使用“ gdx-setup.jar”创建libGdx项目时,默认为Main类扩展ApplicationAdapter
。
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
的{{1}}方法设置屏幕并另外处理旧屏幕。
现在做一个例子,我们需要两个屏幕:
Game
还有一个GameScreen,可以简单地显示逻辑图像:
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));
}
}
...
}
现在,我们要做的最后一件事就是在游戏开始时设置一个屏幕。因此,在我们的主类的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();
}
方法(在本例中为MultipleScreen)中,我们添加了:
create()
现在,如果游戏结束了,我们将返回MenuScreen。但是我们不必每次都创建一个新的MenuScreen,而可以在Main类中添加一个@Override
public void create () {
changeScreen(new MenuScreen(this));
}
方法:
backToMenu()
现在,在我们的GameScreen中,我们可以简单地调用:private MenuScreen menuScreen;
@Override
public void create () {
menuScreen = new MenuScreen(this);
backToMenu();
}
public void backToMenu(){
setScreen(menuScreen);
}
,以返回到MenuScreen,而无需创建新菜单。
重要
如果我们调用game.backToMenu();
,则将调用setScreen()
方法,而不是该类的Constructor。
因此,您在类dispose()方法中处置的每个资产都必须在show()方法中创建,而不是在构造函数中创建,否则,如果第二次显示Screen,您将没有资产。
希望这个小指南对您有所帮助。 如果您需要更多帮助,可以在Internet上找到一些教程,它们会更改屏幕:
https://www.gamedevelopment.blog/full-libgdx-game-tutorial-project-setup/