code / tomo-lost-signal

Lines522 Tomo498 Markdown11 make10
1 others 3
INI3
(45 lines)
1 # A camera module that wraps around raylib's built-in Camera2D
2 use random
3 use ./raylib.tm
5 struct Camera(
6 pos=Vector2(0,0),
7 target=Vector2(0,0),
8 forward=Vector2(1,0),
9 anchor=Vector2(0.5, 0.5),
10 rotation=Num32(0.0),
11 zoom=Num32(1.0),
12 shake=Num32(0.0),
14 func begin_drawing(c:Camera)
15 pos := c.pos
16 if c.shake > Num32(1.0)
17 pos += Vector2(c.shake, 0).rotated(random.num32(0, Num32.TAU))
19 BeginMode2D(Camera2D(
20 target=c.pos,
21 offset=Vector2(c.anchor.x * Num32(GetScreenWidth()), c.anchor.y * Num32(GetScreenHeight())),
22 rotation=c.rotation,
23 zoom=c.zoom,
24 ))
26 func draw(c:Camera)
27 DrawCircleV(c.target, 10, Color(0xff,0,0))
28 len := (Num32(50.)*(Num32(1.) _min_ c.forward.length()))
29 DrawCircleV(c.target + len*c.forward.norm(), 10, Color(0xff,0xff,0,0x80))
31 func end_drawing(c:Camera)
32 EndMode2D()
34 func update(c:&Camera, dt:Num32)
35 len := (Num32(50.)*(Num32(1.) _min_ c.forward.length()))
36 c.pos = c.pos.mix(c.target + len*c.forward.norm(), 0.9)
37 c.shake -= dt*Num32(2.0)
39 func add_shake(c:&Camera, amount:Num32)
40 c.shake = (c.shake.exp() + amount).log() or Num32(0)
42 func follow(c:&Camera, pos:Vector2)
43 if not pos.dist(c.target).near(0, 1e-2, 1e-2)
44 c.forward = c.forward.mix((pos - c.target).norm(), .05)
45 c.target = pos