0

Clutterでアクターをアニメートしようとしていますが、存在するプロパティに入ると、問題が発生します。

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-警告**:プロパティ'thisdoesntwork'をバインドできません:タイプ'ClutterTexture'のオブジェクトにはこのプロパティがありません

この代替アプローチを試してみると、まったく同じ問題が発生します。

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

実際に存在するすべてのプロパティがいくつかの混乱に変換されるのはなぜですか?これを機能させるにはどうすればよいですか?

4

1 に答える 1

4

値には 2 ではなく 2.0 を使用する必要があります。2 は整数、2.0 は double です。Vala は可変引数メソッドに対して型安全性を提供できないため、注意が必要です。

存在するプロパティの動作が見られる理由については、2 が (32 ビット) 整数であり、2.0 が (64 ビット) double であるという事実に関係していると思います。これは物事を少し単純化したものであり、あなたが C の経験をどれだけ持っているかはわかりません (動的型付け言語から来た人が犯すような間違いなので、おそらくそれほど多くはないでしょう)、しかし... クラッター ( va_arg) は double を想定しているため、64 ビットのデータを解析しますが、32 ビットしか指定していないため、次の引数 (NULL) の最初の 32 ビットが含まれます。さて、次の引数を解析しようとすると、間違った場所 (引数の 32 ビット) から開始されるため、残りの NULL と、たまたまスタックにあったガベージの一部が取得されます... 当然のことながら、それはしません たまたま 32 ビットの 0 であるため、Clutter が読み取った値が == NULL であるかどうかをテストすると、そうではなく、Clutter は、null で終わる文字の配列へのポインターが与えられたと考えます (これはどのように文字列は C) で表されます。その場所 (たまたま \x83\xec\u0014\x89\xc6e\xa1\u000c) のデータを読み取り、その名前のプロパティがあるかどうかを確認します。存在しないため、見たエラー メッセージが出力されます。

ここで、存在しないプロパティの使用に切り替えると、Clutter は引数 (プロパティの名前) を解析し、(上記の 2 番目のプロパティの場合と同様に) 存在しないことに気付き、エラー。

于 2012-01-11T04:07:51.193 に答える