Java8与游戏开发(一)

经常要为玩家角色存储一些数据,比如神器,装备,时装,他们都是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, Map> roleMap = new HashMap<>();

public static > T getMgr(Class clz, Long roleId, Supplier mgrGenerator) {
    Map 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与游戏开发(一))