トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     xmlデータ読み込みとTimerクラスでの切り替え
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
igaito
Åê¹ÆNo.44254
投稿日時: 2010-1-8 16:16
新米
居住地: 九州
投稿: 7
使用環境:
Windows Vista Home Basic, Flash CS3
xmlデータ読み込みとTimerクラスでの切り替え
JPEGのファイルを外部XMLファイルを使って読み込み、一定の秒数で
そのJPEGが切り替わるフォトアルバムみたいなものを作っています。

XMLデータの読み込みとJPEGの表示まではなんとか、できたのですが
一定の秒数で切り替える部分がうまくいきません。

以下が、現状のソースです。

XMLloader.as
package
{
import fl.motion.MotionEvent;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.display.*;
import flash.utils.Timer;

public class XMLloader extends Sprite {
//プロパティ
private var urlLoader:URLLoader;
private var xml:XML;
private var max:uint;
private var dataList:Array;
private var imgLoader:Loader;
private var container:Sprite;
private var imgLink:String;
private var imgPath:String;
private var minutetimer:Timer;

//コンストラクタ
public function XMLloader() {
init();
}

//XML読み込み
private function init() {
//URLLoaderオブジェクトの作成
urlLoader = new URLLoader();
urlLoader.load(new URLRequest("xml/imgload.xml"));//xmlファイルをロード

//XMLデータ読み込み完了イベント作成
urlLoader.addEventListener(Event.COMPLETE, completeLietener);

dataList = []; //Arrayの初期化

imgLink = new String(); //Element<link>
imgPath = new String(); //Element<path>

//タイマー作成
minutetimer = new Timer(3000, 0);
//タイマーイベント作成
minutetimer.addEventListener(TimerEvent.TIMER, onTick);
//スタート
minutetimer.start();

imgLoader = new Loader(); //Loaderオブジェクトを作成
container = new Sprite(); //Spriteオブジェクトを作成
addChild(container); //addChildで追加
//ロード完了イベント
imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);

//マウスイベント
container.addEventListener(MouseEvent.CLICK, onClick);
container.addEventListener(MouseEvent.MOUSE_OVER, onOver);
container.addEventListener(MouseEvent.MOUSE_OUT, onOut);
}

//XML読み込み完了後
private function completeLietener(e:Event):void {
//XMLオブジェクトの作成
xml = new XML(e.target.data);
max = xml.item.length();

for (var i:uint = 0; i < max; i++) {
imgPath = xml.item[0].path;
imgLink = xml.item[0].link;
imgLoader.load(new URLRequest(imgPath));
dataList.push([imgPath, imgLink]); //配列にElementを追加
//trace(imgPath);
//trace(imgLink);
}

}

//ロード完了後
private function imgLoaded(e:Event):void {
container.x = 12;
container.y = 11;
container.addChild(imgLoader.content);
}

//タイマーイベント
private function onTick(e:TimerEvent):void {
var count:int = minutetimer.currentCount;
var seconds:Number = (minutetimer.delay * count) / 1000;
trace(count + "回目" + seconds + "秒");
imgPath = xml.item[1].path;
imgLink = xml.item[1].link;
imgLoader.load(new URLRequest(imgPath));
}

//クリックイベント
private function onClick(e:MouseEvent):void {
var request:URLRequest = new URLRequest(imgLink);
navigateToURL(request, "_self");
}

private function onOver(e:MouseEvent):void {
buttonMode = true;
}

private function onOut(e:MouseEvent):void {
buttonMode = false;
}
}

}


この部分でもう一度画像を変えようとしているのですが
3秒経過した時点で以下のようなエラーが出てしまいます。。。

ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。
at flash.display::Loader/flash.display:Loader::_load()
at flash.display::Loader/load()
at XMLloader/::onTick()
at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
at flash.utils::Timer/flash.utils:Timer::tick()

/**********************************************************
//タイマーイベント
private function onTick(e:TimerEvent):void {
var count:int = minutetimer.currentCount;
var seconds:Number = (minutetimer.delay * count) / 1000;
trace(count + "回目" + seconds + "秒");
imgPath = xml.item[1].path;
imgLink = xml.item[1].link;
imgLoader.load(new URLRequest(imgPath));
}
/**********************************************************

XMLファイルはこちらになります。
xml/imgload.xml

<?xml version="1.0" encoding="utf-8"?>
<img>
<item>
<path>img/lbanner_01.jpg</path>
<link>http://www.adobe.com/jp/</link>
</item>
<item>
<path>img/lbanner_02.jpg</path>
<link>http://japan.cnet.com/</link>
</item>
</img>

かなりはまってしまって抜け出せないでいます。
どうかご教授いただければと思います。

------------------------
環境
OS:Windows Vista
Flashバージョン:CS3
------------------------


----------------
CS3 Windows Vista

ひろゆき
Åê¹ÆNo.44255
投稿日時: 2010-1-8 18:14
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: xmlデータ読み込みとTimerクラスでの切り替え
まず、検証するにあたって、第三者が確認しやすいものにした方がよいでしょう。
そのためには、xml, リンクは不要です。

複雑にしているために、問題点がはっきりしないと思います。
端的に言うと、読み込みが完了していない状態で、Timerが動いているのが問題だと思います。

1. 画像を読み込み始める。
2. 読み込みが完了したら、Timer開始。
3. 一定時間たったら、次の画像を読み込み始める。(1へもどる)

という流れが一番わかりやすいのではないかと思います。

package {
	import flash.display.Sprite;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.net.URLRequest;

	public class Test extends Sprite {
		//プロパティ
		private var photoList:Array;
		private var id:uint = 0;
		private var loader:Loader;
		private var container:Sprite;
		private var timer:Timer;	

		//コンストラクタ
		public function Test() {
			init();
		}

		//XML読み込み
		private function init() {
			photoList = ["photo1.jpg", "photo2.jpg"];
			loader = new Loader();
			container = new Sprite();
			addChild(container);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded, false, 0, true);
			load();
		}
		private function loaded(evt:Event):void {
			container.x = 12;
			container.y = 11;
			container.addChild(loader.content);
			timer = new Timer(3000, 1);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, complete, false, 0, true);
			timer.start();
		}
		private function complete(evt:TimerEvent):void {
			load();
		}
		private function load():void {
			var photoPath:String = photoList[id%photoList.length];
			loader.load(new URLRequest(photoPath));
			id ++;
		}

	}

}


----------------
質問する際は、回答者に具体的な情報を与えてください。

ひろゆき
Åê¹ÆNo.44256
投稿日時: 2010-1-8 18:44
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: xmlデータ読み込みとTimerクラスでの切り替え
以上が正常に動いていることが確認できてから、xmlの読み込み、リンクを実装した方がいいように思います。

package {
	import flash.display.Sprite;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.navigateToURL;

	public class Test extends Sprite {
		//プロパティ
		private var xmlloader:URLLoader;
		private var max:uint;
		private var dataList:Array;
		private var id:uint = 0;
		private var loader:Loader;
		private var container:Sprite;
		private var timer:Timer;	

		//コンストラクタ
		public function Test() {
			init();
		}

		//XML読み込み
		private function init() {
			xmlloader = new URLLoader();
			xmlloader.addEventListener(Event.COMPLETE, xmlloaded, false, 0, true);
			xmlloader.load(new URLRequest("test.xml"));
			dataList = new Array();
			loader = new Loader();
			container = new Sprite();
			addChild(container);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded, false, 0, true);
		}
		private function xmlloaded(evt:Event):void {
			var xml:XML = new XML(evt.target.data);
			max = xml.item.length();
			for (var n:uint = 0; n < max; n++) {
				var photoPath:String = xml.item[n].path;
				var link:String = xml.item[n].link;
				dataList.push({path: photoPath, link: link});
			}
			load();
		}
		private function loaded(evt:Event):void {
			container.x = 12;
			container.y = 11;
			container.addChild(loader.content);
			container.addEventListener(MouseEvent.CLICK, click, false, 0, true);
			container.addEventListener(MouseEvent.MOUSE_OVER, over, false, 0, true);
			container.addEventListener(MouseEvent.MOUSE_OUT, out, false, 0, true);
			timer = new Timer(3000, 1);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, complete, false, 0, true);
			timer.start();
		}
		private function complete(evt:TimerEvent):void {
			load();
		}
		private function load():void {
			var photoPath:String = dataList[id%max].path;
			loader.load(new URLRequest(photoPath));
			id ++;
		}
		private function click(e:MouseEvent):void {
			var link:String = dataList[id%max].link;
			var request:URLRequest = new URLRequest(link);
			navigateToURL(request, "_self");
		}
		private function over(e:MouseEvent):void {
			buttonMode = true;
		}
		private function out(e:MouseEvent):void {
			buttonMode = false;
		}

	}

}


----------------
質問する際は、回答者に具体的な情報を与えてください。

igaito
Åê¹ÆNo.44257
投稿日時: 2010-1-8 18:52
新米
居住地: 九州
投稿: 7
使用環境:
Windows Vista Home Basic, Flash CS3
Re: xmlデータ読み込みとTimerクラスでの切り替え
ひろゆき様
迅速かつ丁寧なご説明ありがとうございます。

いただいた内容と自分の内容を確認しながら
実装してみたいと思います。

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


----------------
CS3 Windows Vista

igaito
Åê¹ÆNo.44259
投稿日時: 2010-1-8 21:43
新米
居住地: 九州
投稿: 7
使用環境:
Windows Vista Home Basic, Flash CS3
Re: xmlデータ読み込みとTimerクラスでの切り替え
ひろゆき様

ご連絡が遅くなりました。

無事実装することができました >_<

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


----------------
CS3 Windows Vista

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops