游戏场景需要是可配置的:AssetManager工具类和xml文件读取

我们已经知道,游戏得有个活动场景(每个场景是个可点击的button控件),并且可以通过代码生成控件的方式把活动场景进行多行多列的排列。见上篇:https://www.cnblogs.com/zzqm-gamelife/p/10254466.html

但是没有解决这样的问题:

1.场景名称需要自定义

2.版本更新,今天要加个“蟠桃园”的地图,明天活动,又加个“九重妖塔”。

如果每次加个地图就要改一次代码,太麻烦了。我们选择用xml文件来做配置(PS,有条件的可以用服务器和数据库存储,这个我们另外再说)。

fight_scene.xml 大致如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <fight_scene id="1">
        <name>永安镇</name>
        <remark>和平安宁的小镇,故事开始的地方</remark>
    </fight_scene>
    <fight_scene id="2">
        <name>沉香溪</name>
    </fight_scene>
        <fight_scene id="3">
        <name>白桦林</name>
    </fight_scene>
    ......
</resources>

通过读取配置文件中的数据,并实例化对应的FightScene对象。

首先,我们需要AssetManager工具类找到所需要的xml文件。AssetManager工具类的默认目录为main下面的assets文件夹下,如果默认没有,自己创建一个即可。并将文件转为为io流。

AssetManager assetManager = this.getAssets();
InputStream is = assetManager .open(fileName);

我们采用XmlPullParse这个工具类来读取fight_scene.xml的数据,代码如下:

//打开活动场景配置文件     XmlPullParser xmlParser= Xml.newPullParser();
xmlParser.setInput(is,"utf-8");
int eventType=xmlParser.getEventType();
//定义活动场景及要添加到列表中的活动场景
List<FightScene> lFScene = new ArrayList<FightScene>();FightScene fightScene=null;
while(eventType!=XmlPullParser.END_DOCUMENT){
  switch(eventType){
  case XmlPullParser.START_DOCUMENT:
    break;
  case XmlPullParser.START_TAG:
  //从io流中读取到活动场景开始的标签
    if(xmlParser.getName().equals("fight_scene"))
        //初始化活动场景
      fightScene=new FightScene();
      fightScene.setId(Integer.parseInt(xmlParser.getAttributeValue(0)));  //getAttributeValue方法读取节点属性
    }else if(xmlParser.getName().equals("name")){
      fightScene.setName(xmlParser.nextText());    //next方法读取子节点的内容
    }else if(xmlParser.getName().equals("remark")){
      fightScene.setRemark(xmlParser.nextText());
    }
    break;
  case XmlPullParser.END_TAG:
    //从io流中读取到活动场景结束的标签,将赋值后的活动场景添加到列表中
    if(xpp.getName().equals("fight_scene")){
      lFscene.add(fightScene);
    }
    break;
  }
  eventType=xpp.next();
}

通过上面的方法,我们将获取到的场景的数据就存储到了队列 lFScene中。

接下来,将生成控件的做对应的调整,就可以在生成场景的button控件时进行赋值了。

   @Override
   protected void onCreate(Bundle savedInstanceState) {
        ......
        //获取场景列表,生成页面各元素
        fightSceneLayout.addView(sceneLayout(lFscene),4);
    }

    /**
     * @param lFscene 活动场景列表
     * @return 返回自定义的场景布局
     */
    private LinearLayout sceneLayout(List<FightScene> lFscene,int clomuns){
        int sceneNums=lFscene.size();
        .....
        if (surplus==0) {
            //如果能够被整除
            //将场景列表中另外存储为多个队列
            for (int i = 0; i < rows; i++) {
                List<FightScene> lfs_rows = new ArrayList<FightScene>();
                for(int j=0; j<clomuns; j++){
                    lfs_rows.add( lFscene.get( i * clomuns + j - 1  ));
                }
                sly.addView(rowsLayout(lfs_rows));
            }
        }else{
            //如果不能够被整除
            //将场景列表中另外存储为多个队列
            int i;
            for ( i=0 ; i < rows; i++) {
                List<FightScene> lfs_rows = new ArrayList<FightScene>();
                for(int j=0; j<clomuns; j++){
                    lfs_rows.add( lFscene.get( i * clomuns + j  ));
                }
                sly.addView(rowsLayout(lfs_rows));
            }
            //创建最后剩下的,不足一行的布局
            //剩下的单独存储为一个队列
            List<FightScene> lfs_surplus = new ArrayList<FightScene>();
            for(int k =0;k<surplus;k++){
                lfs_surplus.add( lFscene.get( i * clomuns + k - 1  ));
            }
            sly.addView(rowsLayout(lfs_surplus));
        }
        return  sly;
    }

    /**
     * @param clomunsFscene 单行显示的场景
     * @return 返回单行显示的LinearLayout
     */
    private LinearLayout rowsLayout(List<FightScene> clomunsFscene){
        int clomuns= clomunsFscene.size();
        ......
        //循环添加场景button控件
        for (int j = 0; j < clomuns; j++) {
            Button b_scene = new Button(this);
            //设置场景按钮的id和名称
            b_scene.setText(clomunsFscene.get(j).getName());
            b_scene.setId(clomunsFscene.get(j).getId());
            //绑定点击事件
            b_scene.setOnClickListener(clickListener);
            //添加到创建的线性布局中
            rl.addView(b_scene);
        }
        //添加到显示的父线性布局中
        return rl;
    }

原文地址:https://www.cnblogs.com/zzqm-gamelife/p/10255242.html

时间: 2024-08-13 04:05:06

游戏场景需要是可配置的:AssetManager工具类和xml文件读取的相关文章

java操作redis集群配置[可配置密码]和工具类

java操作redis集群配置[可配置密码]和工具类 <dependency>   <groupId>redis.clients</groupId>   <artifactId>jedis</artifactId>   <version>2.9.0</version>   </dependency>   <dependency>   <groupId>org.apache.commons

solr分布式索引【实战一、分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例】

1 private static Properties prop = new Properties(); 2 3 private static String confFilePath = "conf" + File.separator + "config.properties";// 配置文件目录 4 static { 5 // 加载properties 6 InputStream is = null; 7 InputStreamReader isr = null;

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

android开发步步为营之24:milliondollars游戏技术要点代码生成控件和读取xml文件

Milliondollars智力问答游戏,主要的技术要点(一).读取题库数据xml文件(二).如何动态的生成题目和选项.这里做个总结,供以后参考. (一).读取题库数据xml文件 将assets/topics.xml文件读取 topics.xml格式: <?xml version="1.0" encoding="UTF-8"?> <book> <question topic="<全唐诗>是哪个时期的人编辑的?&qu

【浅墨Unity3D Shader编程】之一 游戏场景的创建 &amp; 第一个Shader的书写

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在Un

【淡墨Unity3D Shader计划】一间 创建一个游戏场景 &amp;amp; 第一Shader写作

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇.本文的第一部分为系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式.最后一部分解说了怎样在U

【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分为系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在U

MMORPG大型游戏设计与开发(服务器 游戏场景 多线程)

多线程在随着cpu发展应用的是越来越多,游戏场景因为其在服务器所占的数据量与逻辑复杂度的原因必须依赖于它.为什么场景要采用多线程?场景的线程是怎样的?场景的线程又是如何创建的?场景的线程又是怎样管理的?在这里同时对可以指正错误的朋友们说声谢谢,虽然是小错误,也希望大家能够勇于纠正这些错误. 游戏截图 采用理由 上面的两张截图分别在不同的场景,试想一下如果一个线程只能先处理其中一张图的数据,后果会怎么样? 单线程往往需要等待,就好像我们到银行窗口办理业务的时候,以前的时候很多网点只有一个窗口,所以

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了.这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我们以最初的添加了First Person Controller的PFB_Straight为整个场景的中心点来展开.我们先从Project中Prefabs文件夹拖出来