プロが教えるわが家の防犯対策術!

アイデアを下さい!(スライドショーについて)

Flash CS5Proの体験版を使っています。
初めてAS3.0を使っているのですが、on(press)やonClipEventに頼り切っていた僕に、イベントリスナーという巨大な壁が現れました・・・。

今回、極力シンプルなスライドショーを作りたいのですが、所々で行き詰っています。

例えば、下は「次へ」のボタンが押された場合の処理なのですが
pre.addEventListener(MouseEvent.CLICK, onPre);
function onPre(event:MouseEvent):void {
n--;
ulLoader.source =n+".jpg";
//前の画像へ行かないように
if(n == 0){
pre.visible=false;
}else{
pre.visible=true;
}
}
全体的にこのように、それがよいやり方なのかも分からずとりあえず動作している状態です。

行き詰っている点の一つは、連続した番号をつけた画像ファイル(0.jpg,1.jpg...)の最後の画像へ行ったら次の画像へ行かないようにする機能です。
僕の考えたアイデアの一つとして、何度か次の画像を読み込み、失敗したら”最後の画像”とみなせばいいんじゃないか、というのがあるのですが、読み込みの失敗を取得する方法も分かりません。

他にも
・画像サイズが違う場合(縦になっているものなど)に、キレイに縮小する機能
・現在表示中の画像の前後5枚ほどをあらかじめ読み込んでおく機能
・スライド効果(次の画像を表示する際、現在表示中の画像が画面外へ向かいつつ同時に次の画像がやってくる感じで)

これらの実装をしたいのですが、手も足も出ない状態です。
ご教示のほど、よろしくお願いします。

A 回答 (2件)

>スライド効果(次の画像を表示する際、現在表示中の画像が画面外へ向かいつつ同時に次の画像がやってくる感じで)




最後の↑コレを忘れてました。

これはマスクでいいんじゃないですか?
AS1.0を使っていたのであれば、通常のマスクの使い方(レイヤー右クリック→マスク)は知っているものと思われます。
AS3.0でも同じ方法は使えますが、スクリプトでやるなら、

ImgMC.mask = MaskMC;

となります。
ただし、このスクリプトはひとつのマスクに対してひとつのオブジェクトしか適用できないので、
今回のように複数のオブジェクトがある場合は、
ひとつのムービークリップを用意し、その中に各画像を読み込んだ上で、
そのムービークリップにマスクを掛ける手法でいいと思います。

//予め、ムービークリップ(AllImg)と(MaskMC)を用意
for(var i=1;i<=予定枚数;i++){
this["IMG" + i] = new Loader();
this["IMG" + i].load(new URLRequest("hoge" + i + ".jpg"));
this["IMG" + i].x += 規定の幅(画像の横幅+α);
AllImg.addChild(this["IMG" + i]);
}
AllImg.mask = MaskMC;

な感じです。
で、ボタン操作でAllImg.x を操作してあげればいいです。
    • good
    • 0
この回答へのお礼

このようなあいまいな質問に答えていただき、ありがとうございました!
具体的に疑問を絞った質問をさせて頂きます・・・。

お礼日時:2010/09/02 22:45

要点だけ。



◎読み込み失敗の検出
contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR,onError);

function onError(e:IOErrorEvent):void{
//読み込み失敗=画像なしと見なす処理
}


◎読み込み画像をキレイに縮小する。
スムージングですね。厳密にはちょっとボケた感じになりますが、
ジャギジャギよりマシです。

var IMG = new Sprite();
var LD = new Loader();
LD.load(new URLRequest("hoge.jpg"));
LD.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
addChild(IMG);

function onComplete(e:Event){
IMG.addChild(LD);
LD.scaleX = 0.25;//お好きな大きさで
LD.scaleY = 0.25;
var BMP = Bitmap(LD.content);
BMP.smoothing = true;
}

◎一括読み込み
これが一番説明難しいです。現状の構造が不明なので。
展開予定枚数分をfor文で回して読み込めば良いだけですが、

for(var i=1;i<=予定枚数;i++){
this["IMG" + i] = new Loader();
this["IMG" + i].load(new URLRequest("hoge" + i + ".jpg"));
}

で、用意しておいて、

一定時間間隔で、addChild(this["IMG" + 画像番号])で配置していけばよろしいかと。

この回答への補足

root上のフレームにこのように記述したところ(他は移動用のボタンがあるだけ)、上手く表示されたので、回答いただいたソースを組み合わせ、ボタンを押すことで次々と再生されるようになる段階までなんとかしてみます。

import flash.display.BitmapData;

var n:Number = 0;//現在再生中のファイル番号
var a:Number = 5;//先読み込みする枚数
var mc:MovieClip = new MovieClip();
var mc2:MovieClip = new MovieClip();
var space:Number= 40;//画像間の隙間
stage.addChild(mc);
stage.addChild(mc2);
stage.setChildIndex(mc,0);
stage.setChildIndex(mc2,0);
mc.x = 0;
mc2.x = -800-space;//画像サイズ

var ldr:Loader = new Loader();
ldr.load(new URLRequest(n+".jpg"));
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
 
//読み込み完了イベントの処理
function onComplete(e:Event):void{
var loadedImage:Bitmap = Bitmap(ldr.content);
loadedImage.smoothing = true;
mc.addChild(loadedImage);
var wide:Number = ldr.content.width;
mc.x=(stage.width - wide)/2;
}

補足日時:2010/09/01 23:38
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます!
とりあえず、順番に表示することは成功しました。

少しずつ前進しています・・・。

お礼日時:2010/09/01 22:55

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