-
Notifications
You must be signed in to change notification settings - Fork 0
/
camera.js
50 lines (41 loc) · 1.54 KB
/
camera.js
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
class Camera {
constructor(x, y) {
this.pos = new Vector(x, y)
this.velocity = new Vector(0, 0)
this.acceleration = new Vector(0, 0)
this.speed = 0.02
this.up = false
this.down = false
this.left = false
this.right = false
this.zoom = 1
this.zoomStep = 0.9
this.targetZoom = 1
}
update() {
this.acceleration = new Vector(0, 0)
if (this.left) this.accelerate(-1, 0)
if (this.right) this.accelerate(1, 0)
if (this.up) this.accelerate(0, -1)
if (this.down) this.accelerate(0, 1)
this.velocity = this.velocity.multiply(0.993 ** dt)
this.velocity = this.velocity.add(this.acceleration.multiply(dt))
this.pos = this.pos.add(this.velocity.multiply(dt))
this.zoom += (this.targetZoom - this.zoom) * 0.1
}
accelerate(x, y) {
this.acceleration = this.acceleration.add(new Vector(x * this.speed, y * this.speed))
}
middle() {
return this.pos.add(new Vector(window.innerWidth * 0.5, window.innerHeight * 0.5))
}
setMiddle(pos) {
this.pos = pos.subtract(new Vector(window.innerWidth * 0.5, window.innerHeight * 0.5))
}
toScreenCoords(vector) {
return vector.subtract(this.middle()).multiply(this.zoom).add(new Vector(window.innerWidth * 0.5, window.innerHeight * 0.5))
}
toWorldCoords(vector) {
return vector.subtract(new Vector(window.innerWidth * 0.5, window.innerHeight * 0.5)).multiply(1/this.zoom).add(this.middle())
}
}