Progression Forum
9月 03, 2010, 02:36:12 午前 *
ようこそゲストさん。まずは、ログインするか、ユーザ登録してください。
アクティべーションメール送られて来ませんでしたか?

ユーザ名、パスワード、クッキー保持期間を入力してログインして下さい。
お知らせ:
 
   ホーム   ヘルプ 検索 ログイン 登録  
ページ: [1]
  印刷  
投稿者 スレッド: Load系のコマンド(LoadURL、LoadSound等)で読み込んだデータをクラス内のインスタンス変数に参照させるにはどうしたらよいでしょうか?  (参照数 2031 回)
sakusan393
初心者
*
投稿: 6



プロフィールを見る
« 投稿日:: 1月 06, 2010, 04:57:16 午後 »

お世話になっております。
題記の件で、質問させてください。

Load系のコマンドで読み込んだデータを受け取るには、this.latestDataを利用した以下のような手順が定石かと思っています。
コード:
new LoadSound(new URLRequest("./sound.mp3"))
,function(){
    trace(this.latestData);//出力:[object Sound]
}

ここで読み込んだsoundオブジェクトをクラスのインスタンス変数に参照させたく以下のようなコードを書きました。

コード:
package  {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import jp.progression.commands.media.DoSound;
import jp.progression.commands.display.*;
import jp.progression.commands.lists.*;
import jp.progression.commands.net.*;
import jp.progression.commands.tweens.*;
import jp.progression.commands.*;
/**
* @author 393
*/
public class Test extends Sprite{
private var _sound:Sound;
static private var s:Sound;
private var number:int = 0;

public function Test() {

var slist:SerialList = new SerialList();
slist.addCommand(
new LoadSound(new URLRequest("./sound.mp3"))
,function(){
trace(this.latestData);
_sound = Sound(this.latestData);
trace("_sound : " + _sound);
Test.s = this.latestData;
new DoSound(_sound).execute();
number = 100;
}
,new SerialList(null
,new Trace("sound : " +_sound)//出力:null(latestDataの中身が入っていてほしい)
,new Trace("s : " +Test.s)//出力:null(latestDataの中身が入っていてほしい)
,new Trace("number : " +number)//出力:0(100となってほしい)
)
);
slist.execute();
}
}
}

読み込んだLoadSoundで読み込んだデータを、インスタンス変数_soundで保持したいのですが、上手くいきませんでした。
クラス変数ならばと、Test.sでの保持も試みましたが、こちらも上手くいきませんでした。
function(){}内でthisのスコープが変わってるせいだと思うのですが、こういった場合はどのようにして参照させたらよろしいでしょうか?

ご助言、よろしくお願い致します。
IP記録
matsumos
初心者
*
投稿: 2


プロフィールを見る
« 返信する #1 投稿日:: 1月 06, 2010, 05:36:45 午後 »

> sakusan393 さん

Load系のコマンドで読み込んだデータについては、getResourceById を使うのが便利です。
コード:
new LoadSound(new URLRequest("./sound.mp3"))
,function(){
    trace(getResourceById( "./sound.mp3" ));//出力:[object Sound]
}

ふたつめのほうは、以下のような感じで期待通りの動きになると思います。
コード:
package  {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import jp.progression.commands.media.DoSound;
import jp.progression.commands.display.*;
import jp.progression.commands.lists.*;
import jp.progression.commands.net.*;
import jp.progression.commands.tweens.*;
import jp.progression.commands.*;
import jp.progression.data.getResourceById;
/**
* @author 393
*/
public class Test extends Sprite{
private var _sound:Sound;
static private var s:Sound;
private var number:int = 0;

public function Test() {

var slist:SerialList = new SerialList();
slist.addCommand(
new LoadSound(new URLRequest("./sound.mp3"))
,function():void{
trace(this.latestData);
_sound = Sound(this.latestData);
trace("_sound : " + _sound);
Test.s = this.latestData;
new DoSound(_sound).execute();
number = 100;
}
,function():void{
new SerialList( null
,new Trace("sound : " + _sound)//出力:null(latestDataの中身が入っていてほしい)
,new Trace("s : " +Test.s)//出力:null(latestDataの中身が入っていてほしい)
,new Trace("number : " +number)//出力:0(100となってほしい)
).execute();
}
);
slist.execute();
}
}
}
IP記録
sakusan393
初心者
*
投稿: 6



プロフィールを見る
« 返信する #2 投稿日:: 1月 07, 2010, 09:20:25 午前 »

>matsumosさん

早速のご回答ありがとうございまっす!
期待通りのうごき、確認できました!
あとgetResourceByIdなんてものもあったのですねー
こちらも調べて使ってみたいと思いまっす。
どうもありがとうございました!!
IP記録
nium
管理人
住民メンバー
*****
投稿: 277


プロフィールを見る
« 返信する #3 投稿日:: 1月 07, 2010, 09:28:31 午前 »

matsumos さんの方法でも問題ありませんが、追加した DoSound コマンドなどの実行時間も含めて、親の SerialList の完了タイミングとしたい場合、個別に実行してしまうと全てバラバラとなってしまいます。

そういった場合には、insertCommand() で動的にコマンドを追加する方法を使うと、コマンドの処理結果を踏まえて、その後の処理を条件に応じて変更することが可能です。

コード:
package  {
import flash.display.Sprite;
import flash.media.Sound;
import flash.net.URLRequest;
import jp.progression.commands.media.DoSound;
import jp.progression.commands.display.*;
import jp.progression.commands.lists.*;
import jp.progression.commands.net.*;
import jp.progression.commands.tweens.*;
import jp.progression.commands.*;
import jp.progression.data.getResourceById;
/**
* @author 393
*/
public class Test extends Sprite{
private var _sound:Sound;
static private var s:Sound;
private var number:int = 0;

public function Test() {

var slist:SerialList = new SerialList();
slist.addCommand(
new LoadSound(new URLRequest("./sound.mp3"))
,function():void{
trace(this.latestData);
_sound = Sound(this.latestData);
trace("_sound : " + _sound);
Test.s = this.latestData;

number = 100;

this.parent.insertCommand(
new DoSound(_sound),
new SerialList( null
,new Trace("sound : " + _sound)//出力:null(latestDataの中身が入っていてほしい)
,new Trace("s : " +Test.s)//出力:null(latestDataの中身が入っていてほしい)
,new Trace("number : " +number)//出力:0(100となってほしい)
)
);
}
);
slist.execute();
}
}

ポイントとしては、コマンドの場合「値の指定タイミング」と「実行タイミング」にズレが生じてしまうため、実行結果を使った処理をするには、動的な変更が必要となる点です。
IP記録
sakusan393
初心者
*
投稿: 6



プロフィールを見る
« 返信する #4 投稿日:: 1月 11, 2010, 05:54:09 午後 »

ご回答ありがとうございますー

ははぁー、こういう場合にinsertCommand()を使えば良いということなのですね。
またひとつ勉強になりました!
ありがとうございまっす!!
IP記録
ページ: [1]
  印刷  
 
ジャンプ先:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!