Spaces:
Running
Running
| import Simulation from './Simulation' | |
| export default class Teleporter { | |
| constructor (player) { | |
| this.player = player | |
| this.targets = [] | |
| } | |
| addTarget ({ position, lookAt, galaxy }) { | |
| this.targets.push({ | |
| position, | |
| lookAt, | |
| galaxy | |
| }) | |
| } | |
| getClosestTeleportIndex () { | |
| let minDistance = Infinity | |
| let result = null | |
| for (let i = 0; i < this.targets.length; i++) { | |
| let distance | |
| if (this.targets[i].galaxy !== this.player.galaxy) { | |
| distance = | |
| this.player.object.position.distanceTo(Simulation.config.wormhole.position) + | |
| this.targets[i].position.distanceTo(Simulation.config.wormhole.position) | |
| } | |
| else { | |
| distance = this.player.object.position.distanceTo(this.targets[i].position) | |
| } | |
| if (distance < minDistance) { | |
| minDistance = distance | |
| result = i | |
| } | |
| } | |
| return result | |
| } | |
| teleportNext () { | |
| const nextIndex = (this.getClosestTeleportIndex() + 1) % this.targets.length | |
| this.teleportTo(this.targets[nextIndex]) | |
| } | |
| teleportTo (target) { | |
| this.player.object.position.copy(target.position) | |
| this.player.galaxy = target.galaxy | |
| this.player.lookAt(target.lookAt) | |
| } | |
| } | |