Vector2List 未按预期工作:Dart // Flutter

Vector2List not working as expected : Dart // Flutter

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

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

position.x += 4;

其中position是Vector2的实例

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

但是如果我使用矢量列表,我会做类似的事情:

position[i].x += 4

其中i是粒子索引,position是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(稳定)
我正在使用空安全。

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

谢谢!

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

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

如您所见,它实际上会创建一个新的向量对象,并且 return 在它填充数据之后。这意味着对此新矢量对象的任何修改都不会导致 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]
}