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]
}
我正在开发一款游戏并使用 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]
}