⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlscriptparser.java

📁 j2me游戏引擎 j2me游戏引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -