Develop and Download Open Source Software

Browse Subversion Repository

Contents of /classes/Main.as

Parent Directory Parent Directory | Revision Log Revision Log


Revision 34 - (show annotations) (download)
Sun Mar 16 11:45:21 2008 UTC (16 years ago) by kreuz45
File size: 12168 byte(s)
一度Soundを読み込んだ後は再読み込みを行わないように変更
1 package
2 {
3 /*
4 * Multipurpose Slide Show Player
5 * Prototype 1
6 */
7 import flash.display.Sprite;
8 import flash.text.*;
9 import flash.display.*;
10 import flash.events.*;
11 import flash.net.*;
12 import flash.utils.*;
13 import flash.media.*;
14 import Picture;
15 import Song;
16 import caurina.transitions.*;
17 import ui.*;
18
19 [SWF(width="400", height="332")]
20 //[SWF(width="400", height="266")]
21 public class Main extends flash.display.Sprite
22 {
23 private static const SLIDE_TIMER_SPAN:int = 100;
24 private static const STATUS_STOPPING:int = 0;
25 private static const STATUS_PLAYING:int = 100;
26 private static const FADEIN_TIME:int = 3;
27
28 private var label:TextField;
29
30 private var seekBar:SeekBar;
31
32 [Embed(source='bar.png')]
33 private var Bar:Class;
34
35 private var bar_pos_y:int;
36
37
38 private var loader:URLLoader;
39 private var picturePropatyArray:Array;
40 private var pictureLoaderArray:Array;
41 private var songList:Array;
42 private var slideTimer:Timer;
43 private var currentSlideNum:int;
44 private var currentSlideTime:int;
45 private var picHolder:MovieClip;
46 private var sound :Sound;
47 private var soundChannel:SoundChannel;
48
49 private var autostart:Boolean;
50
51 private var status:int;
52
53 /*
54 * メイン関数
55 */
56 public function Main():void
57 {
58 stage.align = StageAlign.TOP_LEFT;
59 stage.scaleMode = StageScaleMode.NO_SCALE;
60
61 init(); //初期化します
62 }
63
64 /*
65 * 初期化関数
66 *
67 * Flashが読み込まれて、最初に一度だけ呼び出されるメソッドです。
68 * 外部XMLファイルの読み込みなどを行います。
69 */
70 private function init() :void
71 {
72 var playlist_file:String;
73
74 //センターによせる
75 picHolder = new MovieClip;
76 picHolder.x = 0;//stage.stageWidth/2;
77 picHolder.y = 0;//stage.stageHeight/2;
78 addChild(picHolder);
79
80 //現在のスライド番号を初期化します.
81 currentSlideNum = 0;
82 currentSlideTime = 0;
83
84 //画像リストを初期化します.
85 picturePropatyArray = new Array();
86 pictureLoaderArray = new Array();
87
88 //楽曲リストを初期化します
89 songList = new Array();
90
91 //開発用の変数を設定します
92 initForDebug();
93
94 //HTMLパラメータを読み込みます
95 var flashvars:Object;
96 flashvars = LoaderInfo(loaderInfo).parameters;
97 playlist_file = flashvars["playlist"];
98 if (flashvars["bar_pos_y"] != "") {
99 bar_pos_y = parseInt(flashvars["bar_pos_y"]);
100 }
101
102 //ユーザインターフェイスを初期化します
103 initUI();
104
105 //プレイリストを読み込みます
106
107 if (!playlist_file || playlist_file == "") {
108 playlist_file = "default_playlist.xml"; //テスト用
109 }
110 loadPlaylist(playlist_file);
111
112 //状態を停止中にします
113 status = STATUS_STOPPING;
114
115 //オートスタートが指定されていたらスタートします
116 if (autostart == true) {
117 start();
118 }
119 }
120
121 /*
122 * 開発用
123 *
124 * 開発用に適当な初期値を設定します
125 */
126 private function initForDebug() :void {
127 autostart = false;
128 bar_pos_y = 300;
129 }
130
131 /*
132 * スライドショーの開始
133 *
134 * スライドショーを開始します
135 */
136 private function start(position:Number = 0.0) :void {
137
138 //すでに再生中であればなにもしません
139 if (status == STATUS_PLAYING) return;
140
141 //状態を再生中にします
142 status = STATUS_PLAYING;
143
144 label.text = "start";
145
146
147 if(!sound){
148 sound = new Sound();
149
150 function playSound(evt:Event) : void {
151 var seekMS:Number = position * sound.length;
152 label.text = "SEEK : " + seekMS;
153 soundChannel = sound.play(position * sound.length);
154 soundChannel.addEventListener(Event.SOUND_COMPLETE, soundHandler);
155 }
156
157 sound.addEventListener(Event.COMPLETE, playSound);
158 sound.load(new URLRequest(songList[0].getFileName()));
159 }else {
160 soundChannel = sound.play(position * sound.length);
161 }
162
163
164
165
166
167
168 loadPicture(picturePropatyArray[currentSlideNum].getFileName());
169 picHolder.addChild(pictureLoaderArray[currentSlideNum]);
170 fadeIN(pictureLoaderArray[currentSlideNum],FADEIN_TIME);
171
172 slideTimer = new Timer(SLIDE_TIMER_SPAN);
173 slideTimer.addEventListener(TimerEvent.TIMER, slideTimerHandler);
174 slideTimer.start();
175
176 return;
177 }
178
179
180 /*
181 * タイマーイベントのハンドラ.
182 * スライドを表示します.
183 */
184 private function slideTimerHandler(evt:TimerEvent) :void {
185
186 //デバッグ用・ラベルに情報を表示します
187 //label.text = soundChannel.position + "sec.";
188
189 var progress:Number;
190 progress = soundChannel.position / sound.length;
191
192 seekBar.setProgressBarWidth((int)(250.0 * progress));
193 // progressBar.width = (int)(250.0 * progress);
194
195 currentSlideTime += 100;
196 if(currentSlideTime >= picturePropatyArray[currentSlideNum].getSpan()){
197 currentSlideTime = 0;
198 currentSlideNum++;
199 //fadeOut
200 //fadeOut(pictureLoaderArray[currentSlideNum-1],FADEIN_TIME);
201
202 if(currentSlideNum == picturePropatyArray.length){//最後まで行ったら最初に戻る
203 currentSlideNum = 0;
204 }
205
206 if(currentSlideNum < picturePropatyArray.length){//一度読んだ画像は再度読み込まない
207 loadPicture(picturePropatyArray[currentSlideNum].getFileName());
208 }
209 picHolder.addChild(pictureLoaderArray[currentSlideNum]);
210
211 //fadeIn
212 fadeIN(pictureLoaderArray[currentSlideNum],FADEIN_TIME);
213 removeChild(pictureLoaderArray[currentSlideNum-1]);
214
215 }
216
217 }
218
219 /*
220 * スライドショーの停止
221 *
222 * スライドショーを停止します
223 */
224 private function stop() :void {
225
226 //状態を停止中にします
227 status = STATUS_STOPPING;
228
229 label.text = "stop";
230 soundChannel.stop();
231 slideTimer.stop();
232
233 return;
234 }
235
236 /*
237 * ユーザインターフェイスの初期化
238 *
239 * ボタンなどのユーザインターフェイスを初期化するメソッドです。
240 * フラッシュ起動時に一回だけ呼び出されます。
241 */
242 private function initUI():void
243 {
244 //ラベルを追加します
245 label = new TextField();
246 label.autoSize = TextFieldAutoSize.LEFT;
247 label.text = "";
248 addChild(label);
249
250 var bar:DisplayObject = new Bar();
251 bar.y = bar_pos_y;
252 addChild(bar);
253
254
255
256
257
258 //シークバーを追加します
259 seekBar = new SeekBar();
260 seekBar.x = 60;
261 seekBar.y = bar_pos_y + 10;
262 addChild(seekBar);
263
264 //シークバーがクリックされたら、その位置から再生します
265 function onSeekBarClick(evt:MouseEvent): void {
266 var pos:Number = (evt.localX / 250.0);
267 stop();
268 start(pos);
269 }
270 seekBar.seekButton.addEventListener(MouseEvent.CLICK, onSeekBarClick);
271
272
273 //スタートボタンを追加します
274 [Embed(source = "play0.png")]var PlayIcon:Class;
275 [Embed(source = "play1.png")]var PlayIconDown:Class;
276 [Embed(source = "play2.png")]var PlayIconHover:Class;
277 var playIconDef:Bitmap = new PlayIcon();
278 var playIconDown:Bitmap = new PlayIconDown();
279 var playIconHover:Bitmap = new PlayIconHover();
280 var startButton:SimpleButton = new SimpleButton(playIconDef, playIconHover,playIconDown, playIconDef);
281 this.addChild(startButton);
282
283 startButton.x = 5;
284 startButton.y = bar_pos_y + 5;
285
286 //ボタンがおされたときに行う動作を記述します
287 function onPlayButtonClick(evt:MouseEvent): void {
288 start();
289 }
290
291 //ボタンがおされたらstartを実行します
292 startButton.addEventListener(MouseEvent.CLICK, onPlayButtonClick);
293
294
295 //停止ボタンを追加します
296 [Embed(source = "stop0.png")]var StopIcon:Class;
297 [Embed(source = "stop1.png")]var StopIconDown:Class;
298 [Embed(source = "stop2.png")]var StopIconHover:Class;
299 var stopIconDef:Bitmap = new StopIcon();
300 var stopIconDown:Bitmap = new StopIconDown();
301 var stopIconHover:Bitmap = new StopIconHover();
302
303 var stopButton:SimpleButton = new SimpleButton(stopIconDef, stopIconHover, stopIconDown, stopIconDef);
304 stopButton.x = 30;
305 stopButton.y = bar_pos_y + 5;
306 this.addChild(stopButton);
307
308 //ストップボタンがおされたときに行う動作を記述します
309 function onStopButtonClick(evt:MouseEvent): void {
310 stop();
311 }
312
313 //ストップボタンがおされたらstopを実行します
314 stopButton.addEventListener(MouseEvent.CLICK, onStopButtonClick);
315
316 }
317
318 /*
319 * プレイリストの読み込み
320 *
321 * 画像・音楽のリストが記述されているプレイリストを読み込みます
322 */
323 private function loadPlaylist(playlist_file:String):void
324 {
325 loader = new URLLoader();
326 loader.addEventListener(Event.COMPLETE, onPlaylistXMLLoaded);
327 loader.load(new URLRequest(playlist_file));
328
329 }
330
331 /*
332 * プレイリストのXMLファイルが読み込まれたときに呼ばれる関数
333 *
334 * 読み込まれたXMLファイルを解析して、画像・曲のリストを取得します
335 */
336 private function onPlaylistXMLLoaded(event:Event):void {
337
338 //読み込まれたデータをXMLとして解析します
339 var dataXml:XML = new XML(loader.data);
340
341 var songsStr:String = "Songs:";
342 var picturesStr:String = "Pictures:";
343 var songs_count:int = 0;
344 var pictures_count:int = 0;
345
346 //songs要素の中のsong要素をひとつずつ調べます
347 for each(var song:Object in dataXml.songs.song) {
348 trace("name:" + song.title);
349 var tmpSong:Song = new Song(song.title, song.file);
350 songList.push(tmpSong);
351 songsStr += "[" + song.title + "]";
352 }
353
354 //pictures要素の中のpicture要素をひとつずつ調べます
355 for each(var picture:Object in dataXml.pictures.picture) {
356 trace("name:" + picture.file);
357 var tmpPicture:Picture = new Picture();
358 tmpPicture.setFileName(picture.file);
359 tmpPicture.setSpan(picture.span);
360 picturePropatyArray.push(tmpPicture);
361 picturesStr += "[" + picture.file + ":"+picture.span+"]";
362 }
363
364 label.text = songsStr + "\n" + picturesStr;
365
366 }
367
368 private function loadPicture(pictureName:String):void{
369 var loader:Loader = new Loader();
370 loader.x=0;
371 loader.y=0;
372 loader.load(new URLRequest(pictureName));
373 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
374
375 pictureLoaderArray.push(loader);
376 }
377
378 private function fadeOut(pic:Loader, fadeOutTime:int) :void{
379 Tweener.addTween(pic, {alpha:0,time:fadeOutTime,onComplete:function() :void { picHolder.removeChild(pictureLoaderArray[currentSlideNum-1]); }});
380 }
381
382 private function fadeIN(pic:Loader, fadeInTime:int) :void{
383 pic.alpha=0;
384 Tweener.addTween(pic, {alpha:1,time:fadeInTime});
385 }
386
387 private function onLoaded(event:Event) :void{
388 var w:int = event.target.content.width;
389 var h:int = event.target.content.height;
390 var preW:Number = w/(stage.stageWidth);
391 var preH:Number = h/(stage.stageHeight);
392 var preSizeMin:Number = 0;
393 var preSizeMax:Number = 0;
394
395 if(preW < 1 || preH < 1){
396 preSizeMin = Math.max(preW,preH);
397 w = w/preSizeMin;
398 h = h/preSizeMin;
399
400 event.target.content.width = w;
401 event.target.content.height = h;
402
403 }
404
405 if( preW>=1 || preH>=1 ){
406 preSizeMax = Math.max(preW,preH);
407 w = w/preSizeMax;
408 h = h/preSizeMax;
409
410 event.target.content.width = w;
411 event.target.content.height = h;
412 }
413
414 //event.target.content.x -= w/2;
415 //event.target.content.y -= h/2;
416
417 }
418
419 private function soundHandler(event:Event) :void{
420 stop();
421 }
422 }
423 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26