AIRアプリで、iknowの問題を次から次へと表示します。
半透明ウィンドウでやりたいなぁ思ってて、
何がいいか悩んだのですが結果的にAIRで作りました。
このアプリを適当に起動してボーっと眺めてるだけで
少しは英語を覚えられたらいいなぁ思います。
package { import flash.events.*; import flash.display.*; import flash.text.*; import flash.net.*; // import flash.utils.*; import flash.filters.DropShadowFilter; import flash.media.Sound; import flash.geom.Matrix; public class iknowView extends Sprite { private var tf:TextField; private var tf2:TextField; private var username:String= "h_sakurai"; private var txt_fmt:TextFormat = new TextFormat(); private var txt_fmt2:TextFormat = new TextFormat(); private var loader:Loader=new Loader(); private function onMoveCommand(event:MouseEvent):void{ stage.nativeWindow.startMove(); } public function iknowView() { this.y = 10; var matrix:Matrix = new Matrix(); matrix.createGradientBox(300, 50, 0, 0, 0); graphics.lineStyle(3, 0xff0000,0); // graphics.beginFill(0xff0000,0.3); graphics.beginGradientFill( GradientType.LINEAR, [0x115500, 0x115500], [0.6, 0], [0, 255], matrix); graphics.drawRoundRect(20, 2, 300, 48, 10); graphics.endFill(); graphics.beginGradientFill( GradientType.LINEAR, [0xddff00, 0xddff00], [0.8, 0], [0, 255], matrix); graphics.drawRoundRect(18, 0, 300, 20, 10); graphics.endFill(); this.alpha = 0.95; stage.nativeWindow.alwaysInFront=true; stage.nativeWindow.x = 0; stage.nativeWindow.y = 0; stage.addEventListener(MouseEvent.MOUSE_DOWN, onMoveCommand); tf = new TextField(); tf.filters = [new DropShadowFilter(1, 45, 0x0, 1, 4, 4, 5, 1, false, false, false)]; tf.x = 20; tf.y = 17; tf.width = 800; tf.height = 300; tf.selectable = false; // txt_fmt.underline = true; txt_fmt.size = 30; txt_fmt.color = 0xffffff; tf2 = new TextField(); tf2.x = 20; tf2.filters = [new DropShadowFilter(1, 45, 0x446600, 1, 4, 4, 5, 1, false, false, false)]; tf2.width = 800; tf2.height = 300; tf2.selectable = false; txt_fmt2.underline = true; txt_fmt2.size = 12; txt_fmt2.color = 0xffffff; loader.x = 30; loader.filters = [new DropShadowFilter(6, 45, 0x000000, 0.8, 16, 16, 1, 1, false, false, false)]; loader.rotation = -5; loader.y = 50; loader.scaleX = 0.25; loader.scaleY = 0.25; addChild(loader); addChild(tf); addChild(tf2); sita = 0; addEventListener(Event.ENTER_FRAME, enterFrame); text("iknow view"); f(); } private function enterFrame(eventObj:Event):void { // 処理 loader.alpha = (-Math.cos(sita)+8)/9; sita += 0.05; loader.scaleX = loader.scaleY = (-Math.cos(sita)+8)/9 *0.30; } private var sita:Number; private var pos:int; private var listPos:int; private var listXML:XML; private var listArray:Array; private var posArray:Array; private var xml:XML; private function text(s:String):void { tf.text = s; tf.setTextFormat(txt_fmt); } private function text2(s:String):void { tf2.text = s; tf2.setTextFormat(txt_fmt2); } private function img(s:String):void { if(s==""){ loader.visible =false; return; } sita = 0; trace(s); loader.load(new URLRequest(s)); loader.visible = true; } private function play(s:String):void { if(s=="") return; var sound:Sound = new Sound(); sound.load(new URLRequest(s)); sound.play(); } private function f():void { var tt:TextField = tf; new Commands( function(event:Object):void { text(event.toString()); } ).load( "http://api.iknow.co.jp/lists.xml", // "http://api.iknow.co.jp/users/"+username+"/lists.xml?per_page=100", function(data:Object):void { // listPos = 0; listXML = XML(data); listArray = []; } ).label( "start" ).load( function():String{ if(listArray.length == 0) for(var i:int=0;i<listXML.list.length();i++) { listArray.push(i); } var listP:int = int(Math.random() * listArray.length); var listPos:int = listArray[listP]; listArray.splice(listP,1); var id:String = listXML.list[listPos].@id.toString(); id = id.replace(/^[^0-9]+/,""); var item_count:String = listXML.list[listPos].@item_count.toString(); text2(listXML.list[listPos].name[0].toString()); return "http://api.iknow.co.jp/lists/"+id+"/items.xml?include_sentences=false&per_page="+item_count;}, function(data:Object):void { xml = XML(data); posArray = []; for(var i:int=0;i<xml.items[0].item.length();i++) { posArray.push(i); } } ).label( "loop" ).run( function():String { var p:int = int(Math.random() * posArray.length); var pos:int = posArray[p]; trace("pos="+pos+" len="+posArray.length); posArray.splice(p, 1); var item:XML = xml.items[0].item[pos]; var english:String = item.cue[0].text[0].toString(); var japanese:String = item.responses[0].response[0].text[0].toString(); text(pos+". "+english + ":"+japanese); try { play(item.cue[0].sound.toString()); } catch (o:Object) { } try { img(item.sentences.sentence.image[0].toString()); } catch (o:Object){ loader.visible =false; } return null; } ).sleep( 10000 ).run( function():String { if(posArray.length == 0) { return "start"; } return "loop"; } ) .exec(); } } } import flash.net.*; import flash.events.*; import flash.utils.*; class Commands { private var loader:URLLoader = new URLLoader(); private var pos:int; private var labels:Object = {}; private var timer:Timer; public function Commands(errorFunction:Function) { pos = 0; errFun = errorFunction; loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler); loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); loader.addEventListener(Event.COMPLETE, completeHandler); // errFun("new commands"); } private var array:Array = new Array(); private var errFun:Function; public function load(url:Object, fun:Function):Commands { //errFun("load"); array.push("load"); array.push(url); array.push(fun); return this; } public function run(fun:Function):Commands { array.push("run"); array.push(fun); return this; } public function sleep(time:int):Commands { array.push("sleep"); array.push(time); return this; } public function label(name:String):Commands { array.push("label"); array.push(name); return this; } public function exec():Commands { for(;pos<array.length;){ // errFun("exec "+array[pos]); var cmd:String = array[pos++]; switch(cmd) { case "load":{ var obj:Object = array[pos++]; var url:String; if(obj is String) url = String(obj); else { url = obj(); } //errFun("url="+url); var request:URLRequest = new URLRequest(url); try { loader.load(request); } catch (error:Error) { errFun(error); } break; } case "run": { //errFun("run:"+pos+":"+ array[pos]); var next:Object = array[pos++]; //errFun("nextfun:"+next); var nexts:String = next(); //errFun("next:"+nexts); if(nexts != null) { pos = labels[nexts]; //errFun("jmp"+pos); } // errFun("run"+pos+" len="+array.length); continue; } case "label": { var label:String = array[pos++]; labels[label] = pos; // errFun("labels["+label+"]="+pos); continue; break; } case "sleep": { var time:int = array[pos++]; // errFun("sleep"+time); var timer:Timer = new Timer(time, 1); timer.addEventListener( TimerEvent.TIMER, onTick ); timer.start(); break; } } break; } return this; } private function completeHandler(event:Event):void { var fun:Function = array[pos++]; fun(loader.data); exec(); } private function errorHandler(event:Event):void { errFun(event); } private function onTick(e:TimerEvent):void { //errFun("onTick "+pos); exec(); } }