还未实现的功能有 游戏结束判断,菜单界面,机器蛇(AI) 我们先来实现游戏结束判断和游戏重开
效果图
首先还是老套路 看图。
这次就没录gif图 主要是就看个结果。毕竟录gif也挺麻烦的。>_<!
边界碰撞判断
在这里我们判断上下左右 4个边界判断碰撞,当蛇头
(即Snake 的位置 position)
- 右边界
position.x >=MAP_WIDTH/2
- 左边界
position.x <= -MAP_WIDTH/2
- 上边界
position.y>=MAP_HEIGHT/2
- 下边界
position.y <=-MAP_HEIGHT/2
代码修改
修改 WorldController.java
添加属性
1
| private boolean gameOver;
|
添加方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private void checkGameOver() { float radius = snake.bounds.width / 2; if (snake.position.x + radius >= Constants.MAP_WIDTH / 2 || snake.position.x <= -Constants.MAP_WIDTH / 2 || snake.position.y + radius >= Constants.MAP_HEIGHT / 2 || snake.position.y <= -Constants.MAP_WIDTH / 2) { gameOver = true; AudioManager.instance.stopMusic(); AudioManager.instance.play(Assets.instance.sounds.liveLost); } }
public boolean isGameOver() { return gameOver; }
|
在update()
方法改为如下
1 2 3 4 5 6 7 8 9 10 11
| public void update(float deltaTime) { if (isGameOver()) return; handleInput(deltaTime); snake.update(deltaTime); testCollision(); cameraHelper.update(deltaTime); for (Food food : foods) { food.update(deltaTime); } checkGameOver(); }
|
我们看到的效果图用到的是LibGdx 默认的皮肤 可以从LibGdx 找到也可以去我的github
将uiskin.atlas
,uiskin.json
和uiskin.png
拷贝到assets 目录下面 然后开始写代码了。
修改WorldRenderer.java
添加下面几个属性
1 2 3 4
| private Skin skinLibgdx; private TextButton btnBack; private TextButton btnStart; private Window winGameOver;
|
初始化
1 2 3 4
| skinLibgdx = new Skin(Gdx.files.internal(Constants.SKIN_LIBGDX_UI),new TextureAtlas(Constants.TEXTURE_ATLAS_LIBGDX_UI)); ... stage.addActor(buildGameOverDialog()); ...
|
Constants.java
中添加
1 2
| public static final String SKIN_LIBGDX_UI = "images/uiskin.json"; public static final String TEXTURE_ATLAS_LIBGDX_UI = "images/uiskin.atlas";
|
buildGameOverDialog()
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| private Table buildGameOverDialog() { winGameOver = new Window("GAME OVER", skinLibgdx); Table table = new Table(); table.pad(10, 10, 0, 10); table.add(new Label("GAME OVER!", skinLibgdx, "default-font", Color.ORANGE)).colspan(3); table.row(); btnBack = new TextButton("Back", skinLibgdx); table.add(btnBack).padRight(30); btnBack.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { showOptionsWindow(false, true); Gdx.app.exit(); } }); btnStart = new TextButton("ReStart", skinLibgdx); table.add(btnStart); btnStart.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { AudioManager.instance.play(Assets.instance.sounds.bm); showOptionsWindow(false, true); worldController.init(); } }); winGameOver.add(table).pad(10, 10, 0, 10); winGameOver.setColor(1, 1, 1, 0.8f); showOptionsWindow(false, false); winGameOver.pack(); winGameOver.setPosition((Constants.VIEWPORT_GUI_WIDTH - winGameOver.getWidth()) / 2, (Constants.VIEWPORT_GUI_HEIGHT - winGameOver.getHeight()) / 2); return winGameOver; }
|
showOptionsWindow
方法
1 2 3 4 5 6
| public void showOptionsWindow(boolean visible, boolean animated) { float alphaTo = visible ? 0.8f : 0.0f; float duration = animated ? 1.0f : 0.0f; final Touchable touchEnable = visible ? Touchable.enabled : Touchable.disabled; winGameOver.addAction(sequence(touchable(touchEnable), alpha(alphaTo, duration))); }
|
在方法render()
中 添加以下代码
1 2 3
| if (worldController.isGameOver()) { showOptionsWindow(true, true); }
|
尝试运行下吧!
GitHub
代码已经放在GITHUB
可以切换到tag4
来查看本篇文章代码
使用 `git checkout tag4