ログイン
メインメニュー
|
投稿者 |
スレッド |
joyko |
Åê¹ÆNo.43802 投稿日時: 2009-10-28 3:16 |
常連 居住地: 埼玉県 投稿: 167
使用環境:WinXP(SP3) Flash8 Basic FlashCS3 Flash CS4
|
Timerクラス/timer.currentCountプロパティについて 皆さん、 いつも、お世話になってます。 今日の質問は、良くあるスライドショーですが、【自動で、外部JPGを同じloaderに、順番に読み込み、ループさせるのですが、別途設置したボタンクリックで、該当JPGを読み込み、ボタンをロールアウトすると、その次のJPGを自動で、読み込むタイプ】をTimerクラスで作るにはどうすればいいのでしょうかという質問です。 【ケース1:AS3.0では非推奨のsetInterval();を使えば、簡単にできます。】
var max:uint=5;//生成するボタンの数
var n:uint=0;//現在表示のJPG番号(1.jpg、2.jpg、3.jpg、・・・・のように番号付けしてる場合は、0.jpgの意味)
//loader設置領域
var loader:Loader=new Loader();
addChild(loader);
//ボタン設置領域→ここは、今回は、重要でないです
for (var i:uint=1; i<=max; i++) {
var btn:MovieClip= new Btn();//ライブラリー内 MovieClip クラス名 Btnから生成
addChild(btn);
btn.buttonMode=true;
btn.id=i;
btn._txt.mouseEnabled=false;
btn.x=-10+60*i;
btn.y=350;
btn._txt.text= String(i)+"番";
btn.addEventListener(MouseEvent.ROLL_OVER,xRollover,false,0,true);
btn.addEventListener(MouseEvent.ROLL_OUT,xRollout,false,0,true);
btn.addEventListener(MouseEvent.CLICK,xClick,false,0,true);
}
function xRollover(e:MouseEvent):void {
clearInterval(timer);
}
function xRollout(e:MouseEvent):void {
timer=setInterval(Move,2000);
}
function xClick(e:MouseEvent):void {
trace("btnの番号 = "+e.target.id);
loader.load(new URLRequest("../fotos0/"+e.target.id+".jpg"));
n=e.target.id//ここで、JPG番号変更可能
}
//timer設置領域
var timer:uint=setInterval(Move,2000);
trace("timerの連番:"+timer);
function Move() {
clearInterval(timer);//都度、定番のcleariInterval();
n++;
if (n>max) {
n=1;
}
trace("変数 nの番号 = "+n);
loader.load(new URLRequest("../fotos0/"+n+".jpg"));
timer=setInterval(Move,2000);//再設定
trace("timerの連番: "+timer);
}
【ケース2:AS3.0推奨のTimerクラス使用時が質問対象です】
var max:uint=5;//生成するボタンの数
//loader設置領域
var loader:Loader=new Loader();
addChild(loader);
//timer設置領域
var timer:Timer=new Timer(2000,5);
timer.start();
timer.addEventListener(TimerEvent.TIMER,xTimer,false,0,true);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,yTimer,false,0,true);
function xTimer(e:TimerEvent):void {
trace(timer.currentCount);
loader.load(new URLRequest("../fotos0/"+timer.currentCount+".jpg"));
}
function yTimer(e:TimerEvent):void {
timer.reset();
timer.start();
}
//ボタン設置領域→今回、ここは、重要でないです。
for (var i:uint=1; i<=max; i++) {
var btn:MovieClip = new Btn();
addChild(btn);
btn.buttonMode=true;
btn.id=i;
btn._txt.mouseEnabled=false;
btn.x=-10+60*i;
btn.y=350;
btn._txt.text= String(i)+"番";
btn.addEventListener(MouseEvent.ROLL_OVER,xRollover,false,0,true);
btn.addEventListener(MouseEvent.ROLL_OUT,xRollout,false,0,true);
btn.addEventListener(MouseEvent.CLICK,xClick,false,0,true);
}
function xRollover(e:MouseEvent):void{
timer.stop();
}
function xRollout(e:MouseEvent):void{
timer.start();
}
function xClick(e:MouseEvent):void {
trace(e.target.id);
loader.load(new URLRequest("../fotos0/"+e.target.id+".jpg"));
//timer.currentCount=e.target.id;//timer.currentCountは、読み取り専用プロパティなので、代入不可
//ボタンクリック時の番号を、timerに引き渡す方法を、ご教授頂ければというのが、質問です
}
長くなりましたが、ご教授の程、よろしく、お願い致します。 → 野中さんのご回答を得て、解決済みです。 修正scriptは、最新投稿記事に、記載してます。
|
|
|
野中文雄 |
Åê¹ÆNo.43803 投稿日時: 2009-10-28 3:59 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境: CS5.5 .6.8 Vista Home Premium (SP1)
|
Re: Timerクラス/timer.currentCountプロパティについて 「Timerクラスで作る」場合も、「setInterval()」と同じく、変数(n)を使えば処理できるのではありませんか?そうでなく、Timerインスタンスに変数を設定したいということですと、 dynamicなクラスでないかぎりできません。どうしても実現したい場合には、サブクラスを定義します。 var n:uint = 0;
// var timer:Timer = new Timer(2000,5);
var timer:MyTimer = new MyTimer(2000, 5);
timer.start();
timer.addEventListener(TimerEvent.TIMER,xTimer,false,0,true);
// timer.addEventListener(TimerEvent.TIMER_COMPLETE,yTimer,false,0,true);
function xTimer(e:TimerEvent):void {
// trace(timer.currentCount);
trace(timer.currentCount, n, timer.id);
// loader.load(new URLRequest("../fotos0/"+timer.currentCount+".jpg"));
}
btn.id = 100;
btn.addEventListener(MouseEvent.CLICK,xClick,false,0,true);
function xClick(e:MouseEvent):void {
trace(e.target.id);
// loader.load(new URLRequest("../fotos0/"+e.target.id+".jpg"));
// timer.currentCount=e.target.id;
timer.id = e.target.id;
n = e.target.id;
}
package {
import flash.utils.Timer;
public class MyTimer extends Timer {
public var id:Number = 0;
public function MyTimer(delay:Number, repeatCount:int = 0) {
super(delay, repeatCount);
}
}
}
----------------
|
|
|
joyko |
Åê¹ÆNo.43804 投稿日時: 2009-10-28 8:51 |
常連 居住地: 埼玉県 投稿: 167
使用環境:WinXP(SP3) Flash8 Basic FlashCS3 Flash CS4
|
Re: Timerクラス/timer.currentCountプロパティについて 野中さん、 ありがとうございます! 引用: 「Timerクラスで作る」場合も、「setInterval()」と同じく、変数(n)を使えば処理できるのではありませんか?そうでなく、Timerインスタンスに変数を設定したいということですと、dynamicなクラスでないかぎりできません。どうしても実現したい場合には、サブクラスを定義します。
そうですよね。 朝起きて、ふと、timer.currentCountに、固執し過ぎている自分に、気づきました。 こちらを、念のため、訪問してみると、すでに、野中さんがご指摘されている、回答を見させて頂きました! 一人でやっていると、発想の転換ができないですが、本当に、助かります。改めて、御礼申し上げます。 以下、変数 n を、timerでも、btnでも変化させ、btnで変更した最新値を、引き渡すようにしました。本記事をご覧の方々へ、ご参考までに。 //1.jpg、2.jpg?5.jpgを外部JPGとして準備
import fl.transitions.Tween;//Tweenクラスをimportする
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
//初期値設定領域
var max:uint=5;//生成するボタンの数
var n:uint=0;//現在表示のJPGの番号
var aLpha:Tween;
//loader設置領域
var loader:Loader=new Loader();
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.INIT,xInit,false,0,true);
//ボタン設置領域
var btn_array:Array=new Array();//btnオブジェクトを格納する配列生成
for (var i:uint=1; i<=max; i++) {
var btn:Btn = new Btn();//ライブラリ内にある、2フレームからなるMovieClip、クラス名 Btnからインスタンス生成
addChild(btn);
btn_array.push(btn);//btnを配列に格納し、
btn.buttonMode=true;
btn.id=i;
btn._txt.mouseEnabled=false;
btn.x=-10+60*i;
btn.y=350;
btn._txt.text= String(i)+"番";
btn.addEventListener(MouseEvent.ROLL_OVER,xRollover,false,0,true);
btn.addEventListener(MouseEvent.ROLL_OUT,xRollout,false,0,true);
btn.addEventListener(MouseEvent.CLICK,xClick,false,0,true);
}
//timer設置領域
var timer:Timer=new Timer(3000);//3秒間隔で、無限に刻むタイマー設置
timer.start();
timer.addEventListener(TimerEvent.TIMER,xTimer,false,0,true);
//各function設置領域
function xInit(e:Event):void {
aLpha=new Tween(e.target.content,"alpha",None.easeInOut,0,1,1,true);
}
function xTimer(e:TimerEvent):void {
n++;
if(n>max){
n=1;
}
trace("現在表示のJPG番号 = "+n);
for (var k:uint=0; k<max; k++) {//btnの第一フレームと第二フレームを往復させ、条件によって、色変更
if (k!=(n-1)) {
btn_array[k].prevFrame();
} else {
btn_array[n - 1].nextFrame();
}
}
loader.load(new URLRequest("../fotos0/"+n+".jpg"));
}
function xRollover(e:MouseEvent):void {
timer.stop();
trace("timer停止");
}
function xRollout(e:MouseEvent):void {
timer.start();
trace("timerスタート");
}
function xClick(e:MouseEvent):void {
for (var k:uint=0; k<max; k++) {//btnの第一フレームと第二フレームを往復させ、条件によって、色変更
if (k!=(e.target.id-1)) {
btn_array[k].prevFrame();
} else {
btn_array[e.target.id - 1].nextFrame();
}
}
trace("クリックされたJPG番号= "+e.target.id);
loader.load(new URLRequest("../fotos0/"+e.target.id+".jpg"));
n=e.target.id;//nをRefreshさせる
}
|
|
|
|
|