0

我正在尝试为 Clutter 中的演员设置动画,但是当我输入一个存在的属性时,出现了问题。

actor.animate( AnimationMode.LINEAR, 400, scale_x:2);

给我这个错误

Clutter-WARNING **:无法绑定属性 '\x83\xec\u0014\x89\xc6e\xa1\u000c':'ClutterTexture' 类型的对象没有此属性

对我来说看起来像 Unicode 字符。但是,当我输入一个不存在的属性时

actor.animate( AnimationMode.LINEAR, 400, thisdoesntwork:2);

我得到一个更有意义的错误

Clutter-WARNING **:无法绑定属性“thisdoesntwork”:“ClutterTexture”类型的对象没有此属性

当我尝试这种替代方法时,我遇到了完全相同的问题:

actor.animate( AnimationMode.LINEAR, 400, "scale-x", 2);

为什么所有实际存在的属性都变成了一些乱七八糟的东西,我该怎么做才能让它发挥作用?

4

1 回答 1

4

您应该使用 2.0 作为值,而不是 2。2 是整数,2.0 是双精度数。Vala 不能为可变参数方法提供类型安全,所以你必须小心。

至于为什么你会看到你存在的属性的行为,我的猜测是它与 2 是(32 位)整数和 2.0 是(64 位)双精度的事实有关。这稍微简化了一些事情,而且我不知道您对 C 有多少经验(可能不是很多,因为这是来自动态类型语言的人会犯的那种错误),但是......混乱(好吧,va_arg) 需要一个双精度数据,因此它解析 64 位数据,但您只提供了 32 位,因此包括下一个参数 (NULL) 的前 32 位。现在,当它开始尝试解析下一个参数时,它从错误的位置(参数中的 32 位)开始,所以你得到了 NULL 的剩余部分以及堆栈上碰巧发生的任何垃圾的一部分......不出所料,那不 t 恰好是 0 的 32 位,所以当 Clutter 测试它刚刚读取的值是否 == NULL 它不是并且 Clutter 认为它被赋予了一个指向以 null 结尾的字符数组的指针(这就是字符串用 C) 表示。它读取该位置的数据,恰好是 \x83\xec\u0014\x89\xc6e\xa1\u000c,并检查是否存在具有该名称的属性。没有,因此它会发出您看到的错误消息。

现在,如果您切换到使用不存在的属性,Clutter 将解析参数(属性的名称),注意它不存在(就像上面的第二个属性一样),并发出一个错误。

于 2012-01-11T04:07:51.193 回答