游戏中的任务系统的简单架构!

来源:互联网 发布:抄板软件quickpcb 编辑:程序博客网 时间:2024/06/05 06:20

         之所以 想到先写这个“任务系统”是被面试到了!

        废话不多少,上传不要代码!


“任务”的五种状态

/** * 任务状态 * @author kevin chen * @Description: TODO  * @date 2015年10月21日 下午8:20:39 */public class TaskState {/**0 不可接状态*/public static final int cannotAccept = 0;/**1 可接  但还未接的状态*/public static final int canAccept = 1;/**2 已接  正在进行中*/public static final int doTasking = 2;/**3 完成  未领奖*/public static final int completeTask = 3;/**4 完成  已领奖*/public static final int finishTask = 4;}

“任务”对象的实体 

/** * 任务实体 需要持久化的 * @author kevin chen * @Description: TODO  * @date 2015年10月21日 下午8:51:16 */public class Task {/**任务id*/private int taskId;/**任务状态*/private int taskState;/**任务进度*/private int progress;/**任务配置表*/private transient Tasktemplate tasktemplate;/**任务目标实体*/private transient ITarget target;public Task(int taskId, int taskState) {this.taskId = taskId;this.taskState = taskState;this.tasktemplate = DataManager.getSingleData(GameConfigTable.tasktemplate, this.taskId);this.target = TargetType.getITargetById(this.tasktemplate.getTargetType());}public Tasktemplate getTasktemplate() {return tasktemplate;}public int getTaskId() {return taskId;}public void setTaskId(int taskId) {this.taskId = taskId;}public int getTaskState() {return taskState;}public void setTaskState(int taskState) {this.taskState = taskState;}public int getProgress() {return progress;}public void setProgress(int progress) {this.progress = progress;}public int getTaskType(){return this.tasktemplate.getTaskType();}public ITarget getTarget() {return target;}/**下一个任务*/public int getNextTaskId(){return this.tasktemplate.getPostTaskId();}}


着重看看任务实体是如何构造的!


public interface ITarget {/**任务进行中  检查是否完成*/boolean checkTaskComplete(Hero hero,Task task);}

在任务配置表中 表示任务目的的参数 要与枚举的下标一致

public enum TargetType {/**0  none*/Null(null),/**1  打怪*/HitMonster(new HitMonsterTarget()),/**2 采集*/Collect(new CollectTarget()),/**3 收集*/Gather(new GatherTarget()),/**4 通关*/PassKa(new PassKaTarget()),/**5 对话*/DialogTarget(new DialogTarget()),/**6 送物品*/GiveItem(new GiveItemTarget()),/**7 护送*/Escort(new EscortTarget()),/**8 使用物品*/UseItem(new UseItemTarget()),/**9 特殊*/Special(new SpecialTarget()),;private ITarget target;private TargetType (ITarget target){this.target = target;}public ITarget getTarget() {return target;}        /**获得任务目的的具体实体对象   在构造任务实体对象的时候调用*/public static ITarget getITargetById(int targetId){TargetType[] values = TargetType.values();TargetType targetType = values[targetId];return targetType.getTarget();}}

public class Hero {       /** * 当前正在做的任务 (其中主线任务只有一条,支线任务,日常任务可以多条) 需持久化 */private List<Task>  doingTasks = new ArrayList<Task>();/** * 所有要求记录已完成的任务  需持久化 */private List<Task> finishTasks = new ArrayList<Task>();              public List<Task> getDoingTasks() {               return doingTasks;        } }

任务的业务逻辑处理 采用的静态方法

/** * 任务相关的逻辑处理 * @author kevin chen * @Description: TODO  * @date 2015年10月22日 上午11:45:48 */public class TaskManager {/** * 当前玩家是否满足任务的等级要求 * @param hero * @param tasktemplate * @return true:满足   false:不满足 */public static boolean isEnoughTaskLevel(Hero hero,Tasktemplate tasktemplate){return true;}/** * 更新某个任务 * @param hero * @param task */public static void updateTaskMsg(Hero hero,Task task){}/** * 任务进行中 判断任务是否完成! * 该方法供相关任务所设计到的各个模块调用! * @param hero */public static void checkTask(Hero hero){List<Task> doingTasks = hero.getDoingTasks();for (Iterator<Task> iterator = doingTasks.iterator(); iterator.hasNext();) {Task task = iterator.next();ITarget target = task.getTarget();boolean complete = target.checkTaskComplete(hero, task);if(complete){updateTaskMsg(hero, task);}}}}


小刚分享 望大家多多指点!


       

      

         

0 0
原创粉丝点击