我正在开发一个游戏,并使用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;
}
正如您所看到的,它实际上会创建一个新的矢量对象,并在填充数据后返回该对象。这意味着对这个新矢量对象的任何修改都不会导致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]
}