= {}
> extends BehaviorInfo<{}> {
/**
* 命名序号
*/
public nameIndex: number = 0;
/**
* 获取下一个 ID
*/
public getNextId() {
return `B-${this.behaviorId}-${this.nameIndex ++}`;
}
/**
* 行为类型
*/
public behavior: IBehaviorConstructor;
/**
* 行为实例
*/
public behaviorInstance: Behavior
;
/**
* 对象参数列表
*/
public parameterOption: IBehaviorParameterOption
;
/**
* 获取参数列表的默认值
*/
public getDefaultValue(): IBehaviorParameterValue
{
let defaultObj = {} as IBehaviorParameterValue
;
for (let key in this.parameterOption) {
let defaultVal = this.parameterOption[key].defaultValue;
defaultObj[key] = defaultVal as any;
if (defaultObj[key] === undefined) {
switch (this.parameterOption[key].type) {
case "string":
defaultObj[key] = "" as any;
break;
case "number":
defaultObj[key] = 0 as any;
break;
case "boolean":
defaultObj[key] = false as any;
break;
case "vec":
defaultObj[key] = [0, 0, 0] as any;
break;
case "G":
case "R":
defaultObj[key] = {
picker: undefined,
objects: undefined
} as any;
break;
case "LR":
case "LG":
defaultObj[key] = {
picker: undefined,
objects: []
} as any;
break;
}
}
}
return defaultObj;
}
/**
* 创建一个新的行为实例
*/
public new(): Behavior
{
return new this.behavior(this.getNextId(), this.getDefaultValue());
}
public constructor(behavior: IBehaviorConstructor
) {
super();
this.behavior = behavior;
this.behaviorInstance = new this.behavior(this.getNextId(), {} as any);
this.parameterOption = this.behaviorInstance.parameterOption;
this.iconName = this.behaviorInstance.iconName;
this.behaviorId = this.behaviorInstance.behaviorId;
this.behaviorName = this.behaviorInstance.behaviorName;
this.describe = this.behaviorInstance.describe;
this.category = this.behaviorInstance.category;
this.terms = this.behaviorInstance.terms;
}
}
/**
* 群体的某种行为
*/
class Behavior<
P extends IBehaviorParameter = {},
E extends Record = {}
> extends BehaviorInfo {
/**
* 用户自定义名字
*/
public name: string = "";
/**
* 实例 ID
*/
public id: string = "";
/**
* 颜色
*/
public color: number[] = [0, 0, 0];
/**
* 优先级
* 值越大执行顺序越靠后
*/
public priority: number = 0;
/**
* 行为参数
*/
public parameter: IBehaviorParameterValue;
/**
* 对象参数列表
*/
public parameterOption: IBehaviorParameterOption
= {} as any;
public constructor(id: string, parameter: IBehaviorParameterValue
) {
super();
this.id = id;
this.parameter = parameter;
}
/**
* 相等校验
*/
public equal(behavior: Behavior): boolean {
return this === behavior || this.id === behavior.id;
};
/**
* 删除标记
*/
private deleteFlag: boolean = false;
/**
* 标记对象被删除
*/
public markDelete() {
this.deleteFlag = true;
};
/**
* 是否被删除
*/
public isDeleted(): boolean {
return this.deleteFlag;
}
/**
* 加载时调用
*/
public load(model: Model): void {}
/**
* 卸载时调用
*/
public unload(model: Model): void {}
/**
* 挂载时调用
*/
public mount(group: Group, model: Model): void {}
/**
* 挂载时调用
*/
public unmount(group: Group, model: Model): void {}
/**
* 全部影响作用前
* @param individual 影响个体
* @param group 影响组
* @param model 模型
* @param t 经过时间
*/
public effect(individual: Individual, group: Group, model: Model, t: number): void {};
/**
* 作用影响于个体
* @param individual 影响个体
* @param group 影响组
* @param model 模型
* @param t 经过时间
*/
public afterEffect(individual: Individual, group: Group, model: Model, t: number): void {};
/**
* 全部影响作用后
* @param individual 影响个体
* @param group 影响组
* @param model 模型
* @param t 经过时间
*/
public finalEffect(individual: Individual, group: Group, model: Model, t: number): void {};
}
type IRenderBehavior = BehaviorInfo | Behavior;
export {
Behavior, BehaviorRecorder, IBehaviorParameterOption, IBehaviorParameterOptionItem, IParamValue,
IAnyBehavior, IAnyBehaviorRecorder, BehaviorInfo, IRenderBehavior, IBehaviorParameter
};
export default { Behavior };