Contact Attacking behavior add assimilate & Tracking add view range
This commit is contained in:
parent
904de02140
commit
da493bc6ae
@ -6,7 +6,8 @@ import { Model } from "@Model/Model";
|
||||
type IContactAttackingBehaviorParameter = {
|
||||
target: "CLG",
|
||||
success: "number",
|
||||
range: "number"
|
||||
range: "number",
|
||||
assimilate: "CG",
|
||||
}
|
||||
|
||||
type IContactAttackingBehaviorEvent = {}
|
||||
@ -26,7 +27,8 @@ class ContactAttacking extends Behavior<IContactAttackingBehaviorParameter, ICon
|
||||
public override parameterOption = {
|
||||
target: { type: "CLG", name: "$Target" },
|
||||
range: { type: "number", name: "$Range", defaultValue: .05, numberMin: 0, numberStep: .01 },
|
||||
success: { type: "number", name: "$Success", defaultValue: 90, numberMin: 0, numberMax: 100, numberStep: 5 }
|
||||
success: { type: "number", name: "$Success", defaultValue: 90, numberMin: 0, numberMax: 100, numberStep: 5 },
|
||||
assimilate: { type: "CG", name: "$Assimilate"}
|
||||
};
|
||||
|
||||
public effect = (individual: Individual, group: Group, model: Model, t: number): void => {
|
||||
@ -46,6 +48,10 @@ class ContactAttacking extends Behavior<IContactAttackingBehaviorParameter, ICon
|
||||
// 成功判定
|
||||
if (Math.random() * 100 < this.parameter.success) {
|
||||
targetIndividual.die();
|
||||
|
||||
if (this.parameter.assimilate?.objects) {
|
||||
individual.transfer(this.parameter.assimilate.objects);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -72,6 +78,10 @@ class ContactAttacking extends Behavior<IContactAttackingBehaviorParameter, ICon
|
||||
"$Intro": {
|
||||
"ZH_CN": "攻击进入共进范围的目标群个体",
|
||||
"EN_US": "Attack the target group and individual entering the range"
|
||||
},
|
||||
"$Assimilate": {
|
||||
"ZH_CN": "同化",
|
||||
"EN_US": "Assimilate"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ type ITrackingBehaviorParameter = {
|
||||
target: "CLG",
|
||||
strength: "number",
|
||||
range: "number",
|
||||
angle: "number",
|
||||
lock: "boolean"
|
||||
}
|
||||
|
||||
@ -28,12 +29,23 @@ class Tracking extends Behavior<ITrackingBehaviorParameter, ITrackingBehaviorEve
|
||||
target: { type: "CLG", name: "$Target" },
|
||||
lock: { type: "boolean", name: "$Lock", defaultValue: false },
|
||||
range: { type: "number", name: "$Range", defaultValue: 4, numberMin: 0, numberStep: .1 },
|
||||
angle: { type: "number", name: "$Angle", defaultValue: 180, numberMin: 0, numberMax: 360, numberStep: 5 },
|
||||
strength: { type: "number", name: "$Strength", defaultValue: 1, numberMin: 0, numberStep: .1 }
|
||||
};
|
||||
|
||||
private target: Individual | undefined = undefined;
|
||||
private currentDistant: number = Infinity;
|
||||
|
||||
private angle2Vector(v1: number[], v2: number[]): number {
|
||||
return Math.acos(
|
||||
(v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]) /
|
||||
(
|
||||
(v1[0] ** 2 + v1[1] ** 2 + v1[2] ** 2) ** 0.5 *
|
||||
(v2[0] ** 2 + v2[1] ** 2 + v2[2] ** 2) ** 0.5
|
||||
)
|
||||
) * 180 / Math.PI;
|
||||
}
|
||||
|
||||
private searchTarget(individual: Individual) {
|
||||
|
||||
for (let i = 0; i < this.parameter.target.objects.length; i++) {
|
||||
@ -46,8 +58,21 @@ class Tracking extends Behavior<ITrackingBehaviorParameter, ITrackingBehaviorEve
|
||||
let dis = targetIndividual.distanceTo(individual);
|
||||
|
||||
if (dis < this.currentDistant && dis <= this.parameter.range) {
|
||||
this.target = targetIndividual;
|
||||
this.currentDistant = dis;
|
||||
|
||||
// 计算目标方位
|
||||
const targetDir = [
|
||||
targetIndividual.position[0] - individual.position[0],
|
||||
targetIndividual.position[1] - individual.position[1],
|
||||
targetIndividual.position[2] - individual.position[2]
|
||||
];
|
||||
|
||||
// 计算角度
|
||||
const angle = this.angle2Vector(individual.velocity, targetDir);
|
||||
|
||||
if (angle < (this.parameter.angle ?? 360) / 2) {
|
||||
this.target = targetIndividual;
|
||||
this.currentDistant = dis;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
@ -150,7 +175,11 @@ class Tracking extends Behavior<ITrackingBehaviorParameter, ITrackingBehaviorEve
|
||||
"$Interactive": {
|
||||
"ZH_CN": "交互",
|
||||
"EN_US": "Interactive"
|
||||
}
|
||||
},
|
||||
"$Angle": {
|
||||
"ZH_CN": "可视角度",
|
||||
"EN_US": "Viewing angle"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user