android游戏开发框架libgdx的使用(十九)—使用自定义配置改进AVG游戏开发

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

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

先说明一下上一篇文章我使用了多张hiero图的字体绘制,因为我对源码进行了一些修改,本来想这次发出来的,但是我仔细调试了一下,发现对于多图的支持还是有问题,有些字会出现偏移。

这个只有继续尝试了…大家可以考虑使用ttf字库。

然后继续说上一篇,虽然实现了一个简单的效果,但是目前有很多不足。我把AVG游戏需要的资源全部提取出来,放在一个个文件夹中,然后通过配置文件加载这些数据。

libgdx的工具库

com.badlogic.gdx.utils就是libgdx的工具库,支持两种格式xml和json。

我最先倾向于使用json格式,但是反复想了想,虽然json的大小可能要小点,但是没有xml直观好读。

所以还是选择使用xml格式,读取xml文件使用XmlReader。

  1. XmlReader reader=new XmlReader();
  2. try {
  3. Element config=reader.parse(Gdx.files.internal("data/config.xml"));
  4. config.get("name"); //获取属性值,如果没有属性值则返回同名child的值
  5. config.getAttribute("name"); //获取属性值
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }
复制代码
配置文件格式分析

配置文件需要配置的内容其实就是上一篇我们硬编码进去的东西,有背景、边框、对话等。

我设计的比较随意,不一定是最好的,大家可以参考参考。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <scene>
  3. <packfile>pack</packfile>
  4. <background>bg1</background>
  5. <border>
  6. <border-name>border</border-name>
  7. <border-left>26</border-left>
  8. <border-right>26</border-right>
  9. <border-top>31</border-top>
  10. <border-bottom>31</border-bottom>
  11. </border>
  12. <dialogues>
  13. <dialogue>
  14. <name>人物1</name>
  15. <data>这是对话1</data>
  16. </dialogue>
  17. <dialogue>
  18. <name>人物1</name>
  19. <data>这是对话2</data>
  20. </dialogue>
  21. </dialogues>
  22. </scene>
复制代码

如果对话比较长还可以继续添加节点。border-*那4个值就是NinePatch的左边距、右边距、上边距、下边距。

这里还有一个地方需要注意,如果我们需要切换场景怎么办?切换的场景可能是一个AVG场景,也可能是个一般的Screen。我本来想做个简单的IOC容器的,但后来想想也没有那么复杂。

在配置文件中加上一句

如果是一般Screen就是

  1. com.cnblogs.htynkn.screen.GameOver
复制代码
如果是AVG场景就是
  1. data/scene2/config.xml
复制代码
使用libgdx实现相关效果

其实整个原理和上一篇原理是一样的,唯一多的一个就是解析配置文件和场景跳转。

  1. XmlReader xmlReader = new XmlReader();
  2. try {
  3. Element config = xmlReader.parse(Gdx.files
  4. .internal(this.configFileName)); //加载配置文件
  5. atlas = new TextureAtlas(Gdx.files.internal(configFileName)
  6. .parent()
  7. + "/" + config.get("packfile")); //获取pack配置文件
  8. background = atlas.findRegion(config.get("background")); //创建背景图
  9. Element borderConfig = config.getChildByName("border"); //获取border配置
  10. border = new NinePatch(atlas.findRegion(borderConfig.getChild(0)
  11. .getText()), Integer.parseInt(borderConfig.getChild(1)
  12. .getText()), Integer.parseInt(borderConfig.getChild(2)
  13. .getText()), Integer.parseInt(borderConfig.getChild(3)
  14. .getText()), Integer.parseInt(borderConfig.getChild(4)
  15. .getText())); //实例化border
  16. dialogues = new ArrayList();
  17. Element dialoguesConfig = config.getChildByName("dialogues"); //开始处理对话
  18. for (int i = 0; i < dialoguesConfig.getChildCount(); i++) {
  19. dialogues.add(new String[] {
  20. dialoguesConfig.getChild(i).get("name"),
  21. dialoguesConfig.getChild(i).get("data") });
  22. }
  23. Element screenConfig = config.getChildByName("nextscreen"); //处理场景
  24. if (screenConfig.getAttribute("type").equals("avg")) {
  25. nextScreen = new AVGScreen(this.game, screenConfig.getText());
  26. } else {
  27. try {
  28. nextScreen = (Screen) Class.forName(screenConfig.getText())
  29. .newInstance();
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. }

  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
复制代码
读取完成后构建舞台,然后绘制。唯一需要修改的就是场景跳转。
  1. borderImage.setClickListener(new ClickListener() {

  2. @Override
  3. public void click(Actor actor, float x, float y) {
  4. if (currentSize < dialogues.size() - 1) {
  5. currentSize++;
  6. } else {
  7. if (nextScreen != null) {
  8. game.setScreen(nextScreen);
  9. }
  10. }
  11. }
  12. });
复制代码
完整代码:
  1. package com.cnblogs.htynkn.ui;

  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;

  5. import com.badlogic.gdx.Game;
  6. import com.badlogic.gdx.Gdx;
  7. import com.badlogic.gdx.Screen;
  8. import com.badlogic.gdx.graphics.Color;
  9. import com.badlogic.gdx.graphics.GL10;
  10. import com.badlogic.gdx.graphics.Texture;
  11. import com.badlogic.gdx.graphics.g2d.BitmapFont;
  12. import com.badlogic.gdx.graphics.g2d.NinePatch;
  13. import com.badlogic.gdx.graphics.g2d.TextureAtlas;
  14. import com.badlogic.gdx.graphics.g2d.TextureRegion;
  15. import com.badlogic.gdx.scenes.scene2d.Actor;
  16. import com.badlogic.gdx.scenes.scene2d.Stage;
  17. import com.badlogic.gdx.scenes.scene2d.ui.ClickListener;
  18. import com.badlogic.gdx.scenes.scene2d.ui.Image;
  19. import com.badlogic.gdx.scenes.scene2d.ui.Label;
  20. import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
  21. import com.badlogic.gdx.utils.Array;
  22. import com.badlogic.gdx.utils.XmlReader;
  23. import com.badlogic.gdx.utils.XmlReader.Element;

  24. public class AVGScreen implements Screen {

  25. private String configFileName;
  26. private Stage stage; // 舞台
  27. private List dialogues; // 对话
  28. private BitmapFont bitmapFont; // 文字
  29. private NinePatch border; // 边框
  30. private int currentSize; // 当前对话序号
  31. private TextureAtlas atlas;
  32. private TextureRegion background;
  33. private Screen nextScreen;
  34. private Game game;

  35. public AVGScreen(Game game, String configFileName) {
  36. this.game = game;

  37. bitmapFont = new BitmapFont(Gdx.files.internal("font/chinese.fnt"),
  38. false);

  39. this.configFileName = configFileName;
  40. XmlReader xmlReader = new XmlReader();
  41. try {
  42. Element config = xmlReader.parse(Gdx.files
  43. .internal(this.configFileName));
  44. atlas = new TextureAtlas(Gdx.files.internal(configFileName)
  45. .parent()
  46. + "/" + config.get("packfile"));
  47. background = atlas.findRegion(config.get("background"));
  48. Element borderConfig = config.getChildByName("border");
  49. border = new NinePatch(atlas.findRegion(borderConfig.getChild(0)
  50. .getText()), Integer.parseInt(borderConfig.getChild(1)
  51. .getText()), Integer.parseInt(borderConfig.getChild(2)
  52. .getText()), Integer.parseInt(borderConfig.getChild(3)
  53. .getText()), Integer.parseInt(borderConfig.getChild(4)
  54. .getText()));
  55. dialogues = new ArrayList();
  56. Element dialoguesConfig = config.getChildByName("dialogues");
  57. for (int i = 0; i < dialoguesConfig.getChildCount(); i++) {
  58. dialogues.add(new String[] {
  59. dialoguesConfig.getChild(i).get("name"),
  60. dialoguesConfig.getChild(i).get("data") });
  61. }
  62. Element screenConfig = config.getChildByName("nextscreen");
  63. if (screenConfig.getAttribute("type").equals("avg")) {
  64. nextScreen = new AVGScreen(this.game, screenConfig.getText());
  65. } else {
  66. try {
  67. nextScreen = (Screen) Class.forName(screenConfig.getText())
  68. .newInstance();
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. }
  72. }

  73. } catch (IOException e) {
  74. e.printStackTrace();
  75. }
  76. }

  77. @Override
  78. public void dispose() {
  79. bitmapFont.dispose();
  80. stage.dispose();
  81. }

  82. @Override
  83. public void hide() {
  84. // TODO Auto-generated method stub

  85. }

  86. @Override
  87. public void pause() {
  88. // TODO Auto-generated method stub

  89. }

  90. @Override
  91. public void render(float delta) {
  92. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

  93. ((Label) stage.findActor("label"))
  94. .setText(dialogues.get(currentSize)[0] + " : "
  95. + dialogues.get(currentSize)[1]);

  96. stage.act(Gdx.graphics.getDeltaTime());
  97. stage.draw();
  98. }

  99. @Override
  100. public void resize(int width, int height) {
  101. // TODO Auto-generated method stub

  102. }

  103. @Override
  104. public void resume() {
  105. // TODO Auto-generated method stub

  106. }

  107. @Override
  108. public void show() {
  109. currentSize = 0;

  110. stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),
  111. false);
  112. Image backgroundImage = new Image(background);
  113. backgroundImage.x = backgroundImage.y = 0;
  114. backgroundImage.setFillParent(true);

  115. Image borderImage = new Image(border);
  116. borderImage.x = borderImage.y = 0;
  117. borderImage.width = Gdx.graphics.getWidth();
  118. borderImage.height = Gdx.graphics.getHeight() / 4;
  119. borderImage.setClickListener(new ClickListener() {

  120. @Override
  121. public void click(Actor actor, float x, float y) {
  122. if (currentSize < dialogues.size() - 1) {
  123. currentSize++;
  124. } else {
  125. if (nextScreen != null) {
  126. game.setScreen(nextScreen);
  127. }
  128. }
  129. }
  130. });

  131. LabelStyle labelStyle = new LabelStyle(bitmapFont, Color.WHITE);
  132. Label label = new Label("", labelStyle, "label");
  133. label.x = border.getLeftWidth() + 10;
  134. label.y = borderImage.height - border.getTopHeight() - 10;
  135. stage.addActor(backgroundImage);
  136. stage.addActor(borderImage);
  137. stage.addActor(label);
  138. Gdx.input.setInputProcessor(stage);
  139. }
  140. }
复制代码

最后贴上效果图,这是我正在做的一个东西:


201203032216586836.jpg
2012-4-29 16:50 上传
下载附件(91.59 KB)



201203032217372774.jpg
2012-4-29 16:50 上传
下载附件(91.77 KB)