无法访问Clutter中的animate-properties

时间:2012-01-10 23:47:00

标签: animation vala clutter

我试图在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);

为什么所有实际存在的属性都会转变为一些混乱,我该怎么做才能让它工作?

1 个答案:

答案 0 :(得分:4)

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

至于为什么你会看到你所存在的属性的行为,我的猜测是它与2是(32位)整数和2.0是(64位)这一事实有关双。这简化了一些事情,我不知道你对C有多少经验(可能不是很多,因为这是某种来自动态类型语言的错误),但...... Clutter(嗯,va_arg)需要一个double,因此它会解析64位数据,但是你只提供了32位,所以包含下一个参数的前32位(NULL)。现在,当它开始尝试解析下一个参数时,它从错误的位置开始(32位进入参数),所以你得到剩余的NULL和部分垃圾发生在堆栈上......毫无疑问,这并不恰好是32位的0,所以当Clutter测试看它刚刚读取的值== NULL时它不是,而Clutter认为它已被赋予指针以null结尾的字符数组(这是字符串在C中的表示方式)。它读取该位置的数据,恰好是\ x83 \ xec \ u0014 \ x00c \ xc1e \ xa1 \ u000c,并检查是否存在具有该名称的属性。没有,所以它会发出您看到的错误消息。

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