とある日の妄想

- FLASH練習(11) LoadVarsオブジェクト -

何気ない日常にふと思いついた世迷言をつづるブログ

 

rss-feedRSSフィード

■携帯版はこちら
http://blog.toaruhi.net/m/

携帯サイトQRコード

ブログ内検索

キーワード

 

※検索エンジンで検索した情報が見当たらない場合にご利用ください。

新着記事

カテゴリ一覧

外部リンク

創作物の規制/単純所持規制に反対する請願署名市民有志

作者について

2007年03月16日(木)
FLASH練習(11) LoadVarsオブジェクト
FLASH
ADVエンジンをActionScriptで実装すべくコーディング開始。
シナリオをスクリプト化して、ActionScriptで解析して実行する。
AS内にテキストいっぱい書く作り方とかすると、だるいしデバッグ大変だし。
ASはクラスは外部ファイルに定義しなくちゃいけないんだね。

シナリオスクリプトはLoadVarsオブジェクトを使って読み込むことにした。
変数を読み込むためのオブジェクトらしく、外部テキストに定義した変数を
インスタンス変数として読み込めるようだ。
本来は、CGIとかとのやり取りを想定したものなんだろうな。


でも俺がここでやりたいのは、単純に外部ファイルのテキストを読み込むこと。
その場合は、LoadVarsオブジェクトの、onDataハンドラを使えばいい。
読み込みが完了すると呼び出され、成功なら引数にデータが入る。

(例1)

function readFile(fpath) {


  var lv = new LoadVars();

  // 読み込み完了時の処理を定義
  lv.onData = function (str) {

    if (str != undefined) {
  
      trace(str);

    } else {

      trace("error: no data");

    }
  
  }

  
  lv.load(fpath);

}


で、今回は、クラスADVSystemの中でLoadVarsオブジェクトを生成し、
onDataハンドラ内でシナリオスクリプトを解析して、解析完了後に
シナリオ開始メソッドを呼び出す、という動作をさせようとした。

ここでちょっとしたつまずきが。

クラス内で生成したLoadVarsインスタンスのonDataハンドラ内では、
thisがLoadVarsインスタンスをさしてしまう。
そのため、AdvSystemのメソッドやインスタンス変数に通常の方法では
アクセスできなくなってしまったのだ。

(例2)

var adv = new ADVSystem();

adv.readFile("test.txt");

-------------------------------------------------

class ADVSystem {
  
  // 適当な変数(プロパティ)
  var testData;
  
  // 適当なメソッド
  function test() {

    trace("読み込み結果:" + this.testData);

  }

  function readFile(fpath) {

    
    var lv = new LoadVars();
    
    lv.onData = function (str) {

      if (str != undefined) {
        
        // thisはADVSystemではなくlvをさしている!
        this.testData = str;
        // 当然メソッドも呼び出せない。
        this.test();
      
      }
    }

    lv.load(fpath);

  }
}


_parent.testDataなどとしてもうまくいかないようだ。
いろいろ調べたところ、次のような解決策があった。
    
(例3)


var adv = new ADVSystem();

adv.readFile("test.txt");

-------------------------------------------------

class ADVSystem {
  
  // 適当な変数(プロパティ)
  var testData;
  
  // 適当なメソッド
  function test() {

    trace("読み込み結果:" + this.testData);

  }

  function readFile(fpath) {

    
    var lv = new LoadVars();

    // オブジェクトをlvのプロパティに追加
    lv.advsys = this;
    
    lv.onData = function (str) {

      if (str != undefined) {
        
        // 変数にアクセス可能
        this.advsys.testData = str;
        // メソッドも呼び出せる。
        this.advsys.test();
      
      }
    }

    lv.load(fpath);

  }
}



とりあえずこれで、onDataイベント処理でテキスト解析ができるようになった。
ActionScriptってプロパティやメソッドの扱いが柔軟なんだね。

柔軟すぎて困るときもあるけど。
メソッド名ミスタイプしててもエラーにならなかったりとか…。


解析は結構大変だ。
ActionScript(2.0)は文字列処理がかなり弱い。
trimも、正規表現も、文字列置換すらない。
きびしー…けどまぁ、substringとかindexOfでなんとかしてみた。

ADVエンジンは、ちょっと前進。
でもJavaScriptのときもそうだったけど、エンジンよりシナリオ作らないとな…。
あと絵も。

プログラムはほんと、どうにでもなるんだよね。





トラックバックURL

コメント一覧

全2件中1〜2件を表示
1 : donta 2007-03-16 16:54:54
面白そうですね。
もしかしてテキストデータを入れ替えるだけで、
プログラム組めなくても、Flash持ってなくても、
ADVが作れるようになるんでしょうか?
オンラインでシナリオを投稿できたりとか。
2 : 管理人 2007-03-16 19:57:24
>dontaさん
今作ってるのは画面の見た目の処理(ムービーとか)を
Flash側で作るイメージでやってるのでFLASHはいりますねw

画像レイヤを用意して、そこに表示するものを指定するような
つくりにすればWeb投稿とかもできそうです。
前作ってたのはそんな感じでしたけど挫折しましたw

ゲームのデータをいじって楽しめるようなコンテンツは
提供できたらいいな〜と思ってます。

コメントを投稿する

名前
コメント


Dragon Quest 6

龍が如く4

FF13

THIS IS IT

ときめきメモリアル4

鉄拳6