博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
游戏场景需要是可配置的:AssetManager工具类和xml文件读取
阅读量:5225 次
发布时间:2019-06-14

本文共 3048 字,大约阅读时间需要 10 分钟。

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

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

1.场景名称需要自定义

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

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

fight_scene.xml 大致如下:

永安镇
和平安宁的小镇,故事开始的地方
沉香溪
白桦林
......

通过读取配置文件中的数据,并实例化对应的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
lFScene = new ArrayList
(); 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
lFscene,int clomuns){ int sceneNums=lFscene.size(); ..... if (surplus==0) { //如果能够被整除 //将场景列表中另外存储为多个队列 for (int i = 0; i < rows; i++) { List
lfs_rows = new ArrayList
(); for(int j=0; j
lfs_rows = new ArrayList
(); for(int j=0; j
lfs_surplus = new ArrayList
(); for(int k =0;k
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

你可能感兴趣的文章
React.js 小书 Lesson22 - props.children 和容器类组件
查看>>
在Js中得到元素的子元素集合注意事项
查看>>
Spring MVC之DispatcherServlet初始化详解
查看>>
多线程篇-GCD-基本概念使用
查看>>
生成唯一的随机数
查看>>
尼玛某前辈把ant 工程 改成android studio工程然后上传了 对我来说 尼玛这玩意就和屎一样...
查看>>
SSM整合(精简版)
查看>>
各种xml文件约束,Eclipse用
查看>>
泰勒展开,傅里叶变换,拉普拉斯变换和Z变换的物理意义
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
Python 面向对象(其四)
查看>>
客户端访问浏览器的流程
查看>>
Linux——ls
查看>>
操作系统(八) 死锁
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
shell编程 遍历目录文件
查看>>
Python接口自动化测试_悠悠
查看>>
(转)python学习笔记5--decimal
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>