blob: d1b2e57c1259f0864f79ac2355bfc13390c90b70 (
plain)
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
|
namespace LivingVillage.Kernel
module Sim =
type Vec2 =
{ X: float32
Y: float32 }
type Avatar =
{ Pos: Vec2 }
type Input =
{ MoveX: float32
MoveY: float32 }
type TimeStep =
{ Dt: float32
Input: Input }
type World =
{ Tick: int64
Avatar: Avatar }
let mapWidthTiles = 64
let mapHeightTiles = 48
let tilePixels = 32
let avatarSpeed = 160.0f
let initialWorld () : World =
let centerX = float32 (mapWidthTiles * tilePixels / 2 - tilePixels / 2)
let centerY = float32 (mapHeightTiles * tilePixels / 2 - tilePixels / 2)
{ Tick = 0L
Avatar = { Pos = { X = centerX; Y = centerY } } }
let clamp v lo hi = if v < lo then lo elif v > hi then hi else v
let step (ts: TimeStep) (world: World) : World =
let maxX = float32 (mapWidthTiles * tilePixels - tilePixels)
let maxY = float32 (mapHeightTiles * tilePixels - tilePixels)
let dx = ts.Input.MoveX * avatarSpeed * ts.Dt
let dy = ts.Input.MoveY * avatarSpeed * ts.Dt
{ Tick = world.Tick + 1L
Avatar =
{ Pos =
{ X = clamp (world.Avatar.Pos.X + dx) 0.0f maxX
Y = clamp (world.Avatar.Pos.Y + dy) 0.0f maxY } } }
|