📄 xmlscriptparser.java
字号:
package cn.org.matrix.gmatrix.gameLab.engine;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Vector;
import org.kobjects.xml.XmlReader;
import cn.org.matrix.gmatrix.gameLab.GameObject;
import cn.org.matrix.gmatrix.gameLab.GameObjectQueue;
import cn.org.matrix.gmatrix.gameLab.elements.biology.Actor;
import cn.org.matrix.gmatrix.gameLab.elements.biology.NPC;
import cn.org.matrix.gmatrix.gameLab.elements.property.Property;
import cn.org.matrix.gmatrix.gameLab.elements.property.PropertyManager;
import cn.org.matrix.gmatrix.gameLab.engine.music.Music;
import cn.org.matrix.gmatrix.gameLab.engine.music.Musician;
import cn.org.matrix.gmatrix.gameLab.events.*;
import cn.org.matrix.gmatrix.gameLab.messages.*;
import cn.org.matrix.gmatrix.gameLab.scene.Camera;
import cn.org.matrix.gmatrix.gameLab.scene.MapTransformer;
import cn.org.matrix.gmatrix.gameLab.scene.SimpleLayer;
import cn.org.matrix.gmatrix.gameLab.scene.SimpleLevel;
import cn.org.matrix.gmatrix.gameLab.scene.SimpleMap;
import cn.org.matrix.gmatrix.gameLab.util.StringExtension;
/**
* xml脚本解析器
* @author cleverpig
*
*/
public class XmlScriptParser {
private XmlReader xmlReader=null;
//xml文件中的Tag声明:REF后缀表示对另外一个元素的引用
//消息元素名
private String msgName="msg";
//消息元素属性
private String[] msgAttributes={"id","content"};
//消息队列元素名
private String msgQueueName="msgQueue";
//消息队列元素属性
private String[] msgQueueAttributes={"id","msgsREF"};
//事件元素名
private String eventName="event";
//事件元素属性
private String[] eventAttributes={"id","invoker",
"responser","type","parameter"};
//事件队列元素名
private String eventQueueName="eventQueue";
//事件队列元素属性
private String[] eventQueueAttributes={"id","eventsREF"};
//道具元素名
private String propertyName="property";
//道具元素属性
private String[] propertyAttributes={"id","name",
"description","buyPrice","salePrice",
"lifeEffect","attackEffect","defenceEffect",
"useTimes","type"};
//道具箱元素名
private String propBoxName="propertyBox";
//道具箱元素属性
private String[] propBoxAttributes={"id","propsREF"};
//NPC元素名
private String npcName="npc";
//NPC元素属性
private String[] npcAttributes={"id","name","life",
"attack","defence",
"imgURL","faceURL",
"col","row",
"speed","direction",
"animationLoopTime",
"animationFrameWidth",
"animationFrameHeight",
"frameSwtichSequence",
"eventQueueREF","propertiesREF",
"type"};
//Actor元素名
private String actorName="actor";
//Actor元素属性
private String[] actorAttributes={"id","name","life","attack",
"defence","imgURL","faceURL",
"col","row","speed","direction",
"animationLoopTime",
"animationFrameWidth",
"animationFrameHeight",
"frameSwtichSequence",
"propertiesREF"};
//图层元素名
private String layerName="layer";
//图层元素属性
private String[] layerAttributes={"id","tileWidth","tileHeight",
"tileCols","tileRows","type","imgURL",
"mapData"};
//地图转换器元素名称
private String transformerName="transformer";
//地图转换器元素属性
private String[] transformerAttributes={"id","nextLevel","nextMap",
"location_col","location_row",
"nextMapEntry_col","nextMapEntry_row","imgURL",
"tileWidth","tileHeight"};
//地图元素名称
private String mapName="map";
//地图元素属性
private String[] mapAttributes={"id","name","width","height",
"layerREF","npcREF","maptransformerREF"};
//关卡元素名称
private String levelName="level";
//关卡元素属性
private String[] levelAttributes={"id","name","firstMapID","mapREF"};
//摄像机元素名称
private String cameraName="camera";
//摄像机元素属性
private String[] cameraAttributes={"id","x","y",
"width","height","moveType","customSize"};
//音乐元素名称
private String musicName="music";
//音乐元素属性
private String[] musicAttributes={"id","resURL","musicType",
"playModel","loopNumber"};
//全局配置名称
private String globalName="global";
//全局配置属性
private String[] globalAttributes={"carnieRunInterval"};
//元素对应的游戏对象的类型
public static final int EVENT_OBJECT=1;
public static final int EVENTQUEUE_OBJECT=2;
public static final int MESSAGE_OBJECT=3;
public static final int MESSAGEQUEUE_OBJECT=4;
public static final int PROPERTY_OBJECT=5;
public static final int PROPERTYBOX_OBJECT=6;
public static final int NPC_OBJECT=7;
public static final int ACTOR_OBJECT=8;
public static final int LAYER_OBJECT=9;
public static final int TRANSFORMER_OBJECT=10;
public static final int MAP_OBJECT=11;
public static final int LEVEL_OBJECT=12;
public static final int CAMERA_OBJECT=13;
public static final int MUSIC_OBJECT=14;
public static final int GLOBAL=15;
private final int NOTFOUND=1;
private final int FOUND=2;
private final int ELEMENTEND=3;
/**
* 打开配置
*/
public void openConfigure(String resURL){
InputStream in=this.getClass().getResourceAsStream(resURL);
InputStreamReader reader=new InputStreamReader(in);
try{
xmlReader=new XmlReader(reader);
}
catch(Exception ex){
ex.printStackTrace();
}
}
/**
* 找到任意元素的下一个StartTag位置,无论是哪个元素的START_TAG位置
*/
private void findNextStartTag() throws Exception{
//遇到StartTag或者xml文档结尾时结束
while((xmlReader.getType()!=XmlReader.END_DOCUMENT)&&(xmlReader.next()!=XmlReader.START_TAG)){
// System.out.println(xmlReader.getPositionDescription());
;
}
}
/**
* 找到指定元素的下一个StartTag位置,返回查找结果常量
* @param name 被查找的元素名
* @return 如果在xml文件的下一个位置发现被查找元素的START_TAG,则返回FOUND;
* 如果发现的元素名不是被查找的元素,则返回NOTFOUND;
* 如果在xml文件的下一个位置发现被查找元素的TEXT,则返回ELEMENTEND;
*/
private int findNextStartTag(String name) throws Exception{
int result=NOTFOUND;
//遇到StartTag或者xml文档结尾时结束
while(xmlReader.getType()!=XmlReader.END_DOCUMENT){
// System.out.println(xmlReader.getPositionDescription());
// System.out.println("type="+xmlReader.getType()+" name="+xmlReader.getName());
//如果已经读到START_TAG位置
if (xmlReader.next()==XmlReader.START_TAG){
//如果为当前参数指定的name元素,则返回FOUND
if (xmlReader.getName().equals(name)){
System.out.println("已经找到"+name+"元素的START_TAG位置:"+xmlReader.getPositionDescription());
// xmlReader.require(XmlReader.START_TAG,name);
result=FOUND;
break;
}
//否则返回NOTFOUND
else{
result=NOTFOUND;
break;
}
}
//如果没有读到START_TAG位置
else{
//如果读到的是TEXT位置,说明读到了不同名的元素之间的空行,则返回ELEMENTEND
if (xmlReader.getType()==XmlReader.TEXT){
System.out.println("查找到元素结尾");
result=this.ELEMENTEND;
break;
}
//否则返回NOTFOUND
else{
System.out.println("没有找到"+name+"元素的START_TAG位置:"+xmlReader.getPositionDescription());
result=NOTFOUND;
}
}
}
return result;
}
/**
* 读取配置头部
*/
public void readConfigureHeader(){
try{
//读取gmatrix的属性
xmlReader.next();
xmlReader.require(XmlReader.START_TAG,"gmatrix");
System.out.println("gmatrix属性--verion="+xmlReader.getAttributeValue("version"));
//读取configure的属性
xmlReader.next();
xmlReader.require(XmlReader.START_TAG,"configure");
System.out.println("读完配置头");
//找到下一个StartTag
findNextStartTag();
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
}
/**
* 读取元素名为name的所有元素
* @param name 元素名称
* @param attr 元素属性名数组
* @param isOrdinal 是否按照顺序读取
* @return 装载元素属性值的Vector
*/
public Vector readElement(String name,String[] attr,boolean isOrdinal){
try{
System.out.println("开始读取"+name+"元素...");
Vector AttributesValueSet=new Vector();
//第一次找到被查找的元素START_TAG位置时被置为true
boolean firstMatch=false;
while(true){
// System.out.println("type="+xmlReader.getType()+" name="+xmlReader.getName());
//如果是xml文件开头,则首先读取文件头
if (xmlReader.getType()==XmlReader.START_DOCUMENT){
readConfigureHeader();
}
//不按照顺序处理
if (isOrdinal==false){
//找到name元素的START_TAG位置
int findResult=findNextStartTag(name);
System.out.println("findResult="+findResult);
//根据查找的返回值判断是否继续查询
switch(findResult){
//如果返回NOTFOUND,且尚未发现过元素的START_TAG位置,则继续查询
//如果已经发现过元素的START_TAG位置,则返回查找的结果
case NOTFOUND:
if (firstMatch==false){
continue;
}
else{
return AttributesValueSet;
}
//如果返回ELEMENTEND,且尚未发现过元素的START_TAG位置,则继续查询
//如果已经发现过元素的START_TAG位置,则返回查找的结果
case ELEMENTEND:
if (firstMatch==false){
continue;
}
else{
return AttributesValueSet;
}
//如果返回FOUND,则将firstMatch标志置为true,继续处理
case FOUND:
firstMatch=true;
break;
}
}
//如果xml文件结束,则退出
if (xmlReader.getType()==XmlReader.END_DOCUMENT){
System.out.println("读取"+name+"时文档结束...");
break;
}
//判断是否还是在当前的元素中
if ((xmlReader.getName()!=null)&&(xmlReader.getName().equals(name)==false)){
System.out.println("读取"+name+"元素结束...");
break;
}
//声明装载元素属性值的Vector
Vector AttributesValue=new Vector();
//请求读取元素的START_TAG位置的数据
xmlReader.require(XmlReader.START_TAG,name);
//取出元素的属性
for(int i=0;i<attr.length;i++){
System.out.println(name+"属性--"+attr[i]+"="+xmlReader.getAttributeValue(attr[i]));
AttributesValue.addElement(xmlReader.getAttributeValue(attr[i]));
}
//添加装载元素属性值的Vector
AttributesValueSet.addElement(AttributesValue);
//如果按照顺序的话,需要找到元素的START_Tag开始位置
if (isOrdinal){
findNextStartTag();
}
}
return AttributesValueSet;
}
catch(Exception ex){
System.out.println("读取"+name+"元素时出现错误:"+ex.getMessage());
return null;
}
}
/**
* 读取元素名为name的所有元素
* @param name 元素名称
* @param attr 元素属性名数组
*/
public Vector readElement(String name,String[] attr){
try{
System.out.println("开始读取"+name+"元素...");
Vector AttributesValueSet=new Vector();
while(true){
// System.out.println("type="+xmlReader.getType()+" name="+xmlReader.getName());
//如果是xml文件开头,则首先读取文件头
if (xmlReader.getType()==XmlReader.START_DOCUMENT){
readConfigureHeader();
}
//如果xml文件结束,则退出
if (xmlReader.getType()==XmlReader.END_DOCUMENT){
System.out.println("读取"+name+"时文档结束...");
break;
}
//判断是否还是在当前的元素中
if ((xmlReader.getName()!=null)&&(xmlReader.getName().equals(name)==false)){
System.out.println("读取"+name+"元素结束...");
break;
}
//声明装载元素属性值的Vector
Vector AttributesValue=new Vector();
//找到元素的Tag开始位置
xmlReader.require(XmlReader.START_TAG,name);
//取出name的属性
for(int i=0;i<attr.length;i++){
System.out.println(name+"属性--"+attr[i]+"="+xmlReader.getAttributeValue(attr[i]));
AttributesValue.addElement(xmlReader.getAttributeValue(attr[i]));
}
//添加装载元素属性值的Vector
AttributesValueSet.addElement(AttributesValue);
//移动到下一个位置
xmlReader.next();
//读取元素的Tag结束位置
xmlReader.require(XmlReader.END_TAG,name);
// System.out.println(xmlReader.getPositionDescription());
//找到下一个startTag
findNextStartTag();
}
return AttributesValueSet;
}
catch(Exception ex){
System.out.println("读取"+name+"元素时出现错误:"+ex.getMessage());
return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -