性格いい人が優勝

Flash Lite 1.1を使って2つのMCを制御したいのですが、うまくいきません。

2つのMCに「hanabira1」と「hanabira2」のインスタンス名をそれぞれ設定し、このMCをそれぞれスクリプトで動かそうと以下のプログラムを入力しました。

for (i = 1; i < 2; i++) {
hana = "hanabira" add i;
hana._rotation += 5;
}

これでパブリッシュをしたのですが、
【次のコンテンツに問題があります : 5 ~ SWF データ内の ActionScript が無効です。】
というエラー文が表示されて動作してくれませんでした。

繰り返し関数を用いて、MCを

1.「hanabira」+「数値」で文字列の結合
2.結合した文字列と同じMCを制御
3.「数値」に1を足して、また1番を繰り返す

というのをやりたいのですが、解決方法をご存知の方がおられましたら、是非ともご教授をお願いしたく思います。
よろしくお願いします、

A 回答 (1件)

ステージ上 に 「hanabira1」 と 「hanabira2」 というインスタンス名のムービークリップがあるものとします。



まずタイムラインを2フレームにします。
花びらを置いたフレームはそのままで,
スクリプトを書くレイヤーをそれぞれキーフレームに変換します 【図↓】。


少し現代風に書くのでしたら次のようにすると思います。

フレーム1
---------------------------------
for (i=1; i<=2; i++) {
eval("hanabira" add i)._rotation += 5;
}
---------------------------------

フレーム2
---------------
gotoAndPlay(1);
---------------


古い(本来の)書き方風にすると次のようになります。

フレーム1
----------------------------------------------
for (i=1; i<=2; i++) {
setProperty("hanabira" add i, _rotation, getProperty("hanabira" add i, _rotation)+5);
}
----------------------------------------------

フレーム2
---------------
gotoAndPlay(1);
---------------


1つ目のスクリプトの欠点はドットシンタックスによるターゲットパスの記述です。
Flash Lite 1.x ではスラッシュシンタックスによるターゲットパスを使うのが本来の書き方です。
上記の場合はドットシンタックスでも動くのですが,
場合によっては動作しないケースもあります。
スラッシュシンタックスに統一する方が混乱が少なくなると思います。


2つ目のスクリプトの欠点は「見慣れない」&「回りくどい」という点です。
Flash Lite 1.x 言語には,本来メソッドなどというものはなくて,関数でアクションを指定します。
つまりオブジェクトや値は関数の引数に入る場合がほとんどです。

// ターゲット(MC) の 指定プロパティ に値をセット
setProperty(ターゲット , プロパティ , 値)

// ターゲット(MC) の 指定プロパティ の値をゲット
getProperty(ターゲット , プロパティ)

この2つの組合せです。

 //setProperty(ターゲット, プロパティ, getProperty(ターゲット, プロパティ))
 setProperty("hanabira" add i, _rotation, getProperty("hanabira" add i, _rotation)+5);

形が Excel の関数に似ています。

 ' A1セルの値を文字列にしてその文字列の左から3文字を返す
 =LEFT(TEXT(A1,0),3)

関数ばかりなので,引数にぐちゃぐちゃ色んなものが入りこみます。
したがって長くて非常にわかりにくくなりがちですが,
こちらの方が Flash Lite 1.x の本来の書き方です。
getProperty で得られる値を変数化しておけば長くなるのはある程度解消されますが...。



また,間違った書き方だと思いますが,なぜか動作するものもあります。

フレーム1
----------------------------
for (i=1; i<=2; i++) {
tellTarget ("hanabira" add i) {
_rotation += 5;
}
}
----------------------------

フレーム2
---------------
gotoAndPlay(1);
---------------

tellTarget の使い方として意味的におかしいと思いますが,動くことは動きます。
(setProperty や getProperty が使えない ParaFla! 系ソフトはこれを使う)


とにかくどの場合にしても,
フレームを2フレームにして,フレーム1と2をグルグルループ再生させることで,
1フレーム進む時間ごとに毎回 5 どずつ回転させます。



しかし何にしても上のような方法をとると,
メインのタイムラインをフレーム3以降に進めることができなくなってしまいます。

メインのタイムラインをフレーム3以降に進めた上で,
上のようなスクリプトを随時動作させたい場合は,ムービークリップを使います。

ムービークリップの中に花びらを置いて,
ムービークリップ内のフレームをループさせて,
メインのタイムラインでは別のアニメーションを動かすようにするのが1つの方法です。

 メインのタイムライン
   └ムービークリップ
      ├hanabira1
      └hanabira2


また,
花びらはそのままで,
スクリプト記述用のムービークリップ(指令塔)を作成して,
そのムービークリップ(指令塔)内のフレームをループさせて,
メインのタイムラインに置いた花びらを回転さるのも1つの方法です。

 メインのタイムライン
   ├hanabira1
   ├hanabira2
   └ムービークリップ(指令塔)

その場合,
ムービークリップ(指令塔)内に書くスクリプト例【絶対パス】

ムービークリップ内フレーム1
----------------------------------------------
for (i=1; i<=2; i++) {
setProperty("/hanabira" add i, _rotation, getProperty("/hanabira" add i, _rotation)+5);
}
----------------------------------------------

ムービークリップ内フレーム2
---------------
gotoAndPlay(1);
---------------

ムービークリップ(指令塔)内に書くスクリプト例【相対パス】

ムービークリップ内フレーム1
----------------------------------------------
for (i=1; i<=2; i++) {
setProperty("../hanabira" add i, _rotation, getProperty("../hanabira" add i, _rotation)+5);
}
----------------------------------------------

ムービークリップ内フレーム2
---------------
gotoAndPlay(1);
---------------

"/hanabira" は "_root.hanabira" と同じ意味です。
"../hanabira" は "_parent.hanabira" と同じ意味です。

スラッシュシンタックスによるターゲットパスの表記は,HTML のリンクの表記と良く似ています。
ただし 「./ (同階層(this))」 はありません。
同階層はパスを無記入にします。
("./hanabira" という書き方はない。 "hanabira" にする。)
("./" という書き方はない。 "" にする。)


例えば指令塔を作らず,
「hanabira1」 や 「hanabira2」 内を2フレームにして,
自分自身を回転させる場合,
フレーム1 に書くスクリプトは次のようになります。

ムービークリップ内フレーム1
----------------------------------------------
setProperty("", _rotation, getProperty("", _rotation)+5);
----------------------------------------------

ムービークリップ内フレーム2
---------------
gotoAndPlay(1);
---------------

もし 「hanabira1」 と 「hanabira2」 が同じシンボルである場合,
「hanabira1」 と 「hanabira2」 は自動的に同じ構造を持つことになりますから,
こうすれば,そもそも for文 は不要になります。



長くなりましたが,
色々なケースでの色々な書き方を書きました。
「Flash Lite 1.1で、複数のM」の回答画像1
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
先ほど、BlurFiltanさんが教えてくれた通りに書き直したら動作できました。
ドットシンタックスだと動作しない場合があるっというアドバイスを受けて、for文ではなくsetPropertyとgetPropertyを用いたスクリプトで組み立てる事に決めました。

丁寧で詳細な回答に画像の送付まで、ご親切にありがとうございました!

お礼日時:2009/09/14 21:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!