-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbee.easel
More file actions
98 lines (80 loc) · 2.97 KB
/
bee.easel
File metadata and controls
98 lines (80 loc) · 2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use color=#fc0
const BeeAccelerationPerTick = 0.05
const SnapRadius = 1.5
pub field unit.BeeTrajectory
pub signal unit.BeeTrajectoryChanged
pub fn unit.Bee() {
use body=unit
use layer=Layer:Bee
use radius=1, shape=Circle
Body(pos=@(0.5 * HBoundaryRadius * SignedRandom, 0.5 * VBoundaryRadius * SignedRandom))
PolygonCollider(category=Category:Bee)
{
use radius=2*radius
ImageSprite(@bee-body.svg, color=#000, opacity=0.3, screenOffset=@(0, 2))
ImageSprite(@bee-body.svg, color=, shading=0.5)
ImageSprite(@bee-eyes.svg)
ImageSprite(@bee-wings-*.svg, frameInterval=3, opacity=0.5)
}
DecaySpeed(0.03)
BeeTrajectory = []
with BeeTrajectoryChanged {
await Paint
use luminous=1, radius=0.1, color=#f60, layer=Layer:Beeline
Strand(to=BeeTrajectory[0], glare=0.01, bloom=2, bloomAlpha=1, opacity=0.5, layer=layer-1)
PolygonSprite(body=@(0,0), shape=Line(BeeTrajectory, cap=true), glare=0.01, bloom=2, bloomAlpha=1, layer=layer-1)
}
on BeforePhysics {
let head = BeeTrajectory[0] ?? QueryNearest(filter=Category:Pollen).Pos
if !head {
await BeeTrajectoryChanged
continue
}
let delta = head - (Pos + 2*Velocity/1s)
Velocity += delta.Truncate(BeeAccelerationPerTick)
if delta.Length <= 0.5 {
BeeTrajectory.Shift
BeeTrajectoryChanged
}
}
on Paint {
Heading = Velocity.Angle
}
}
pub fn this.BeeSwarmControls([owner]) {
on ButtonDown(Click) {
// Find which trajectory to extend/replace
let closest = Pointer.QueryNearest(filter=Category:Bee)
if !(closest && closest.BeeTrajectory) { continue }
let startNewTrajectory = true
let closestDistance = Pointer.Distance(closest.Pos)
for use unit in Query(filter=Category:Bee) {
let tail = BeeTrajectory[BeeTrajectory.Length - 1]
if !tail { continue }
let distance = Pointer.Distance(tail)
if distance < closestDistance {
closest = unit
closestDistance = distance
startNewTrajectory = false
}
}
// Select the correct unit, and clear its trajectory if necessary
use unit=closest
if startNewTrajectory {
BeeTrajectory.Clear
}
// Extend trajectory
await Subspawn {
once ButtonUp(Click) { Expire }
with Pointer {
let snapTo = Pointer.QueryNearest(filter=Category:Bee | Category:Pollen).Pos
let target = snapTo && Distance(snapTo, Pointer) < SnapRadius ? snapTo : Pointer
let tail = BeeTrajectory[BeeTrajectory.Length - 1]
if !tail || Distance(tail, target) > 0.5 {
BeeTrajectory.Push(target)
BeeTrajectoryChanged
}
}
}
}
}