接着上一篇的讲解,今天我们来完成帮助和分数排行榜多界面的跳转,当然不会像是Activity之间跳转,那样会很卡的,具体怎么做我们往下看吧!

1.Help界面的跳转

1.1在上次的代码基础上,我们看到MainMenuScreen中在update()中留有注释的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if
(OverlapTester.pointInRectangle(playBounds, touchPoint.x, touchPoint.y)) {
//播放点击音效
Assets.playSound(Assets.clickSound);
//game.setScreen(new GameScreen(game));
return
;
}
if
(OverlapTester.pointInRectangle(highscoresBounds, touchPoint.x, touchPoint.y)) {
Assets.playSound(Assets.clickSound);
//game.setScreen(new HighscoresScreen(game));
return
;
}
if
(OverlapTester.pointInRectangle(helpBounds, touchPoint.x, touchPoint.y)) {
Assets.playSound(Assets.clickSound);
//game.setScreen(new HelpScreen(game));
return
;
}

  我们将HelpScreen的那行注释去掉,之后我们要完成的事情就是HelpScreen类的编写,显示帮助界面。( 注:对于切换画面,这里的game被设置在Screen类的成员变量中,而实际的libgdx类库中,Screen 被做成了接口。也就是说,应当把对应的Game类的引用放在具体的Screen接口的实现类中,通过调用Game类的setScreen方法来切换游戏画面。可以看一下,估计你就用该明白了它的机制了)

1.2HelpScreen类:

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
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.Texture;
import
com.badlogic.gdx.graphics.g2d.SpriteBatch;
import
com.badlogic.gdx.graphics.g2d.TextureRegion;
import
com.badlogic.gdx.math.Rectangle;
import
com.badlogic.gdx.math.Vector3;
/**
* 帮助界面一
* @author ZHF
*
*/
public
class
HelpScreen
implements
Screen {
Game game;
OrthographicCamera guiCam;  
//相机
SpriteBatch batcher;  
//用来绘画界面的
Rectangle nextBounds;  
//下一个screen
Vector3 touchPoint;  
//按下的触点
Texture helpImage;  
//帮助界面图片
TextureRegion helpRegion;  
//帮助界面区域
public
HelpScreen(Game game) {
this
.game = game;
//初始化了一个OrthographicCamera(正交相机),并把宽度和高度设置为320*480,也就是屏幕的大小。随后将OrthographicCamera的位置,也就是position设置在屏幕的中点 (因为此为2D游戏,所以不需要考虑Z轴)
guiCam =
new
OrthographicCamera(
320
,
480
);
guiCam.position.
set
(
320
/
2
,
480
/
2
,
0
);
nextBounds =
new
Rectangle(
320
-
64
,
0
,
64
,
64
);
touchPoint =
new
Vector3();
batcher =
new
SpriteBatch();
helpImage = Assets.loadTexture(
"data/help1.png"
);  
//加载图片资源到内存
helpRegion =
new
TextureRegion(helpImage,
0
,
0
,
320
,
480
);
}
/**刷新**/
public
void
update(float deltaTime) {
//检测捕获到按下位置
if
(Gdx.input.justTouched()) {
guiCam.unproject(touchPoint.
set
(Gdx.input.getX(), Gdx.input.getY(),
0
));
//点击切换到下一个界面
if
(OverlapTester.pointInRectangle(nextBounds, touchPoint.x,
touchPoint.y)) {
Assets.playSound(Assets.clickSound);
//              game.setScreen(new HelpScreen2(game));  //切换到下一屏
return
;
}
}
}
public
void
draw(float deltaTime) {
GLCommon gl = Gdx.gl;
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  
//清屏
guiCam.update();
//设置绘画属性: 因为自定义了OrthographicCamera ,所以要将OrthographicCamera 的 投影矩阵传递给 batcher。在投影矩阵中是把得到的点击坐标弄成touchPoint向量,把得到的点击坐标,由左上为(0,0)的坐标系--》左下为(0,0)的坐标系。
batcher.setProjectionMatrix(guiCam.combined);
batcher.disableBlending();
batcher.begin();
batcher.draw(helpRegion,
0
,
0
,
320
,
480
);
batcher.end();
batcher.enableBlending();
batcher.begin();
batcher.draw(Assets.arrow,
320
,
0
, -
64
,
64
);
batcher.end();
gl.glDisable(GL10.GL_BLEND);
}
/**系统会开启一个线程来不断的调用**/
@Override
public
void
render(float delta) {
update(delta);
draw(delta);
}
@Override
public
void
resize(
int
width,
int
height) {
}
@Override
public
void
show() {
}
@Override
public
void
hide() {
}
@Override
public
void
pause() {
helpImage.dispose();
}
@Override
public
void
resume() {
}
@Override
public
void
dispose() {
}
}

这样,我们的代码还不能运行,因为我们的帮助界面里有下一条的按钮,还需要修改Asset类:

声明:

1
public
static
TextureRegion arrow;
//帮助下一条按钮区域

实例化:

1
2
//下一条按按钮
arrow =
new
TextureRegion(items,
0
,
64
,
64
,
64
);

ok! 在主菜单界面上点击Help已经成功实现跳转,接下来按下右下角的下一条,界面不会发生改变,为什么哪?

因为我们将一行代码注释掉了哦,现在我们取消注释,创建HelpScreen2,代码基本上没有改变,仅仅是在:

1
helpImage = Assets.loadTexture(
"data/help1.png"
);  
//加载图片资源到内存

将图片help1改为help2,即可实现跳转。

再在:

1
game.setScreen(
new
HelpScreen2(game));  
//切换到下一屏

将HelpScreen2改为HelpScreen3,同理,这样一直下去到HelpScreen5,完成点击下一条切换帮助界面(这里有5张help图片,分别代表5个界面哦)!

1.3.在最后一屏HelpScreen5我们将切换到下一屏的代码改到主菜单界面

1
game.setScreen(
new
MainMenuScreen(game));  
//切换到下一屏

效果图:

  ok!到此帮助界面的切换我们已经完成!!!

2.排行榜界面的跳转

  2.1.同理,首先放开MainMenuScreen中的那行注释:

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

2.2.HighscoresScreen类

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
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
HighscoresScreen
implements
Screen {
Game game;
OrthographicCamera guiCam;
SpriteBatch batcher;
Rectangle backBounds;
Vector3 touchPoint;
String
[] highScores;  
//高分
float xOffset =
0
;
public
HighscoresScreen(Game game) {
this
.game = game;
guiCam =
new
OrthographicCamera(
320
,
480
);
guiCam.position.
set
(
320
/
2
,
480
/
2
,
0
);
backBounds =
new
Rectangle(
0
,
0
,
64
,
64
);
touchPoint =
new
Vector3();
batcher =
new
SpriteBatch();
//实例化分数数组
highScores =
new
String
[
5
];
for
(
int
i =
0
; i <
5
; i++) {
highScores[i] = i +
1
+
". "
+ Settings.highscores[i];
//显示排行榜文字
xOffset = Math.max(Assets.font.getBounds(highScores[i]).width,
xOffset);
}
//分数显示位置
xOffset =
160
- xOffset /
2
+ Assets.font.getSpaceWidth() /
2
;
}
public
void
update(float deltaTime) {
if
(Gdx.input.justTouched()) {
guiCam.unproject(touchPoint.
set
(Gdx.input.getX(), Gdx.input.getY(),
0
));
//返回到主菜单界面
if
(OverlapTester.pointInRectangle(backBounds, touchPoint.x,
touchPoint.y)) {
Assets.playSound(Assets.clickSound);
game.setScreen(
new
MainMenuScreen(game));
return
;
}
}
}
public
void
draw(float deltaTime) {
GLCommon gl = Gdx.gl;
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
guiCam.update();
batcher.setProjectionMatrix(guiCam.combined);
batcher.disableBlending();
batcher.begin();
batcher.draw(Assets.backgroundRegion,
0
,
0
,
320
,
480
);
batcher.end();
batcher.enableBlending();
batcher.begin();
//画出排行榜
batcher.draw(Assets.highScoresRegion,
10
,
360
-
16
,
300
,
33
);
//画出数组中的分数在对应的位置
float y =
230
;
for
(
int
i =
4
; i >=
0
; i--) {
Assets.font.draw(batcher, highScores[i], xOffset, y);
y += Assets.font.getLineHeight();
}
batcher.draw(Assets.arrow,
0
,
0
,
64
,
64
);
batcher.end();
}
@Override
public
void
render(float delta) {
update(delta);
draw(delta);
}
@Override
public
void
resize(
int
width,
int
height) {
}
@Override
public
void
show() {
}
@Override
public
void
hide() {
}
@Override
public
void
pause() {
}
@Override
public
void
resume() {
}
@Override
public
void
dispose() {
}
}

我们还需要在资源加载类Asset中添加几行代码:

声明:

1
2
public
static
BitmapFont font;  
//文字
public
static
TextureRegion highScoresRegion;  
//排行榜

实例化:

1
2
3
4
//分数
font =
new
BitmapFont(Gdx.files.
internal
(
"data/font.fnt"
), Gdx.files.
internal
(
"data/font.png"
),
false
);
//排行榜
highScoresRegion =
new
TextureRegion(Assets.items,
0
,
257
,
300
,
110
/
3
);

再在Settings中实例化默认分数排行榜的值

1
2
//默认分数排行榜分数
public
final
static
int
[] highscores =
new
int
[] {
100
,
80
,
50
,
30
,
10
};

注:这里的文字显示原理,清楚的可以看一下这篇应该就明白了!

  ok! 运行一下试试!发现可以实现跳转了!嘿嘿!

效果图:

源代码下载:

 顺便说一下,下一讲我们将接触游戏的主界面,里面包含了碰撞判断和点击区域判断,声音音效控制,游戏的一般框架等等,在这里还强调一下,这个游戏不包括舞台和演员这两个类,还需要通过其他的Demo来学习。

本文出自 “” 博客,请务必保留此出处