美文网首页
Java8与游戏开发(一)

Java8与游戏开发(一)

作者: 绿洲岛先知 | 来源:发表于2018-07-13 15:05 被阅读0次

    经常要为玩家角色存储一些数据,比如神器,装备,时装,他们都是GameObject,就像这样:

    GameObject 类代码:

    public enum DataState {
            ......
    };
    
    protected DataState curDataState = DataState.dsModify;
    
        ......
    
    protected abstract int saveInsert();
    
    protected abstract int saveDelete();
    
    protected abstract int saveModify();
    
    public abstract long getId();
    
    public abstract void setAllModifyState();
    
    public abstract void clearModifyState();
    
    public abstract int deleteObject();
    
    @JsonIgnore
    protected boolean bSaveDBFlag = false;
    
    @JsonIgnore
    public boolean isSaveDBFlag() {
        return bSaveDBFlag;
    }
    
    @JsonIgnore
    public String getClassFlag() {
        ......
    }
    
    @JsonIgnore
    private SqlExecuter getExecuter() {
        ......
    }
    
    /**
     * 标记存库成功,设置对应的状态
     */
    public final void saveDBSuccessed() {
        ......
    }
    
    /**
     * 如果所存储的Manager容器默认IdMap有记录数组Index索引,那么就可以通过这个index索引来快速找到对象在ArrayList中的位置
     */
    public int arrayIndex = 0;
    
    public void autoSave() {
        ......
    }
    
    public void saveToDB() {
        ......
    }
    
    /**
     * 计划存储
     * 
     * @return
     */
    public void saveToDBInPlan() {
        ......
    }
    
    public void realSaveToDB() {
        ......
    }
    
    /**
     * 把对象放入到执行任务中
     */
    public int AddObjToTask() {
            ......
    }
    

    每一个角色都要有自己的GameObject,也就有自己的容器GameObjectMgr,每一个角色都有自己的GameObjectMgr,存储所有角色的游戏物品的类,可以设计为GameDataHolder:

    所有角色的游戏物品的载体类GameDataHolder 代码:

    //manager的class,角色id,manager
    public static Map<Class<?>, Map<Long, Object>> roleMap = new HashMap<>();
    
    public static <T extends GameObjectMgr<?>> T getMgr(Class<T> clz, Long roleId, Supplier<T> mgrGenerator) {
        Map<Long, Object> mgrMap = roleMap.get(clz);
        if (mgrMap == null) {
            mgrMap = new HashMap<>();
            roleMap.put(clz, mgrMap);
        }
        Object t = mgrMap.get(roleId);
        if (t == null) {
            t = mgrGenerator.get();
        }
        return clz.cast(t);
    }
    

    1.使用享元模式,而不是多个单例,代码量大大减少,符合单一职责原则。

    2.java的Supplier的惰性加载。

    3.外部传入mgrGenerator对象,生成GameObjectMgr对象。

    4.使用Class对象cast方法,防止对象转换时出现的警告。

    相关文章

      网友评论

          本文标题:Java8与游戏开发(一)

          本文链接:https://www.haomeiwen.com/subject/bxajpftx.html