【问题标题】:Repetitive value assignment with computation计算的重复赋值
【发布时间】:2021-01-21 19:53:58
【问题描述】:

我有一些不满意的 TS 代码。我正在做同样的事情三倍。这怎么可能更干净?

一个位置对象有一个 x、y 和 z 轴,可以使用 position.x = ... 设置或使用 position.set(x,y,z) 给它所有值。

我可以使用一种映射函数来遍历所有值并根据一些计算分配一个新值。

private moveTowardsCamera(camera: THREE.Camera) {
        this.children.forEach((child: Asteroid) => {
            child.position.set(
                child.position.x += (camera.position.x - child.position.x) * this.speed,
                child.position.y += (camera.position.y - child.position.y) * this.speed,
                child.position.z += (camera.position.z - child.position.z) * this.speed  
            );
            child.rotation.set(
                child.rotation.x += this.rotationIncrement,
                child.rotation.y += this.rotationIncrement,
                child.rotation.z += this.rotationIncrement
            );
        });
    }

【问题讨论】:

  • .set 方法是什么?在同一个语句中传递一个参数重新分配child.position.# 看起来非常奇怪。例如child.position.set( child.position.x + (camera.position.x - child.position.x) * this.speed,你可以这样做吗?
  • threejs.org/docs/index.html#api/en/math/Vector3 也许我可以以某种方式使用 Vector3.fromArray...

标签: javascript typescript non-repetitive


【解决方案1】:

您可以遍历 ['x', 'y', 'z'] 的数组,对其进行映射,并将其分散到不同的 .set 调用中:

// make sure to use `as const` here so the type doesn't get widened to Array<string>
const dims = ['x', 'y', 'z'] as const;
private moveTowardsCamera(camera: THREE.Camera) {
    this.children.forEach((child: Asteroid) => {
        child.position.set(
            ...(dims.map(dim => 
                child.position[dim] + (camera.position[dim] - child.position[dim]) * this.speed
            ) as [number, number, number])
        );
        child.rotation.set(
            ...(dims.map(dim => 
                child.rotation[dim] + this.rotationIncrement
            ) as [number, number, number])
        );
    });
}

非常确定您应该使用新的向量值调用.set 方法,而不是在调用.set 的同时重新分配child.positionchild.rotation 值。

【讨论】:

  • TypeScript 抱怨 TS2556:预期有 3-4 个参数,但有 0 个或更多。
  • 不喜欢传播,可惜了,我猜你可以用as指定映射数组的长度
猜你喜欢
  • 2017-11-21
  • 2011-03-13
  • 1970-01-01
  • 2018-05-13
  • 2016-04-03
  • 2014-07-18
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多