读 Beginning Android Games 2nd Edition (二十) 游戏GameScreen类
来源:互联网 发布:三星电视怎么设置网络 编辑:程序博客网 时间:2024/05/17 05:10
GameScreen类的主要工作是负责显示几种游戏不同状态下的界面
这个分屏分别是:准备游戏,游戏中,游戏暂停,游戏结束
package com.badlogic.androidgames.mrnom;import java.util.List;import android.graphics.Color;import com.badlogic.androidgames.framework.Game;import com.badlogic.androidgames.framework.Graphics;import com.badlogic.androidgames.framework.Input.TouchEvent;import com.badlogic.androidgames.framework.Pixmap;import com.badlogic.androidgames.framework.Screen;//枚举游戏的四种状态,准备游戏,游戏中,游戏暂停,游戏结束public class GameScreen extends Screen { enum GameState { Ready, Running, Paused, GameOver } GameState state = GameState.Ready; World world; int oldScore = 0; String score = "0"; public GameScreen(Game game) { super(game); world = new World(); } @Override public void update(float deltaTime) { List<TouchEvent> touchEvents = game.getInput().getTouchEvents(); game.getInput().getKeyEvents(); if(state == GameState.Ready) updateReady(touchEvents); if(state == GameState.Running) updateRunning(touchEvents, deltaTime); if(state == GameState.Paused) updatePaused(touchEvents); if(state == GameState.GameOver) updateGameOver(touchEvents); } //在准备游戏状态,触碰屏幕就进入游戏 private void updateReady(List<TouchEvent> touchEvents) { if(touchEvents.size() > 0) state = GameState.Running; } //游戏中状态 private void updateRunning(List<TouchEvent> touchEvents, float deltaTime) { int len = touchEvents.size(); for(int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if(event.type == TouchEvent.TOUCH_UP) { //如果碰到暂停按钮 if(event.x < 64 && event.y < 64) { if(Settings.soundEnabled) Assets.click.play(1); state = GameState.Paused; return; } } if(event.type == TouchEvent.TOUCH_DOWN) { //如果碰到逆时钟转向按钮 if(event.x < 64 && event.y > 416) { world.snake.turnLeft(); } //如果碰到顺时钟转向按钮 if(event.x > 256 && event.y > 416) { world.snake.turnRight(); } } } world.update(deltaTime); //游戏结束 if(world.gameOver) { if(Settings.soundEnabled) Assets.bitten.play(1); state = GameState.GameOver; } //累加游戏得分,并播放吃中目标的音效 if(oldScore != world.score) { oldScore = world.score; score = "" + oldScore; if(Settings.soundEnabled) Assets.eat.play(1); } } private void updatePaused(List<TouchEvent> touchEvents) { int len = touchEvents.size(); for(int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if(event.type == TouchEvent.TOUCH_UP) { if(event.x > 80 && event.x <= 240) { //如果选择恢复游戏 if(event.y > 100 && event.y <= 148) { if(Settings.soundEnabled) Assets.click.play(1); state = GameState.Running; return; } //如果选择退出 if(event.y > 148 && event.y < 196) { if(Settings.soundEnabled) Assets.click.play(1); game.setScreen(new MainMenuScreen(game)); return; } } } } } private void updateGameOver(List<TouchEvent> touchEvents) { int len = touchEvents.size(); for(int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if(event.type == TouchEvent.TOUCH_UP) { //如果选择退出 if(event.x >= 128 && event.x <= 192 && event.y >= 200 && event.y <= 264) { if(Settings.soundEnabled) Assets.click.play(1); game.setScreen(new MainMenuScreen(game)); return; } } } } //初始化游戏背景等 @Override public void present(float deltaTime) { Graphics g = game.getGraphics(); g.drawPixmap(Assets.background, 0, 0); drawWorld(world); if(state == GameState.Ready) drawReadyUI(); if(state == GameState.Running) drawRunningUI(); if(state == GameState.Paused) drawPausedUI(); if(state == GameState.GameOver) drawGameOverUI(); drawText(g, score, g.getWidth() / 2 - score.length()*20 / 2, g.getHeight() - 42); } //根据world对象来画出游戏背景和人物 private void drawWorld(World world) { Graphics g = game.getGraphics(); Snake snake = world.snake; SnakePart head = snake.parts.get(0); Stain stain = world.stain; //画出"污渍" Pixmap stainPixmap = null; if(stain.type == Stain.TYPE_1) stainPixmap = Assets.stain1; if(stain.type == Stain.TYPE_2) stainPixmap = Assets.stain2; if(stain.type == Stain.TYPE_3) stainPixmap = Assets.stain3; int x = stain.x * 32; int y = stain.y * 32; g.drawPixmap(stainPixmap, x, y); //画出蛇的身体 int len = snake.parts.size(); for(int i = 1; i < len; i++) { SnakePart part = snake.parts.get(i); x = part.x * 32; y = part.y * 32; g.drawPixmap(Assets.tail, x, y); } //画出蛇头 Pixmap headPixmap = null; if(snake.direction == Snake.UP) headPixmap = Assets.headUp; if(snake.direction == Snake.LEFT) headPixmap = Assets.headLeft; if(snake.direction == Snake.DOWN) headPixmap = Assets.headDown; if(snake.direction == Snake.RIGHT) headPixmap = Assets.headRight; x = head.x * 32 + 16; y = head.y * 32 + 16; g.drawPixmap(headPixmap, x - headPixmap.getWidth() / 2, y - headPixmap.getHeight() / 2); } //画出准备游戏界面 private void drawReadyUI() { Graphics g = game.getGraphics(); g.drawPixmap(Assets.ready, 47, 100); g.drawLine(0, 416, 480, 416, Color.BLACK); } //画出游戏中画面 private void drawRunningUI() { Graphics g = game.getGraphics(); g.drawPixmap(Assets.buttons, 0, 0, 64, 128, 64, 64); g.drawLine(0, 416, 480, 416, Color.BLACK); g.drawPixmap(Assets.buttons, 0, 416, 64, 64, 64, 64); g.drawPixmap(Assets.buttons, 256, 416, 0, 64, 64, 64); } //画出游戏暂停画面 private void drawPausedUI() { Graphics g = game.getGraphics(); g.drawPixmap(Assets.pause, 80, 100); g.drawLine(0, 416, 480, 416, Color.BLACK); } //画出游戏结束画面 private void drawGameOverUI() { Graphics g = game.getGraphics(); g.drawPixmap(Assets.gameOver, 62, 100); g.drawPixmap(Assets.buttons, 128, 200, 0, 128, 64, 64); g.drawLine(0, 416, 480, 416, Color.BLACK); } //画出游戏的当前得分 public void drawText(Graphics g, String line, int x, int y) { int len = line.length(); for (int i = 0; i < len; i++) { char character = line.charAt(i); if (character == ' ') { x += 20; continue; } int srcX = 0; int srcWidth = 0; if (character == '.') { srcX = 200; srcWidth = 10; } else { srcX = (character - '0') * 20; srcWidth = 20; } g.drawPixmap(Assets.numbers, x, y, srcX, 0, srcWidth, 32); x += srcWidth; } } //判断游戏状态,把状态置为暂停,并把得分保存到文件中 @Override public void pause() { if(state == GameState.Running) state = GameState.Paused; if(world.gameOver) { Settings.addScore(world.score); Settings.save(game.getFileIO()); } } @Override public void resume() { } @Override public void dispose() { }}
- 读 Beginning Android Games 2nd Edition (二十) 游戏GameScreen类
- 读 Beginning Android Games 2nd Edition (十六) 游戏帮助
- 读 Beginning Android Games 2nd Edition (十) 创建绘图类
- 读 Beginning Android Games 2nd Edition (十九) 游戏World类
- 读 Beginning Android Games 2nd Edition (二) 创建声音工具类
- 读 Beginning Android Games 2nd Edition (二十一) 封装OpenGL之GLGraphics类
- 读 Beginning Android Games 2nd Edition (二十二) 封装OpenGL之GLGame类
- 读 Beginning Android Games 2nd Edition (十一) 加入游戏暂停/恢复功能
- 读 Beginning Android Games 2nd Edition (十三) "Nom先生"游戏设计
- 读 Beginning Android Games 2nd Edition (十五) 游戏主菜单
- 读 Beginning Android Games 2nd Edition (十八) 贪食蛇类
- 读 Beginning Android Games 2nd Edition (一) 创建读取文件IO的工具类
- 读 Beginning Android Games 2nd Edition (三) 创建速度感应器事件监听类
- 读 Beginning Android Games 2nd Edition (四) 创建罗盘事件监听类
- 读 Beginning Android Games 2nd Edition (五) 创建对象池类
- 读 Beginning Android Games 2nd Edition (六) 创建键盘事件处理类
- 读 Beginning Android Games 2nd Edition (七) 创建Touch事件处理类
- 读 Beginning Android Games 2nd Edition (八) 创建输入事件处理类
- MyEclipse实用快捷键(超越常用)
- 几种设计模式
- 堆栈的作用,应用和用途
- 正确处理 Memory Warning
- tslib1.4下载和交叉编译
- 读 Beginning Android Games 2nd Edition (二十) 游戏GameScreen类
- 推荐一个IE多版本测试的软件--IE Tester
- 100多常用的JS语句
- SQL Server截取字符串
- 给地图自定义的大头针添加下降下落动画
- JDeveloper Setup for OA Framework
- Openstack关于folsom安装
- vb.net 读取和显示PDF
- IOS学习笔记(7)UIButton UIImageView UIScrollView UIWebView