Flex

Ads

FAQ

SharedObject

リモートSharedObjectに値を設定(so.data.foo=5;)しても更新されない

リモードSharedObjectの場合は data プロパティに値を設定するのではなく、setProprty メソッドを使わないと更新が伝わらないようです。

var so:SharedObject = SharedObject.getRemote(...);
so.data.foo = 5; //これはリモートに伝わらない
so.setProperty("foo", 5); //これはリモートに伝わる

取得の場合はリモートもローカルと同じで以下のように取得できます。

foo = so.data.foo;

SharedObject は getLocal() で取得したものも getRemote() で取得したものもどちらも SharedObject クラスの皮を被っていますが内部の実装が違います。大きな違いが setProperty() 及び setDirty() メソッドです。

  • ローカルの場合はこれらを意識せず data プロパティの操作をするだけで問題ないです。
  • リモートの場合は値のセットに注意が必要です。
    so.data.foo = bar; //これは data.foo の値をセットしますが、それをサーバに伝えません
    so.setDirty('foo'); //これはfooプロパティが変わったということをサーバに伝えます
    so.setPrperty('foo', bar); //これは data.foo に値をセットした後に、それをサーバに伝えます。
    setProperty() は data のプロパティに値を設定するのと同時に setDirty() も行う関数という理解でいいと思います。 しかも常に setDirty() するわけではなく、新たに設定した値が本々のそのプロパティの値と変わったときのみ setDirty() してくれるようです。

おそらくこれらはパフォーマンスの為の仕様でしょう。

しかしサンプルコード等ではみんな普通に so.data.foo に直接セットしているものばかりなのが謎ですが、 巷で見るサンプルコードはまだ ActionScript2 の例が多いので、 実はこの注意点は ActionScript3 固有の話で、ActionSctipr2 以前では setDirty 的な考えがなかったのかもしれません*1

SyncEvent#changeList には何が入っているのか?

ヘルプのSyncEvent#changeListを見ても、

配列のステータスを記述するプロパティを持つ配列です。

と書いてあるだけで配列の中身がどんなオブジェクトなのかが分かりません。 *2

for文でchangeListやその中身のプロパティを回したりして調べてみたところ changeList には以下のプロパティを持った Object が入っているようです。

name
変更されたSharedObjectのdataのプロパティ名
code
以下のどれかの値。
 success: 新たなプロパティとして設定された。
 reject: プロパティの設定を拒否された。
 change: 既存プロパティの値が変更された。
 delete: プロパティが削除された。
 clear: SharedObject がクリア(破棄)された。
  • 上記5つの code のうち reject と clear はリモートSharedObject特有のものでローカルのSharedObjectのSyncEventでは発生しません。
  • codeがclearの場合はnameプロパティが設定されないぽい。

サウンド

soundTransform.volume を設定してもボリュームが変わらない。

Microphone, Sound, NetStream クラスなど音を鳴らすオブジェクトには soundTransform というプロパティがあり、これの volume プロパティでボリュームが変更できます。 しかし使い方にクセがあるので注意が必要です。

以下のように volume プロパティを直接設定したくなりますが、このコードではボリュームは変わりません。

//これだとボリュームが変わらない
soundSource.soundTransform.volume = 0.5;

ボリュームを変えるには以下のように soundTransform プロパティを丸ごと再設定する必要があるようです。

//以下のようにすればボリュームが変わる
var transform:SoundTransform = soundSource.soundTransform;
transform.volume = 0.5;
soundSource.soundTransform = transform;

これは volume 以外の pan や leftToLeft, leftToRight, rightToLeft, rightToRight のプロパティにも同様のことが言える為、これらのプロパティを変更したい場合は上記の volume 変更のように soundTransform を一度別変数に取り出して必要な設定をした後に再設定する必要があります。

ちなみに一度変数に取り出す手間を省いて、以下のようなコードでもいけないかと試してみましたがダメでした。

//このやり方でもボリュームは変わらない
soundSource.soundTransform.volume = 0.5;
soundSource.soundTransform = soundSource.soundTransform;

恐らく soundTransform プロパティを設定するというイベントを契機に実際のボリュームが変更されるてるんじゃないかと思うんがが、3番目の方法でもダメなので詳細は不明。

SoundTransformのヘルプの例 でもサラッと正解の手順で書いてあるのですが、この手順以外では変更が反映されないということはどこにも書いていないので罠にはまりがちです。


*1 昔の事情は調べてません
*2 FMS2のサーバサイドアクションスクリプトのドキュメントのSharedObject.onSynkにそれらしい情報を見つけることができました。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-03-01 (木) 14:50:36 (4305d)