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

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

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


“任务”的五种状态

/**
 * 任务状态
 * @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);
			}
		}
	}

}


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


       

      

         

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值