Не удается получить доступ к свойствам animate в Clutter - PullRequest
0 голосов
/ 11 января 2012

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

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

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

Предупреждение о беспорядке **: невозможно связать свойство '\ 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 Ответ

4 голосов
/ 11 января 2012

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

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

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

...