- ベストアンサー
ボタンクリックで画像を表示
質問です。 ボタンをクリックして同じFlash内に画像を出したいのですが うまくいきません。 on (release) { tellTarget ("./mem") { gotoAndStop("kk"); } } クリックするとmemレイヤーのkkというムービークリップを 出すように設定したつもりなのですが、多分このプログラムが 間違っていると思うのですが、どこが間違っているのでしょうか。 教えてください。 お願いいたします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
プログラム(スクリプト)も間違っていますが, それ以前に, プログラム(スクリプト)が間違っていると言うより, Flash の理解&認識が間違っていると思います。 どこから説明すれば良いのでしょうか? よくわかりませんが,スクリプトの方から説明します。 まず確認ですが, 書かれていらっしゃるスクリプトは現在普通は使いません。 使うときは Flash Lite 1.0 か 1.1 (携帯用 Flash)を作成するときのみに使用するスクリプトです。 Flash Lite 1.0 か 1.1 用の SWF を作成しようとされているとういうことにしておきます。 tellTarget はその名の通り 「ターゲットに命令」 という意味のスクリプトで, その ("") 内のターゲット名の前にパス(ターゲットパス)を付けることができます。 しかし ./ というパスは存在しません。 HTML での ./ は,この階層(フォルダ)という意味になりますから, そういう意味で書くとするとスクリプトは次のように訂正されます。 on (release) { tellTarget ("mem") { gotoAndStop("kk"); } } 「この階層」を意味するパスは特にないので,上のように ("mem") になります。 メインのタイムライン ├ムービークリップA └ムービークリップB └ムービークリップX メインのタイムラインから(メインのタイムラインにあるボタンから), ムービークリップAに命令をするときは, tellTarget ("ムービークリップA") となります。 上の表し方は相対パスです。 絶対パスで表すとつぎのようになります。 tellTarget ("/ムービークリップA") メインのタイムラインから(メインのタイムラインにあるボタンから), ムービークリップBの中のムービークリップXに命令をするときは, tellTarget ("ムービークリップB/ムービークリップX") となります。 上の表し方は相対パスです。 絶対パスで表すとつぎのようになります。 tellTarget ("/ムービークリップB/ムービークリップX") ムービークリップX のタイムラインから(ムービークリップXのタイムラインにあるボタンから), ムービークリップBに命令をするときは, tellTarget ("../ムービークリップB") となります。 上の表し方は相対パスです。 絶対パスで表すとつぎのようになります。 tellTarget ("/ムービークリップB") ムービークリップX のタイムラインから(ムービークリップXのタイムラインにあるボタンから), ムービークリップAに命令をするときは, tellTarget ("../../ムービークリップA") となります。 上の表し方は相対パスです。 絶対パスで表すとつぎのようになります。 tellTarget ("/ムービークリップA") ほぼHTMLのファイルパスに近いとは思いますが, ./ はありません。 ==================== 上の説明で, ご質問内容と根本的に食い違っているところがあると思います。 上のようにスクリプトを訂正しても, > クリックするとmemレイヤーのkkというムービークリップを > 出すように設定したつもり という意味には決してならないのです。 on (release) { // ↑ボタンをクリックしたとき tellTarget ("mem") { // ↑同じタイムラインにあるムービークリップ men に命令 gotoAndStop("kk"); // ↑kk というフレームラベルのフレームにジャンプ } } という意味です。 tellTarget の ターゲット は ムービークリップ です。 決してレイヤーではありません。 gotoAndStop("kk"); これも, gotoAndStop で 引数が1つの場合は, 引数の表すものは フレーム数 か フレームラベル です。 引数に "" が付いているので,これはフレームラベルという意味に解釈されます。 つまり, on (release) { tellTarget ("ムービークリップ") { gotoAndStop("フレームラベル"); } } です。 決して, on (release) { tellTarget ("レイヤー") { gotoAndStop("ムービークリップ"); } } という意味にはなりません。 というわけで, プログラム(スクリプト)が間違っていると言うより, Flash の理解&認識が間違っていると思うわけです。 レイヤーはムービークリップなどの上下関係です。 オブジェクトではありません。 レイヤーに命令することなどそもそもできません。 山にの中を走っている車があるとします。 車には(車に乗っている人には)右へ曲がれとか下へ下れとか命令ができますよね。 しかし, 山の標高には命令を出せません。 レイヤーとはそういうものです。 車の上下の位置・地面のようなものです。 ここのところ不思議なのですが, たてつづけに同じような間違った認識をされていらっしゃる方を見かけました。 QNo.3655406 各レイヤーに違ったscriptを設定する。 http://okwave.jp/qa3655406.html QNo.3670869 レイヤーの再生をコントロールする http://okwave.jp/qa3670869.html 以前はそういう方は滅多に見かけなかったのですが, ごく最近になってなぜかそういう方が増えています。 不思議です。 あと,上で書いたのは Flash Lite の構文です。 今,普通の ActionScript1.0 とか 2.0 では, tellTarget は使わず,次のように書きます。 on (release) { this.mem.gotoAndStop("kk"); } もしくは this. を省略して,次のように書きます。 on (release) { mem.gotoAndStop("kk"); } tellTarget を使うよりずっと楽です。 しかしどっちにしても ムービークリップ に対して命令を出す文です。 gotoAndStop はボタンに対しては命令できません。 テキストフィールドに対しても,グラフィックシンボルのインスタンスに対しても命令できません。 ○○.gotoAndStop() はムービークリップのみに対しての命令(メソッド)です。 ○○.gotoAndStop() ○○.gotoAndPlay() ○○.stop() ○○.play() などなど..., これらムービークリップに対する命令をムービークリップクラスのメソッドと言います。 レイヤークラスというものは存在しませんし,レイヤークラスのメソッドもありません。