- 締切済み
AS初心者です。フレームループするメニューを作りたいのですが・・・
■環境 WindowsXP/FLASH 8pro/AS2.0 ■実現したいフラッシュのあるサイト http://www.first-jp.com/ このサイトの上部にあるスクロールしているFLASHです。 かなりの初心者なのですが、本を参考にして作っています。 まだまだ完成にはほど遠いのですが、現段階でこのような状態です。 http://dragstarnavi.web.fc2.com/navi/navi.html ■構造 メインのタイムライン1フレーム目に下記のASを記述。 メインのタイムライン1フレーム目にボタンを設置(MC可、左は「left-botton」右は「right-botton」) ■メインタイムラインに記載しているAS var obj_array:Array = new Array(); //配列の生成 var center:Number = Stage.width/2; //ステージ中心X座標 var menu_num:Number = 4; //メニュー数 var maxlength:Number = 800*menu_num; //メニュー列の最大幅 var friction:Number = -0.02; //マウス移動時の摩擦値 //XMLオブジェクトの生成と外部XMLの読み込み var obj_xml:XML = new XML(); //XMLオブジェクトの生成 obj_xml.onLoad = start_me; //ロードアクション(コールバックを定義) obj_xml.ignoreWhite = true; //XMLファイルの空白、改行などを無視 obj_xml.load("scrollslide.xml"); //外部XMLファイルを読み込む //XMLのロード成功可否を判断 function start_me(success:Boolean):Void { if (success == true) { //読み込み成功 //サムネイルインスタンスの生成と設定 for (var i = 1; i<=menu_num; i++) { var menu_str:String = "menu"+i; obj_array[i] = _root.attachMovie("menu", menu_str, i); //インスタンスを設定 obj_array[i].num = i; //インスタンスを配列で管理 obj_array[i]._x = 800*(i-1); obj_array[i]._y = 0; //XMLからJPG名を読み込む var jpg_str:String = obj_xml.firstChild.childNodes[(i-1)*2].firstChild; //XMLからURLを読み込む var link_str:String = obj_xml.firstChild.childNodes[i*2-1].firstChild; obj_array[i].jpg_mc.loadMovie(jpg_str); //外部JPGロード obj_array[i].onEnterFrame = scrollphoto_me; //イベントアクション obj_array[i].onPress = press_me; //イベントアクション obj_array[i].onRollOver = roll_me; //イベントアクション obj_array[i].onRollOut = rollout_me; //イベントアクション obj_array[i].onRelease = release_me; //イベントアクション obj_array[i].link = link_str; } } else { seltext = "xml read error"; //エラー } } function release_me():Void { trace(this.link); getURL(this.link, "_parent"); //同ウインドウ内でURLを読み込む } //サムネイルインスタンスのフレームループ function scrollphoto_me():Void { var speed:Number = (_root._xmouse-center)*friction; //マウスの移動量 var vx:Number = this._x+speed; if (vx<=-800) { //ステージ左に消えたら vx += maxlength; //サムネイルの最後列の後ろへ移動 } else if (vx>=Stage.width+1) { //ステージ右に消えたら vx -= maxlength; //サムネイル最前列の前へ移動 } this._x = vx; updateAfterEvent(); } //サムネイルインスタンスのマウスロールオーバーアクション function roll_me():Void { this._alpha = 80; } //サムネイルインスタンスのマウスロールアウトアクション function rollout_me():Void { this._alpha = 100; } stop(); ■読み込んでいるXML <?xml version="1.0" encoding="utf-8"?> <jpeg> <jpegURL>images/image1.jpg</jpegURL> <link>http://yahoo.co.jp/1</link> <jpegURL>images/image2.jpg</jpegURL> <link>http://yahoo.co.jp/2</link> <jpegURL>images/image3.jpg</jpegURL> <link>http://yahoo.co.jp/3</link> <jpegURL>images/image4.jpg</jpegURL> <link>http://yahoo.co.jp/4</link> </jpeg> ■先人の皆様にご教授して頂きたい箇所 1.ループの変更 希望サイトのように、左から右に一定の速度で流れるようにしたい。 オンマウスにて完全にストップ。マウスアウトにてストップを解除。 2.ボタンの設置 メインタイムラインに新規フレームを作って左右のボタン (left-botton right-botton)を設置し、MCに変換したのですが 早速問題で、読み込まれた外部JPGの背後になってしまっています。。 これを最前面に持ってきたいのです。 読み込む順番が問題なのでしょうか? 3.ボタンのアクション設定 左ボタン(left-botton)にて、左方向に加速。 右ボタン(right-botton)にて、右方向に加速。 何を無謀なチャレンジと思われるでしょうが、 宜しければご教授頂ければ幸いです。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tanigucchi
- ベストアンサー率70% (43/61)
#1です。 片方向の制御ですが以下のように変更すればループできると思います。 ●旧 if (_global.gb_onoff == 0) {//変数gb_onoffが0の場合、 this._x += 1;//x軸方向に1進む } ●新 if (_global.gb_onoff == 0){ for (var i = 1; i<=menu_num; i++) { obj_array[i]._x += 1; if (obj_array[i]._x > 800){ obj_array[i]._x = obj_array[i]._x - 800 * menu_num; } } }
- Tanigucchi
- ベストアンサー率70% (43/61)
#1です。 エラーですが、コメント文との間に全角ブランクがあります。 ほかにもありますので全角ブランクをすべて半角ブランクに 置換してみてください。 また、 obj_array[i]._x = 800*(i-1); obj_array[i]._y = 0; の部分は obj_array[i]._x = -800*(i-1); obj_array[i]._y = 0; されるとスクロール方向に対して後方に画像が並びます。 (または、スクロール方向を this._x -= 1;)
お礼
>Tanigucchi様 ありがとうございます。全角も削除しました。 おかげさまで、現在このような状態です。 http://dragstarnavi.web.fc2.com/navi/navi1.html しかし、今度は無限ループが機能しなくなりました。 _global.gb_onoff = 0; //初期状態は横スクロールOK _globalはどこからでも参照可能な変数 _root.jpg_mc._x = 0; _root.jpg_mc.onEnterFrame = function() { if (_global.gb_onoff == 0) {//変数gb_onoffが0の場合、 this._x += 1;//x軸方向に1進む } }; //サムネイルインスタンスのマウスロールオーバーアクション _root.jpg_mc.onRollOver = function() { _global.gb_onoff = 1; this._alpha = 80; }; _root.jpg_mc.onRollOut = function() { _global.gb_onoff = 0; this._alpha = 100; }; 上記をループさせるには、x座標が800を超えると、元の座標に戻るという式を書けば良いと思うのですが、else if で実現できるでしょうか。。
- Tanigucchi
- ベストアンサー率70% (43/61)
#1です。 大雑把には以下のような感じです。 (注:見易いように全角ブランクを入れています。ご利用の際は削除ください) 1.ループの変更 _global.gb_onoff = 0; //初期状態は横スクロールOK _root.jpg_mc._x = 0; _root.jpg_mc.onEnterFrame = function(){ if (_global.gb_onoff == 0){ this._x += 1; } } //サムネイルインスタンスのマウスロールオーバーアクション _root.jpg_mc.onRollOver = function() { _global.gb_onoff = 1; //横スクロールさせない }; _root.jpg_mc.onRollOut = function() { _global.gb_onoff = 0; //横スクロールOK } 2. 読み込む画像が1枚になってしまいました? for文の前で jpg_mc のサイズを menu_num * 800 に変えてみてください。 また、指定されている座標は、jpg_mc内の座標となりますのでご注意ください。
補足
>Tanigucchi様 入りきらないので、こちらに記載いたします。 何度もすみません。助かります。 ループと、マウスロールオーバーアクションを記述しましたが、 _global.gb_onoff = 0; の行でエラーが出るようです。 それ以前のこちらでの記述が問題なのでしょうが、 どこが原因なのか分かりません。。 ▼メインフレームのAS var obj_array:Array = new Array(); //変数obj_arrayの初期化 var menu_num:Number = 4; //メニュー数 この数値は外部XMLに変換したいです。。 var maxlength:Number = menu_num * 800 ; //メニュー列の最大幅 ここを変更したのですが。。 //XMLオブジェクトの生成と外部XMLの読み込み var obj_xml:XML = new XML(); obj_xml.onLoad = start_me; obj_xml.ignoreWhite = true; obj_xml.load("scrollslide.xml"); //XMLのロード成功可否を判断 function start_me(success:Boolean):Void { //変数start_meがtrue or falseの場合 if (success == true) { for (var i = 1; i<=menu_num; i++) { var menu_str:String = "menu"+i; obj_array[i] = jpg_mc.attachMovie("menu", menu_str, i); //インスタンスを設定 obj_array[i].num = i; //インスタンスを配列で管理 //obj_array[i]._x = 800*(i-1); 800×(i-1)X軸方向に進む //obj_array[i]._y = 0; var jpg_str:String = obj_xml.firstChild.childNodes[(i-1)*2].firstChild; //XMLからJPG名を読み込む var link_str:String = obj_xml.firstChild.childNodes[i*2-1].firstChild; //XMLからURLを読み込む obj_array[i].jpg_mc.loadMovie(jpg_str); obj_array[i].onEnterFrame = scrollphoto_me; obj_array[i].onPress = press_me; obj_array[i].onRollOver = roll_me; obj_array[i].onRollOut = rollout_me; obj_array[i].onRelease = release_me; obj_array[i].link = link_str; } } else { seltext = "xml read error"; } } _global.gb_onoff = 0; //初期状態は横スクロールOK _root.jpg_mc._x = 0; _root.jpg_mc.onEnterFrame = function(){ if (_global.gb_onoff == 0){ //変数gb_onoffが0の場合、 this._x += 1; //x軸方向に1進む } } //サムネイルインスタンスのマウスロールオーバーアクション _root.jpg_mc.onRollOver = function() { _global.gb_onoff = 1; //横スクロールさせない }; _root.jpg_mc.onRollOut = function() { _global.gb_onoff = 0; //横スクロールOK } flaデータもアップしております。(Flash 8Proです) 単純なことなのかもしれませんし、お手間を取らせますが ご指摘頂ければ大変助かります。 http://dragstarnavi.web.fc2.com/navi/navi.fla
- Tanigucchi
- ベストアンサー率70% (43/61)
概要だけ回答します。 1.ループの変更 onEnterFrame を利用すれば実現できます。 ストップのON、OFFは変数で制御ください this.onEnterFrame = function(){ if(ONのとき){動け} } 2.ボタンの設置 rootにインスタンスを配置していますのでそのような動きになります。 ボタンより下のレイヤに手でムービークリップを配置して、それに 対してインスタンスを配置します。 menubase_mc.attachMovie("menu", menu_str, i); 3.ボタンのアクション設定 加速は、移動距離に係数をかけてあげればよいだけですから、 1が実現できてから考えてください。
補足
>Tanigucchi様 長い羅列で読みづらいかと思います、ご親切にありがとうございます! しかし・・・早速つまづきました。 現在の状態です。 http://dragstarnavi.web.fc2.com/navi/navi.html 2については、ご指摘いただいたとおりrootにレイヤーを最下段に作って「jpg_mc」のMCを配置し、obj_array[i] = jpg_mc.attachMovie("menu", menu_str, i);と変更するとボタンが前面に出るようになりました。 しかし、読み込む画像が1枚になってしまいました。。 そして、 1でif文にてつまづいています。 _root.jpg_mc._x = 0; _root.jpg_mc.onEnterFrame = function(){ this._x += 1; } と追加し、横スクロールするようになったのですが、ここにマウスがオンすると動きを止めるという記述が分かりません。。。 大変お手間を取らせてすみません。よろしければご教授願えるでしょうか。 変更したソース: var obj_array:Array = new Array(); //変数obj_arrayの初期化 var menu_num:Number = 4; //変数menu_mcの値 メニュー数 この数値は外部XMLに変換予定 var maxlength:Number = 800*menu_num; //メニュー列の最大幅 //XMLオブジェクトの生成と外部XMLの読み込み var obj_xml:XML = new XML(); //変数obj_xmlの初期化 XML生成 obj_xml.onLoad = start_me; //変数obj_xmlは変数start_meを読み込む obj_xml.ignoreWhite = true; //変数obj_xmlはXMLファイルの空白、改行などを無視する obj_xml.load("scrollslide.xml"); //変数obj_xmlはXML(scrollslide.xml)を読み取る //XMLのロード成功可否を判断する function start_me(success:Boolean):Void { //変数start_meがtrue or falseの場合 if (success == true) { //読み込み成功した場合、 for (var i = 1; i<=menu_num; i++) { //変数iが1のとき、変数menu_num(4)よりiが小さければ(4回)下記を繰り返す var menu_str:String = "menu"+i; //変数menu_strは menu+i obj_array[i] = jpg_mc.attachMovie("menu", menu_str, i); //変数obj_array(i)はインスタンスを設定 obj_array[i].num = i; //インスタンスを配列で管理 obj_array[i]._x = 800*(i-1); //変数obj_array(i)は800×(i-1)X軸方向に進む obj_array[i]._y = 0; var jpg_str:String = obj_xml.firstChild.childNodes[(i-1)*2].firstChild; //変数jpg_strはXMLオブジェクトからJPG名を読み込む var link_str:String = obj_xml.firstChild.childNodes[i*2-1].firstChild; //XMLオブジェクトからURLを読み込む obj_array[i].jpg_mc.loadMovie(jpg_str); //変数obj_array[i]は変数jpg_mcにjpg_strを読み込む obj_array[i].onEnterFrame = scrollphoto_me; //イベントが発生した時に行うイベントアクション obj_array[i].onPress = press_me; //クリックした時に行うイベントアクション obj_array[i].onRollOver = roll_me; //領域に入ったときに行うイベントアクション obj_array[i].onRollOut = rollout_me; //領域外に出たときに行うイベントアクション obj_array[i].onRelease = release_me; //クリックして離したときに行うイベントアクション obj_array[i].link = link_str; } } else { //読み込みに失敗した場合 seltext = "xml read error"; //読み込めなかったときに表示する } } //追加したスクロールの部分です。 _root.jpg_mc._x = 0; _root.jpg_mc.onEnterFrame = function(){ this._x += 1; } //変数 release_me function release_me():Void { trace(this.link); //URLを記述 getURL(this.link, "_parent"); //同ウインドウ内でURLを読み込む } //サムネイルインスタンスのマウスロールオーバーアクション function roll_me():Void { this._alpha = 80; } //サムネイルインスタンスのマウスロールアウトアクション function rollout_me():Void { this._alpha = 100; } stop();
お礼
Tanigucchi様 ありがとうございます。 ループの方、何とかなりました。 後はボタンでの加速ですので、もう少しがんばってみます。 ご丁寧にありがとうございました。