0

我正在开发一个游戏并使用 Vector2List 来表示许多粒子的位置。假设我想将 X 值增加 4。

当我使用单个 Vector2 时,我可以做这样的事情,一切都很好:

position.x += 4;

其中 position 是 Vector2 的一个实例

如果 Vector2 是 {3, 5} 那么它变成 {7, 5}(一切正常)。

但是,如果我使用的是矢量列表,我会执行以下操作:

position[i].x += 4

其中 i 是粒子索引,位置是 Vector2List 的一个实例

然后它从 {3, 5} 变为 {3, 5}(完全没有变化!)。
我发现完成这项工作的唯一方法是使用函数集值,但它看起来不应该是强制性的。难道我做错了什么?

什么不工作

position[i].x += 4;

什么在起作用

position.setValues(i, position[i].x+4, position[i].y);

示例代码

          Vector2List positions = Vector2List(1);
          print('positions[0] = ${positions[0]}');
          positions[0].x += 4;
          positions[0].y += 10;
          print('positions[0] after operation = ${positions[0]}');
          positions.setValues(0, positions[0].x + 4, positions[0].y + 10);
          print('positions[0] after setValues = ${positions[0]}');

结果是

I/flutter (32638): positions[0] = [0.0,0.0]
I/flutter (32638): positions[0] after operation = [0.0,0.0]
I/flutter (32638): positions[0] after setValues = [4.0,10.0]

我的软件
Flutter 版本 Channel Stable 2.0.1
Dart SDK 版本:2.12.0 (stable)
我正在使用空安全。

请原谅任何英语错误,我不是母语人士。

谢谢!

4

1 回答 1

1

问题是如何实现[]运算符Vector2List

T operator [](int index) {
  final r = newVector();
  load(index, r);
  return r;
}

如您所见,它实际上会创建一个新的向量对象,并在填充数据后返回它。这意味着对这个新矢量对象的任何修改都不会导致对象发生任何变化Vector2List

你可以做的是这样的:

import 'package:vector_math/vector_math_lists.dart';

void main() {
  Vector2List positions = Vector2List(1);
  print('positions[0] = ${positions[0]}');

  positions[0] = positions[0]
    ..x += 4
    ..y += 10;

  print('positions[0] after operation = ${positions[0]}');
  // positions[0] after operation = [4.0,10.0]
}

它仍然不是很好,但是和你做的一样,但更简化了。我认为最理想的方法是创建一个新的Vector2并将其与+=操作员一起使用Vector2List

import 'package:vector_math/vector_math.dart';
import 'package:vector_math/vector_math_lists.dart';

void main() {
  Vector2List positions = Vector2List(2);
  print('positions[0] = ${positions[0]}');

  positions[0] += Vector2(4, 10);

  print('positions[0] after operation = ${positions[0]}');
  // positions[0] after operation = [4.0,10.0]
}
于 2021-03-13T15:55:29.983 回答