Flash CS4での制作について質問です。

AS3.0設定でFlashファイル上に二つのリンクボタンを設定しました。(link_btn01/link_btn02)この1つに
function newWin(eventObject:Event):void{
var request:URLRequest=new URLRequest("http://www.villaangelica.to/next/index.html");
navigateToURL(request);
}
link_btn01.addEventListener(MouseEvent.CLICK, newWin);
と記述し、パブリッシュして確認すると問題なくリンクされます。ただ、link_btn02に同様のスクリプトを書き、link_btn01をlink_btn02に書き換えて確認すると、コンパイルエラーになってしまいます。複数のリンク設定は出来ないのでしょうか。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/09/27 21:28:47
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tukihatu No.3

回答回数180ベストアンサー獲得回数32

ポイント30pt

>異なるリンク先にしたい

関数を使いまわしつつ値だけ変数で渡してやればいいのですが、addEventListenerでは変数を基本渡せないのでこんな感じの動きができなかったと思います。

function newWin(data):void{
var request:URLRequest=new URLRequest(data);
navigateToURL(request);
}

link_btn01.addEventListener(MouseEvent.CLICK, newWin("url1"));
link_btn02.addEventListener(MouseEvent.CLICK, newWin("url2"));

こういった形にして変数を渡すのがいいと思います。

//URL設定
var objURL:Object = new Object();
objURL.link_btn01 = "url1";
objURL.link_btn02 = "url2";


function newWin(eventObject:Event):void{
var request:URLRequest=new URLRequest(objURL[event.currentTarget.name]);
navigateToURL(request);
}

link_btn01.addEventListener(MouseEvent.CLICK, newWin);
link_btn02.addEventListener(MouseEvent.CLICK, newWin);

currentTargetは便利なので良く使いますよ!

id:dics

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

この通りにやってみて、後ほど結果を書き込みます。

ありがとうございました。

2010/09/27 13:31:45

その他の回答3件)

id:tasklight No.1

回答回数323ベストアンサー獲得回数40

ポイント30pt

どのようなエラーメッセージが表示されるのですか?


同じ名前空間にlink_btn02が重複していませんか?

または、link_btn01を参照している部分があるのではありませんか?

id:dics

ありがとうございます。

エラーメッセージは以下の様なものです。

1021:関数の定義が重複しています。 function newWin(eventObject:Event):void{

5000:クラス'fl.core.ComponentShin'は'flash.display_MovieClip'をサブクラスとする必要があります。同じ型のライブラリシンボルにリンクしているためです。

5000:クラス'fl.controls.UIScrollBar'は'flash.display_MovieClip'をサブクラスとする必要があります。同じ型のライブラリシンボルにリンクしているためです。

…というもので、並列に配置してあるテキストエリアのスクロールバーの表示もおかしくなっています。

「同じ名前空間」とありますが、この2つ(link_btn01とlink_btn02)はレイヤは別にしてあります。

よろしくお願いいたします。

2010/09/25 13:55:18
id:tukihatu No.2

回答回数180ベストアンサー獲得回数32

ポイント30pt

コードの書く場所などに問題があるようですね。

関数の定義が重複している、というエラーは、function newWinが同じ階層に複数かかれていることを意味します。

root階層
function newWin~
~
}
link_btn01.addEventListener(MouseEvent.CLICK, newWin);

function newWin~
~
}
link_btn02.addEventListener(MouseEvent.CLICK, newWin);

こんなふうに書いてませんか?この場合function newWinは二度書く必要はありません。

root階層
function newWin~
~
}
link_btn01.addEventListener(MouseEvent.CLICK, newWin);
link_btn02.addEventListener(MouseEvent.CLICK, newWin);

>並列に配置してあるテキストエリアのスクロールバーの表示もおかしくなっています。

FLASHではスクリプトエラーがでると他のASもとまってしまいます。現在発生しているエラーが解消すれば動くようになると思います。


複数関数なんて書いてないよ!という場合は、関数をどの階層に書いているかを教えてください。(といってもlink_btn01.addEventListenerとしているのでボタン内に書いているとは思えませんけど)

id:dics

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

早速試してみましたところ、コンパイルエラーの表示は出なくなりました。

しかしながら、異なるリンク先にしたいと思いますので、その場合はどこへどのようにリンク先を設定すればよろしいでしょうか。(現状では同じリンク先になってしまいます function newWin~以下の記述が共通なので、当然といえばそうなのですが)

ご教示の程、よろしくお願いいたします。

2010/09/25 15:12:48
id:tukihatu No.3

回答回数180ベストアンサー獲得回数32ここでベストアンサー

ポイント30pt

>異なるリンク先にしたい

関数を使いまわしつつ値だけ変数で渡してやればいいのですが、addEventListenerでは変数を基本渡せないのでこんな感じの動きができなかったと思います。

function newWin(data):void{
var request:URLRequest=new URLRequest(data);
navigateToURL(request);
}

link_btn01.addEventListener(MouseEvent.CLICK, newWin("url1"));
link_btn02.addEventListener(MouseEvent.CLICK, newWin("url2"));

こういった形にして変数を渡すのがいいと思います。

//URL設定
var objURL:Object = new Object();
objURL.link_btn01 = "url1";
objURL.link_btn02 = "url2";


function newWin(eventObject:Event):void{
var request:URLRequest=new URLRequest(objURL[event.currentTarget.name]);
navigateToURL(request);
}

link_btn01.addEventListener(MouseEvent.CLICK, newWin);
link_btn02.addEventListener(MouseEvent.CLICK, newWin);

currentTargetは便利なので良く使いますよ!

id:dics

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

この通りにやってみて、後ほど結果を書き込みます。

ありがとうございました。

2010/09/27 13:31:45
  • id:dics
    済みません、コメントの返信に文字化けが発生してしまいました。
    「1021:」の右は「関数」です。「5000:」の右は「クラス」です。
  • id:dics
    tukihatu様
    この「//URL設定」はどこの部分へ書き込めばよろしいでしょうか。
  • id:dics
    tukihatu様
    お書きになられたスクリプト通りに(一部リンクさせたいURLを入れて)asキーフレームに入れてみたのですが、上手く動作しません。
    「1120:未定義のプロパティeventへのアクセスです」コンパイルエラーになってしまいます。
    解決策はありますでしょうか。
  • id:dics
    ネット上で調べましたところ、以下の様なスクリプトで解決できました。

    1つ目のボタン:
    link_btn01.addEventListener(MouseEvent.CLICK,Click01);
    function Click01(evt:MouseEvent):void{
    var urlReq:URLRequest=new URLRequest("sakuya.html");
    navigateToURL(urlReq,"_self");
    }

    2つ目のボタン:
    link_btn02.addEventListener(MouseEvent.CLICK,Click02);
    function Click02(evt:MouseEvent):void{
    var urlReq:URLRequest=new URLRequest("index.html");
    navigateToURL(urlReq,"_self");
    }

    これらをそれぞれボタン画像直上のasレイヤへ書き、コンパイルエラーもなくパブリッシュすることが出来、HTML上に配置して確認したところ、意図通りにリンクする事が出来ました。
    tasklight様、tukihatu様、ご回答ありがとうございました。
    これにて質問は閉じさせていただきます。
  • id:tukihatu
    あーごめんなさい!eventObject:Eventじゃないですよねw
    最終形はこうなります
    ============
    //URL設定
    var objURL:Object = new Object();
    objURL.link_btn01 = "sakuya.html";
    objURL.link_btn02 = "index.html";


    function newWin(event:MouseEvent):void{
    var request:URLRequest=new URLRequest(objURL[event.currentTarget.name]);
    navigateToURL(request,"_self");
    }

    link_btn01.addEventListener(MouseEvent.CLICK, newWin);
    link_btn02.addEventListener(MouseEvent.CLICK, newWin);

    ============
    上の解決したコメントのように、関数を二つ書くのも手なのですが、ボタンが何個も何個も出てくる場合はたくさん関数を書かなくてはならず不便なので、同じ処理の関数はなるべくまとめるとGOOD、ということだけ覚えておいたほうがいいです。
    (提示させてもらったスクリプトだと、ボタンが増えた場合はobjURL.link_btn03とlink_btn03.addEventListener(MouseEvent.CLICK, newWin);を増やせばOKなので2行で済む、とか)
  • id:dics
    tukiharu様
    フォローのコメントありがとうございます。
    確かに仰るとおり、よりシンプルにまとめておいた方がよい、という事ですね。覚えておく事にします。

    ところでついでながら、もう一つ質問させていただきます。

    マウスオーバーの設定が上手く反映しないのも、スクリプトが原因でしょうか。
    ボタンそれぞれに、シンボル/ボタン上で「オーバー」のフレームに色が違う画像を入れて、マウスオーバー時に表示される様にした積もりなのですが、「制御/シンプルボタンを有効にする」にチェックを入れてFlashの画面上ではマウスオーバーで画像が切り替わるのですが、パブリッシュしてみるとその設定が反映されていません。
    解決策はお判りでしょうか。
  • id:tukihatu
    >マウスオーバーの設定が上手く反映しないのも、スクリプトが原因でしょうか。
    ボタンそれぞれに、シンボル/ボタン上で「オーバー」のフレームに色が違う画像を入れて、マウスオーバー時に表示される様にした積もりなのですが、「制御 /シンプルボタンを有効にする」にチェックを入れてFlashの画面上ではマウスオーバーで画像が切り替わるのですが、パブリッシュしてみるとその設定が反映されていません。

    んー…その様子だとボタンはちゃんと動いているはずなので、おそらくボタンの上に何か乗っかっているんだと予想します。
    AS3ではボタンの上に何か物をおくことが出来ないんです…透明ムービークリップもNGです。(AS3からムービークリップにも標準でmouseイベントが追加されたため)
    一応解決法は二つ(?)あってmouseChildrenとmouseEnabledを使う方法と、原始的に透明ボタンを一番上階層に作る方法があります。
    tukihatuはAS書くの面倒なので透明ムービークリップを作って一番上階層においてボタンにしてます。
    http://www.google.co.jp/search?hl=ja&client=firefox-a&hs=lwZ&rls=org.mozilla%3Aja%3Aofficial&q=mouseChildren+mouseEnabled+AS3&aq=f&aqi=&aql=&oq=&gs_rfai=
  • id:dics
    tukihatu様
    コメントありがとうございます。
    今のレイヤ構成は…
    1番上:as02(link_btn02のスクリプト)
    2番目:透明ボタン02(アップ/オーバー/ダウンは空で、ヒットのみ画像あり)
    3番目:ボタン画像02(アップに通常時の画像/オーバーに切替わる画像)
    4番目:as01(link_btn01のスクリプト)
    5番目:透明ボタン01(アップ/オーバー/ダウンは空で、ヒットのみ画像あり)
    6番目:ボタン画像01(アップに通常時の画像/オーバーに切替わる画像)
    以下動画レイヤ
    この様にしています。

    試しにasのレイヤを2つとも上層へ移動した場合、リンクは生きますがマウスオーバーの画像変移はできません。
    お書きになっている「透明ボタンを一番上階層へ…」について、詳しくお教えいただければと思います。
    よろしくお願いします。
  • id:tukihatu
    僕の場合はそもそもボタンクリップを使用しません。全部ムービークリップを使います。
    ロールオーバーもコードで書きますね。ボタンクリップでないのでシンプル~で確認は出来なくなりますがパブリッシュで確認できます

    1番上:as02(link_btn02のスクリプト)…MouseEvent.CLICK
    2番目:透明ムービークリップ・link_btn02(ヒットエリアを作って透明にしておく)
    3番目:ボタン画像ムービークリップ・link_btn02Img(通常時の画像(off)/オーバーに切替わる画像(on)を入れておいてstop()しておく)

    link_btn02のスクリプト
    link_btn02.addEventListener(MouseEvent.CLICK, newWin);
    link_btn02.addEventListener(MouseEvent.MOUSE_OVER, newWinRollover);
    link_btn02.addEventListener(MouseEvent.MOUSE_OUT, newWinRollout);

    function newWinRollover(e){
    event.currentTarget.buttonMode = true;
    root[event.currentTarget.name+"Img"].gotoAndStop("on");
    }
    function newWinRollout(e){
    event.currentTarget.buttonMode = false;
    root[event.currentTarget.name+"Img"].gotoAndStop("off");
    }

    参考までに。
  • id:dics
    ご回答ありがとうございます。
    この中でひとつ判らない部分があります。

    >透明ムービークリップ・link_btn02(ヒットエリアを作って透明にしておく)

    これですが、具体的に作り方を教えていただけませんでしょうか。
    よろしくお願いいたします。
  • id:tukihatu
    1.四角いシェイプデータを作る
    2.修正→シンボルに変換→ムービークリップを選択。
    3.出来上がったムービークリップの透明度を0に
    4.任意の大きさに変更してボタンアクションを加える


    こんな感じです。
  • id:dics
    ご回答ありがとうございます。
    済みません、もう1点詳しくご解説いただけますでしょうか。
    4つ目の「ボタンアクションを加える」ですが、ムービークリップの中のレイヤーへ、そのアクションを加えるのでしょうか。
    お手数ですが、いまいちど手順を教えて下さい。
    よろしくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません