libgdx游戏引擎开发笔记(九)SuperJumper游戏例子的讲解(篇三)---- 主游戏界面显示框架

简介:

 在完成前面的基础性工作之后,接下来就到了重头戏:游戏主界面和游戏逻辑的搭建。


1.游戏主界面的搭建


   今天我们要完成的工作是:点击play进入游戏界面,对应的在游戏界面显示一些东西.

效果:


   看到以上四张图相信大家应该很明白要干什么了,下面我们上代码


GameScreen类:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package  com.zhf.mylibgdx;
import  com.badlogic.gdx.Game;
import  com.badlogic.gdx.Gdx;
import  com.badlogic.gdx.Screen;
import  com.badlogic.gdx.graphics.GL10;
import  com.badlogic.gdx.graphics.GLCommon;
import  com.badlogic.gdx.graphics.OrthographicCamera;
import  com.badlogic.gdx.graphics.g2d.SpriteBatch;
import  com.badlogic.gdx.math.Rectangle;
import  com.badlogic.gdx.math.Vector3;
/**
  * 游戏主界面
  * @author ZHF
  *
  */
public  class  GameScreen  implements  Screen {
     //状态
     static  final  int  GAME_READY =  0 ;    //准备
     static  final  int  GAME_RUNNING =  1 ;   //运行
     static  final  int  GAME_PAUSED =  2 ;   //暂停
     static  final  int  GAME_LEVEL_END =  3 ;   //本关结束
     static  final  int  GAME_OVER =  4 ;   //游戏结束
                                                                                                                                                                                                                                                                                                                                                                                   
     Game game;
                                                                                                                                                                                                                                                                                                                                                                                   
     int  state;  //状态
     OrthographicCamera guiCam;   //相机
     Vector3 touchPoint;   //触点
     SpriteBatch batcher;   //用于绘画的
                                                                                                                                                                                                                                                                                                                                                                                   
     Rectangle pauseBounds;   //暂停按钮
     Rectangle resumeBounds;  //继续游戏按钮
     Rectangle quitBounds;   //离开按钮
                                                                                                                                                                                                                                                                                                                                                                                   
     int  lastScore;    //最后得分
     String scoreString;   //显示分数
                                                                                                                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                                                                                                   
     public  GameScreen(Game game) {
         this .game = game;
         //初始化工作
         state = GAME_READY;
         guiCam =  new  OrthographicCamera( 320 480 );
         guiCam.position.set( 320  2 480  2 0 );   //将相机的视角设为中间
         touchPoint =  new  Vector3();
         batcher =  new  SpriteBatch();
                                                                                                                                                                                                                                                                                                                                                                                       
         pauseBounds =  new  Rectangle( 320  64 480  64 64 64 );
         resumeBounds =  new  Rectangle( 160  96 240 192 36 );
         quitBounds =  new  Rectangle( 160  96 240  36 192 36 );
                                                                                                                                                                                                                                                                                                                                                                                       
         lastScore =  0 ;
         scoreString =  "SCORE: 0" ;
     }
                                                                                                                                                                                                                                                                                                                                                                                   
     /**刷新状态**/
     public  void  update ( float  deltaTime) {
         if  (deltaTime >  0 .1f) deltaTime =  0 .1f;
         //根据游戏动向,刷新状态
         switch  (state) {
         case  GAME_READY:
             updateReady();   //准备状态
             break ;
         case  GAME_RUNNING:
             updateRunning(deltaTime);   //游戏运行状态
             break ;
         case  GAME_PAUSED:
             updatePaused();   //游戏暂停状态
             break ;
         case  GAME_LEVEL_END:   //本关结束
             updateLevelEnd();
             break ;
         case  GAME_OVER:
             updateGameOver();   //游戏结束
             break ;
         }
     }
                                                                                                                                                                                                                                                                                                                                                                                   
     /**准备状态**/
     private  void  updateReady () {
         if  (Gdx.input.justTouched()) {
             state = GAME_RUNNING;
         }
     }
     /**游戏运行状态**/
     private  void  updateRunning ( float  deltaTime) {
         if  (Gdx.input.justTouched()) {
             guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(),  0 ));
             //点击暂停
             if  (OverlapTester.pointInRectangle(pauseBounds, touchPoint.x, touchPoint.y)) {
                 Assets.playSound(Assets.clickSound);
                 state = GAME_PAUSED;
                 return ;
             }
         }
     }
     /**游戏暂停状态**/
     private  void  updatePaused () {
         if  (Gdx.input.justTouched()) {
             guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(),  0 ));
             //点击继续游戏
             if  (OverlapTester.pointInRectangle(resumeBounds, touchPoint.x, touchPoint.y)) {
                 Assets.playSound(Assets.clickSound);
                 state = GAME_RUNNING;
                 return ;
             }
             //点击离开,返回到主菜单界面
             if  (OverlapTester.pointInRectangle(quitBounds, touchPoint.x, touchPoint.y)) {
                 Assets.playSound(Assets.clickSound);
                 game.setScreen( new  MainMenuScreen(game));
                 return ;
             }
         }
     }
     /**本关结束**/
     private  void  updateLevelEnd () {
         if  (Gdx.input.justTouched()) {
             state = GAME_READY;
         }
     }
     /**游戏结束**/
     private  void  updateGameOver () {
         if  (Gdx.input.justTouched()) {
             game.setScreen( new  MainMenuScreen(game));
         }
     }
                                                                                                                                                                                                                                                                                                                                                                                   
     /**绘画**/
     public  void  draw ( float  deltaTime) {
         GLCommon gl = Gdx.gl;
         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
         gl.glClearColor(0f, 0f, 0f, 0f);
         guiCam.update();
         batcher.setProjectionMatrix(guiCam.combined);
         batcher.enableBlending();
                                                                                                                                                                                                                                                                                                                                                                                       
         batcher.begin();
         //根据游戏状态刷新界面
         switch  (state) {
         case  GAME_READY:
             presentReady();   //绘制准备界面
             break ;
         case  GAME_RUNNING:
             presentRunning();   //绘制暂停和分数显示
             break ;
         case  GAME_PAUSED:
             presentPaused();   //绘制暂停菜单和分数显示
             break ;
         case  GAME_LEVEL_END:
             presentLevelEnd();   //绘制本关结束
             break ;
         case  GAME_OVER:
             presentGameOver();   //绘制游戏结束
             break ;
         }
         batcher.end();
     }
                                                                                                                                                                                                                                                                                                                                                                                   
     /**绘制准备**/
     private  void  presentReady () {
         batcher.draw(Assets.ready,  160  192  2 240  32  2 192 32 );
     }
     /**绘制暂停和分数显示**/
     private  void  presentRunning () {
         batcher.draw(Assets.pause,  320  64 480  64 64 64 );
         Assets.font.draw(batcher, scoreString,  16 480  20 );
     }
     /**绘制暂停菜单和分数显示**/
     private  void  presentPaused () {
         batcher.draw(Assets.pauseMenu,  160  192  2 240  96  2 192 96 );
         Assets.font.draw(batcher, scoreString,  16 480  20 );
     }
     /**绘制本关结束**/
     private  void  presentLevelEnd () {
         String topText =  "the princess is ..." ;
         String bottomText =  "in another castle!" ;
         float  topWidth = Assets.font.getBounds(topText).width;
         float  bottomWidth = Assets.font.getBounds(bottomText).width;
         Assets.font.draw(batcher, topText,  160  - topWidth /  2 480  40 );
         Assets.font.draw(batcher, bottomText,  160  - bottomWidth /  2 40 );
     }
     /**绘制游戏结束**/
     private  void  presentGameOver () {
         batcher.draw(Assets.gameOver,  160  160  2 240  96  2 160 96 );
         float  scoreWidth = Assets.font.getBounds(scoreString).width;
         Assets.font.draw(batcher, scoreString,  160  - scoreWidth /  2 480  20 );
     }
     @Override
     public  void  render( float  delta) {
         update(delta);
         draw(delta);
     }
     @Override
     public  void  resize( int  width,  int  height) {
         // TODO Auto-generated method stub
     }
     @Override
     public  void  show() {
         // TODO Auto-generated method stub
     }
     @Override
     public  void  hide() {
         // TODO Auto-generated method stub
     }
     @Override
     public  void  pause() {
         if  (state == GAME_RUNNING) state = GAME_PAUSED;
     }
     @Override
     public  void  resume() {
         // TODO Auto-generated method stub
     }
     @Override
     public  void  dispose() {
         // TODO Auto-generated method stub
     }
}


分析: 

       这里代码里的注释已经写得很清楚,这里我再讲一下框架,方便初学者学习,在构造方法里我们初始化了一些变量,接下来很重要的一步就是在render()方法里写了两个重要的方法:update() 和 draw(); 即:游戏的逻辑


update(float deltaTime): 根据游戏动向不断地刷新状态(准备状态、游戏运行状态、游戏暂停状态、本关结束、本关结束


draw(float deltaTime): 根据游戏状态刷新界面(

                       presentReady();  //绘制准备界面

presentRunning();  //绘制暂停和分数显示

presentPaused(); //绘制暂停菜单和分数显示

presentLevelEnd(); //绘制本关结束

presentGameOver(); //绘制游戏结束  )


 我们别忘了和前面一样,在MainMneuScreen中将条状那行注释去掉:

1
game.setScreen( new  GameScreen(game));


 同样,游戏界面中包含一些元素(如暂停按钮,菜单等),自然要在Asset类中对应的加载资源进去。

声明:

1
2
3
4
5
//游戏界面
public  static  TextureRegion pause; //暂停按钮
public  static  TextureRegion pauseMenu;   //暂停弹出菜单
public  static  TextureRegion ready;   //准备
public  static  TextureRegion gameOver;  //游戏结束

实例化:

1
2
3
4
5
//游戏界面界面
pause =  new  TextureRegion(items,  64 64 64 64 );
pauseMenu =  new  TextureRegion(items,  224 128 192 96 );
ready =  new  TextureRegion(items,  320 224 192 32 );
gameOver =  new  TextureRegion(items,  352 256 160 96 );


 ok!这一讲可能代码比较少,这里我们主要先将框架搭建起来,下一讲我们我涉及到游戏场景中各个元素以及世界的编写。


 源码下载http://down.51cto.com/data/894874







     本文转自zhf651555765 51CTO博客,原文链接: http://blog.51cto.com/smallwoniu/1262906
,如需转载请自行联系原作者


相关文章
|
监控 搜索推荐 数据挖掘
电子邮件营销新风潮:五步高效撰写EDM文案
构建成功的EDM邮件营销策略涉及理解目标受众、设定营销目标、创建吸引人的主题、个性化内容和情感共鸣、强调价值点、以及持续测试和优化。了解受众特征和行为以定制文案,使用生动语言制造兴趣,通过个性化和情感化元素增强连接,突出产品优势并设置明确的行动号召。运用A/B测试评估文案效果,并监控数据以优化营销表现。Zoho Campaigns等工具可提供支持,包括模板、编辑器和A/B测试功能,助力打造高效邮件营销文案。
398 1
|
DataX
二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)
二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)
153 0
|
人工智能 vr&ar 图形学
开源单图生成3D模型TripoSR的应用场景
【2月更文挑战第24天】开源单图生成3D模型TripoSR的应用场景
597 1
开源单图生成3D模型TripoSR的应用场景
|
数据可视化 索引 Python
Python用Markowitz马克维兹有效边界构建最优投资组合可视化分析四只股票
Python用Markowitz马克维兹有效边界构建最优投资组合可视化分析四只股票
|
运维 Serverless 数据处理
函数计算产品使用问题之创建了AgentCraft应用,登录-注册无法通过,是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
268 0
vue3—使用element-plus表格导出excel表格(带图片)
今天制作后台管理系统,有一个二维码管理页面,要求把表格内的数据全部导出为Excel表格。 表格内有二维码图片,也要导出,制作的第一版是直接将图片的链接导出,但是要求导出能直接看的图片,所以就有了第二版。
|
JavaScript 前端开发
JS实现的异步通讯
JS实现的异步通讯
176 0
|
Android开发
一个activity显示另一个activity,Android studio将一个项目作为module导入另一个项目,字符串截取的几种基本方法
一个activity显示另一个activity,Android studio将一个项目作为module导入另一个项目,字符串截取的几种基本方法
一个activity显示另一个activity,Android studio将一个项目作为module导入另一个项目,字符串截取的几种基本方法
|
弹性计算 Java Linux
ECS使用体验的文章
ECS使用体验的文章
|
存储 Java Android开发
【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
822 0