Не удается получить доступ к свойствам анимации в Clutter

Я пытаюсь анимировать актера в Clutter, но когда я ввожу существующее свойство, что-то идет не так.

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

выдает мне эту ошибку

Clutter-WARNING **: Невозможно связать свойство '\x83\xec\x89\xc6e\xa1 ': объекты типа 'ClutterTexture' не имеют этого свойства

Для меня это похоже на Unicode-символы. Однако, когда я ввожу свойство, которое НЕ существует

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

Я получаю ошибку, которая имеет гораздо больше смысла

Clutter-WARNING **: Невозможно связать свойство thisdoesntwork: объекты типа ClutterTexture не имеют этого свойства.

У меня возникает точно такая же проблема, когда я пробую этот альтернативный подход:

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

Как получается, что все свойства, которые на самом деле существуют, превращаются в какой-то беспорядок, и что я могу сделать, чтобы это заработало?


person professorsloth    schedule 10.01.2012    source источник


Ответы (1)


Вы должны использовать 2.0 для значения, а не 2. 2 — целое число, 2.0 — двойное. Vala не может обеспечить типобезопасность для методов с переменным числом аргументов, поэтому нужно быть осторожным.

Что касается того, почему вы видите такое поведение для существующих свойств, я предполагаю, что это связано с тем фактом, что 2 — это (32-разрядное) целое число, а 2.0 — это (64-разрядное) двойное число. Это немного упрощает вещи, и я не знаю, сколько у вас опыта работы с C (вероятно, не так много, поскольку это ошибка, которую может совершить кто-то, пришедший из языка с динамической типизацией), однако... Беспорядок ( ну, va_arg) ожидает двойное значение, поэтому он анализирует 64 бита данных, но вы предоставили только 32 бита, поэтому включаются первые 32 бита следующего аргумента (NULL). Теперь, когда он начинает пытаться разобрать следующий аргумент, он начинает с неправильного места (32 бита в аргументе), поэтому вы получаете остаток NULL и часть того мусора, который оказался в стеке... Неудивительно, что это не так уж случилось, что это 32-битные нули, поэтому, когда Clutter проверяет, является ли только что прочитанное значение == NULL, это не так, и Clutter думает, что ему был дан указатель на массив символов с нулевым завершением ( именно так строки представлены в C). Он считывает данные в этом месте, которое случайно оказалось \x83\xec\x89\xc6e\xa1 , и проверяет, есть ли свойство с таким именем. Нет, поэтому он выдает сообщение об ошибке, которое вы видели.

Теперь, если вы переключитесь на использование несуществующего свойства, Clutter проанализирует аргумент (имя свойства), заметит, что оно не существует (так же, как это было со вторым свойством выше), и выдаст сообщение ошибка.

person nemequ    schedule 11.01.2012