游戏中使用的反射

来源:互联网 发布:北京租房知乎 编辑:程序博客网 时间:2024/06/06 07:05

在此游戏中,反射的基本目的就是为了便于配置,通过配置文件来生成对象。并且将需要管理的内容集中到了一起,便于查看和修改,易于扩展;

      首先放上xml,后期如果想添加技能,添加卡牌,直接在这里添加即可。

        cards的att还未使用,后期很好改,通过给skill添加以静态函数,根据攻击力产生一个普通攻击的技能;

        这一篇是最后一篇了,花费了整整12个小时,终于完成了基本的框架建立。后期看有时间,将UI补起来,UI的设计我预计以数据模型为基础,也就是一个Card为一个panel一个skill为一个panel,一个map为一个panel;map的panel为主面板,其他再来添加,层层对应。

以下是xml文档

<?xml version="1.0" encoding="UTF-8"?><game><cards classname="entity.Card"><card name="狼人" hp="20" skill="群殴" att="3"/><card name="火人" hp="20" skill="火海" att="3"/><card name="水人" hp="20" skill="水淹" att="3"/><card name="金人" hp="20" skill="一闪" att="1"/><card name="妙蛙" hp="13" skill="火海" att="3"/><card name="甜泉" hp="12" skill="水淹" att="4"/><card name="木妖" hp="11" skill="群殴" att="5"/><card name="旺财" hp="14" skill="云压" att="6"/><card name="狼人" hp="20" skill="撞击" att="3"/><card name="火人" hp="20" skill="火球术" att="3"/><card name="水人" hp="20" skill="水球" att="3"/><card name="金人" hp="20" skill="一闪" att="1"/><card name="妙蛙" hp="13" skill="火海" att="3"/><card name="甜泉" hp="12" skill="水淹" att="4"/><card name="木妖" hp="11" skill="群殴" att="5"/><card name="旺财" hp="14" skill="云压" att="6"/><card name="狼人" hp="20" skill="撞击" att="3"/><card name="火人" hp="20" skill="火球术" att="3"/><card name="水人" hp="20" skill="水球" att="3"/><card name="金人" hp="20" skill="一闪" att="1"/><card name="妙蛙" hp="13" skill="火海" att="3"/><card name="甜泉" hp="12" skill="水淹" att="4"/><card name="木妖" hp="11" skill="群殴" att="5"/><card name="旺财" hp="14" skill="云压" att="6"/></cards><mycard list="1,2,3"/><!--这个还未使用--><skills ><single classname="entity.SingleSkill"><skill name="火球术" att ="6" /><skill name="撞击" att ="4" /><skill name="水球" att ="6" /><skill name="一闪" att ="5" /></single><group classname="entity.GroupSkill"><skill name="两闪" att ="7" /><skill name="群殴" att ="3" /><skill name="火海" att ="2" /><skill name="水淹" att ="3" /><skill name="云压" att ="2" /></group></skills></game>

以下是config的主类,这个类只是用于将配置文件集中,统一分配;

package config;import java.io.File;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class Config {public final static CardConfig CARDS;public final static SkillConfig SKILLS;private static final File XML_PATH = new File("config/config.xml");static {/** 初始化静态 **/SAXReader reader = new SAXReader();Document doc;Element game;Element cardsCfg=null;Element skillCfg=null;Element system=null;try {// 读取根元素doc= reader.read(XML_PATH);game = doc.getRootElement();// 读取主框架设置cardsCfg = game.element("cards");skillCfg=game.element("skills");} catch (DocumentException e) {e.printStackTrace();}CARDS=new CardConfig(cardsCfg);SKILLS=new SkillConfig(skillCfg);}}

这个是skill配置文件,具体去查看后面前面静态代码块内的内容;
public class SkillConfig {/**参数个数**/public  static final int Primer_COUNT=2;/**技能总个数**/private int skillCoutn=0;/**最外层的map是一个className对应一个需要由此类实现的多个类参数<br> * 里面的每一个String[]就是一组参数<br> * 也可以用二维数组,不过已经够复杂了<br> * 可以将这个类分解成多个配置文件来降低复杂度,如一个className的单配置,然后这个类以其为成员容器<br> */private   Map<String,ArrayList<String[]>> skillMap=new HashMap<String,ArrayList<String[]>>();public SkillConfig(Element skillCfg) {//列出所有的技能List<Element> skillCfgs=skillCfg.elements();//需要不同类文件实现的类for(Element skillsTypeCfg:skillCfgs) {String className=skillsTypeCfg.attributeValue("classname");ArrayList<String[]> primers=new ArrayList<String[]>();//此类中所有需要实现的类参数List<Element> skills=skillsTypeCfg.elements("skill");for(Element skill:skills) {String[] primer=new String[Primer_COUNT];primer[0]=skill.attributeValue("name");primer[1]=skill.attributeValue("att");this.skillCoutn++;primers.add(primer);}this.skillMap.put(className, primers);}}public Map<String, ArrayList<String[]>> getSkillMap() {return skillMap;}public int getSkillCoutn() {return skillCoutn;}}
</pre><pre name="code" class="java">

以下是skill使用反射来创建对象的方法,具体请查看技能篇的skill实现

static {// 使用反射创建新实例Map<String, ArrayList<String[]>> skillMap = Config.SKILLS.getSkillMap();SKILL_ALL = new Skill[Config.SKILLS.getSkillCoutn()];//所有的卡牌MAX_SKILLS = SKILL_ALL.length;//最大卡牌数目SKILL_MAP = new HashMap<String, Integer>();//用于给card配置文件预留的查找技能的方法Set<String> classes = skillMap.keySet();int id = 0;//用于标识技能idfor (String className : classes) {//两种不同的技能,使用不同的类创建对象ArrayList<String[]> primers = skillMap.get(className);try {Class clazz = Class.forName(className);Constructor<Skill> cons = clazz.getConstructor(int.class,String.class, int.class);for (String[] primer : primers) {//相同类型的技能,使用相同的类创建学习
<span style="white-space: pre;"></span>assert primer.length == SkillConfig.Primer_COUNT;
SKILL_ALL[id] = cons.newInstance(id++, primer[0],Integer.parseInt(primer[1]));SKILL_MAP.put(SKILL_ALL[id-1].getName(), SKILL_ALL[id-1].getId());}} catch (ClassNotFoundException e) {System.err.println("找不到类:" + className);continue;} catch (NoSuchMethodException e) {System.err.println("找不到此构造函数:" + e.getMessage());continue;} catch (Exception e) {e.printStackTrace();continue;}}


0 0
原创粉丝点击