android游戏开发框架libgdx的使用(十八)—简单的AVG游戏效果实现

来源:互联网 发布:大数据的权威期刊 编辑:程序博客网 时间:2024/05/22 15:20

转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=44512&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

 

文章是关于实现简单的AVG游戏效果,可能会有好几篇。

想用libgdx做点AVG效果主要是因为目前Android上运行的AVG游戏(主要是恋爱模拟类型)的基本基于NScripter引擎移植出来的,我的2B中兴机子跑着巨卡,所以想自己做个。


何为AVG游戏

冒险类游戏AVG (Adventure Game)通常是玩家控制角色进行虚拟冒险的游戏,其故事情节往往是以完成某个任务或是解开一个谜题的形式出现的。

我这里说的AVG主要是指日式AVG,就是在最初的文字冒险游戏的基础上利用精美的CG图片和动人的音响效果加以强化,靠优秀的文字和剧情打动人心的一种游戏形式。

比如夜明前的琉璃色


201203021522196633.jpg

2012-4-29 16:47 上传
下载附件(49.96 KB)




简单分析

AVG游戏主要是由对话,CG图和音效组成。

拆分下来其实很简单,如下图


201203021522358014.jpg

2012-4-29 16:47 上传
下载附件(60.5 KB)



再看一张:


201203021522459989.jpg

2012-4-29 16:47 上传
下载附件(80.3 KB)



就不举其他例子了,每个场景基本由背景(场景图),对话,人物组成。要是以前玩过的话就很清楚了,背景切换比较少,人物的变化也比较少,文字是点击或者触摸就切换到下一句去。

我是选用的libgdx的Stage,背景和人物做成Image,对话由Label实现,对话边框由NinePatch实现,然后触摸对话框区域就切换到下一句去。


文字处理

AVG游戏的对话占据了很大部分,中文的处理很重要。

libgdx支持中文有两种方法,一是使用Hiero制作,二是使用ttf字库(好像目前还有点问题,暂时不推荐使用)。

最全的汉字字库有文字9万余个,但是常用的字并不多(相对于所有文字)。

对比中国大陆、中国台湾和香港特区各自的常用字标准,可以得到3500个常用字,全部做成libgdx用的字体文件。

总共生成12张图,共1.90M


201203021523195584.jpg

2012-4-29 16:47 上传
下载附件(218.16 KB)




还是有点大就是了。我比较偏向于先使用这个常用字开发,完成后在重新根据实际使用制作字库。


libgdx实现

我选用的是Stage,游戏由Game和Screen控制。新建一个类AVGScreen,实现Screen接口。

  1. private Stage stage; //舞台
  2. private TextureRegion background; //背景
  3. private List dialogues; //对话
  4. private BitmapFont bitmapFont; //文字
  5. private NinePatch border; //边框
  6. private int currentSize; //当前对话序号
复制代码

在show方法中,先实例化Stage,然后添加背景,添加边框,在render方法中修改文字。

201203021523303806.jpg

 

2012-4-29 16:47 上传
下载附件(4.78 KB)

背景是铺满就行了,对话的边框宽度是100%,高度是25%左右。

文字绘制是在边框内部。边框我选用的是


201203021523354673.png

2012-4-29 16:47 上传
下载附件(26.13 KB)



具体的拆分如下:


201203021523479024.png

2012-4-29 16:47 上传
下载附件(24.17 KB)



label定位的代码:

  1. label.x = border.getLeftWidth() + 10;
  2. label.y = borderImage.height - border.getTopHeight() - 10;

  3. 至于触摸切换到下一句在边框添加一个ClickListener就行了。

  4. borderImage.setClickListener(new ClickListener() {

  5. @Override
  6. public void click(Actor actor, float x, float y) {
  7. System.out.println("click");
  8. if (currentSize < dialogues.size() - 1) {
  9. currentSize++;
  10. }
  11. }
  12. });
复制代码

而List dialogues中的数据就是对话数据,由【人物名称】和【对话】组成。

如:

  1. List list = new ArrayList();
  2. for (int i = 0; i < 10; i++) {
  3. list.add(new String[] { "人物", "这是对话" + i });
  4. }
复制代码

AVGScreen完整代码:

  1. package com.cnblogs.htynkn.ui;

  2. import java.util.List;

  3. import com.badlogic.gdx.Gdx;
  4. import com.badlogic.gdx.Screen;
  5. import com.badlogic.gdx.graphics.Color;
  6. import com.badlogic.gdx.graphics.GL10;
  7. import com.badlogic.gdx.graphics.g2d.BitmapFont;
  8. import com.badlogic.gdx.graphics.g2d.NinePatch;
  9. import com.badlogic.gdx.graphics.g2d.TextureRegion;
  10. import com.badlogic.gdx.scenes.scene2d.Actor;
  11. import com.badlogic.gdx.scenes.scene2d.Stage;
  12. import com.badlogic.gdx.scenes.scene2d.ui.ClickListener;
  13. import com.badlogic.gdx.scenes.scene2d.ui.Image;
  14. import com.badlogic.gdx.scenes.scene2d.ui.Label;
  15. import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;

  16. public class AVGScreen implements Screen {

  17. private Stage stage; //舞台
  18. private TextureRegion background; //背景
  19. private List dialogues; //对话
  20. private BitmapFont bitmapFont; //文字
  21. private NinePatch border; //边框
  22. private int currentSize; //当前对话序号

  23. public AVGScreen(TextureRegion background, NinePatch border,
  24. List dialogues) {
  25. this.background = background;
  26. this.dialogues = dialogues;
  27. this.border = border;
  28. bitmapFont = new BitmapFont();
  29. }

  30. public AVGScreen(TextureRegion background, NinePatch border,
  31. List dialogues,BitmapFont bitmapFont) {
  32. this.background = background;
  33. this.dialogues = dialogues;
  34. this.border = border;
  35. this.bitmapFont = bitmapFont;
  36. }

  37. @Override
  38. public void dispose() {
  39. // TODO Auto-generated method stub

  40. }

  41. @Override
  42. public void hide() {
  43. // TODO Auto-generated method stub

  44. }

  45. @Override
  46. public void pause() {
  47. // TODO Auto-generated method stub

  48. }

  49. @Override
  50. public void render(float delta) {
  51. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

  52. ((Label) stage.findActor("label"))
  53. .setText(dialogues.get(currentSize)[0] + " : "
  54. + dialogues.get(currentSize)[1]);

  55. stage.act(Gdx.graphics.getDeltaTime());
  56. stage.draw();
  57. }

  58. @Override
  59. public void resize(int width, int height) {
  60. // TODO Auto-generated method stub

  61. }

  62. @Override
  63. public void resume() {
  64. // TODO Auto-generated method stub

  65. }

  66. @Override
  67. public void show() {
  68. currentSize = 0;

  69. stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),
  70. false);
  71. Image backgroundImage = new Image(background);
  72. backgroundImage.x = backgroundImage.y = 0;
  73. backgroundImage.setFillParent(true);

  74. Image borderImage = new Image(border);
  75. borderImage.x = borderImage.y = 0;
  76. borderImage.width = Gdx.graphics.getWidth();
  77. borderImage.height = Gdx.graphics.getHeight() / 4;
  78. borderImage.setClickListener(new ClickListener() {

  79. @Override
  80. public void click(Actor actor, float x, float y) {
  81. System.out.println("click");
  82. if (currentSize < dialogues.size() - 1) {
  83. currentSize++;
  84. }
  85. }
  86. });

  87. LabelStyle labelStyle = new LabelStyle(bitmapFont, Color.BLACK);
  88. Label label = new Label("", labelStyle, "label");
  89. label.x = border.getLeftWidth() + 10;
  90. label.y = borderImage.height - border.getTopHeight() - 10;
  91. stage.addActor(backgroundImage);
  92. stage.addActor(borderImage);
  93. stage.addActor(label);
  94. Gdx.input.setInputProcessor(stage);
  95. }
  96. }
复制代码

演示效果:


201203021523568067.jpg

2012-4-29 16:47 上传
下载附件(67.97 KB)



可以看出基本效果是实现了,但是还有一些问题,比如人物的添加还有对话框的美观,而且这段代码是在很烂,不易扩展,没有权责分离。

下一篇文章会介绍人物的添加还有使用配置文件保存对话等数据。

最后来一个黎明前的琉璃色的效果:


201203021524066105.jpg

2012-4-29 16:47 上传
下载附件(112.22 KB)



原创粉丝点击