Forked from: felicacontest2010's FeliCa Flash Contest - FeliCa Search sample diff:945 ドットフ絵リカ(ドットフェリカと読む) 連動アプリ 第2弾 ブロック崩し tokufxug forked:0favorite:0lines:715license : see code comments modified : 2010-02-22 00:05:10 Embed Tweet package { import com.sony.jp.felica.FeliCaControl; import com.sony.jp.felica.FeliCaOpenReaderWriterAutoRequest; import com.sony.jp.felica.FeliCaOpenReaderWriterAutoResponse; import com.sony.jp.felica.FeliCaPollingAndGetCardInformationRequest; import com.sony.jp.felica.FeliCaPollingAndGetCardInformationResponse; import com.sony.jp.felica.FeliCaSessionRequest; import com.sony.jp.felica.FeliCaSessionResponse; import com.sony.jp.felica.NFCType3TagRequest; import com.sony.jp.felica.NFCType3TagResponse; import com.sony.jp.felica.event.FeliCaStatusEvent; import com.sony.jp.felica.event.OpenStatusEvent; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.ui.Keyboard; import flash.utils.ByteArray; import flash.utils.Timer; import flash.ui.Mouse; [SWF(width="440", height="480", backgroundColor="#FFCCCC", frameRate=60)] public class DotoGame extends Sprite { /** * FeliCaコントロール */ private var fCtrl:FeliCaControl = null; /** * ボール */ private var ball:Ball = null; /** * ドット絵データ情報 */ private var dm:DotoMap = null; /** * プレイヤー用のドット絵データインスタンス */ private var player:DotoMap = null; /** * ステージ用ドットマップ */ private var stageMap:DotoMap = null; /** * 現在、遊んでいるステージ */ private var nowStage:uint = 0; /** * プレイ中フラグ * */ private var isPlay:Boolean = false; private var readTime:Timer = new Timer(2000); /** * ステージ配列 * */ private var stageStrArray:Array = [ "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~!!!!!!~!!!!!!!~[~~~~~~[~!!!!!!!~~[[[[~~!!!!!!!!~[[[[[[~!!!!!!!!~[ssss[~!!!!!!!!!~~~~~~!!!!!!!!!!!~[[~!!!!!!", "!!!!~!!!!!!~!!!!!!!~m~~~~~~m~!!!!!~mmmmmmmmmm~!!!!~mmmmmmmmmm~!!!~mmmmmmmmmmmm~!!~~~~mmmmmm~~~~!~mmmmmmmmmmmmmm~~mm~mmmmmmmmm~m~~mm~mmmmmmmmm~m~~iiii~mm~mm~iii~~iiiim~~m~~miii~!~mmmmmmmmmmmm~!!!~~~~~~~~~~~~!!", "!!!!~!!!!!!~!!!!!!!~m~~~~~~m~!!!!!~mmmmmmmmmm~!!!!~~~mmmmm~~~~!!!~mmm~~mm~mmmm~!~mm~~mmmmm~~mmm~~m~mm~mmm~mm~mm~~m~mm~mmm~mm~mm~~mm~~mmmmm~~mmm~~iiiim~~~mmiiii~~iiii~mmm~~iiii~!~mmm~mmmm~mmm~!!!~~~~~~~~~~~~!!", "!!!!!!!!!n!n!!!!!!!!!!!!!nnn!!!!!!!!!!!!!!n!!!!!!hhh!!!!!!!!hhh!hkkkhhhhhhhhkkkhhkkhkkkkkkkkhkkhhkhkkkkkkkkkkhkhhhkk~kkkkkk~kkhh!hkiijkkkkjiikh!!hkkkk~k~k~kkkh!!!hkkkk~k~kkkh!!!!!hhhhhhhhhh!!!!!!!!!hkkh!!!!!!", "!!!!!!~!!!!!!!!!!!!!!~n~!!!!!!!!~~~~~~~~~~~~~!!!~|||||~|||||~!!!~~~~~~~~~~~~~~!!~|||||||||||~!~!~|~~~|||~~~|~~!~~|||||~|||||~!!~~|||||~|||||~!!~~|||||~|||||~!!~~||~~~~~~~||~!!~~|||||||||||~!!~~~~~~~~~~~~~~!~!", "!!!!|!!!!!!!!!!!!!!|n|!!!!!!!!!!~~~~~~~~~~~~!!!!~}}}}}}}}~}~!!!!~~}}}}}~}~}~!!!!~~~}}}~~~~}~!!!!~~}}}}}~}~}~!!!!~}}}}}}}}~}~!!!!~}}}}}}}}~}~!!!!~~~~~~}}}~}~!~~!~m~m~m~}}~}~!~!!~~m~m~~}}~}~~~!~~~~~~~~~~~~}}}~~", "!!!!!!!~~!!!!!!!!!!!!!~,,~!!!!!!!!!!!!~,,~!!!!!!!!!!~~,,,,~~!!!!!!!~,,,,,,,,~!!!!!~mm,,,,,,,,~!!!~mm,,,,,,,,,,~!~,m,,m,,,,m,,,,~~,,,m,m,,m,m,,,~~,,,m,m,,m,m,,,~~,,b,m,,,,m,b,,~!~~,bbbbbbbb,~~!!!!~~~~~~~~~~!!!"] private var mes:TextField = null; public function DotoGame() { mes = new TextField(); addChild(mes); readFeliCa(); } /** * カード書き込み有無 * */ private var isWrite:Boolean = true; /** * * */ private function onEnterFrame(event:Event):void { removeEventListener(Event.ENTER_FRAME, onEnterFrame); ball.move(); if (!doExecutePlayerHit(player, ball)) { doExecuteHit(dm, true); doExecuteHit(stageMap, false); } if (stageMap.blockCount <= 0) { if (nowStage >= stageStrArray.length) { doExecuteEnd("GAME CLEAR"); return; } else { createStage(); } } else if (dm.blockCount <= 0) { doExecuteEnd("GAME OVER"); return; } addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function doExecutePlayerHit(player:DotoMap, ball:Ball):Boolean { var isLeftBall:Boolean = false; var pX:uint = player.x + 180; var isHit:Boolean = false; if (player.hitTestPoint(ball.x, ball.y, false)) { isHit = true; ball.my = -ball.my; } return isHit; } private function doExecuteHit(instance:DotoMap, isAccess:Boolean):void { const yLen:uint = instance.dotoSpriteArray.length; const xLen:uint = instance.dotoSpriteArray[yLen-1].length; for (var i:uint = 0; i < yLen; i++) { for (var j:uint = 0; j < xLen; j++) { if (instance.dotoSpriteArray[i][j] == null) { continue; } var dd:DotoData = instance.dotoSpriteArray[i][j] as DotoData; var isHit:Boolean = ball.isHit(dd); if (isHit) { switch (dd.life) { case 2: instance.colorDataArray[i][j] = "o"; dd.draw(0xff3300); break; case 1: instance.colorDataArray[i][j] = "K"; dd.draw(0x663366); break; case 0: instance.colorDataArray[i][j] = "{"; dd.draw(0x666666); break; } if (dd.life <= -1) { instance.colorDataArray[i][j] = "!"; dd.visible = false; instance.blockCount--; trace(instance.blockCount); } i = yLen; break; } } } if (isWrite && isHit && isAccess) { writeFeliCa(); isWrite = false; } } // FeliCa private function mainFeliCa():void { var port:uint = 10250; // インスタンス生成 fCtrl = new FeliCaControl(); // 接続前にイベント登録 fCtrl.addEventListener(OpenStatusEvent.OPEN_FAILURE, onFailureHandler); fCtrl.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onCompleteHandler); fCtrl.open(port, "__FELICA_STANDARD_KEY__", ""); //fCtrl.open(port); trace("OPEN中"); } private function onCompleteHandler(event:OpenStatusEvent):void { removeEvents(); configureEventListeners(); doOpenRW(); trace("OPEN正常"); } /** * リーダライタの読み込み開始 */ private function doOpenRW():void { trace("リーダー/ライタOPEN"); fCtrl.access(new FeliCaOpenReaderWriterAutoRequest()); } private function configureEventListeners(isAdd:Boolean = true):void { if (isAdd) { // リスナー登録 fCtrl.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete); fCtrl.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure); fCtrl.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError); } else { // リスナー削除 fCtrl.removeEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete); fCtrl.removeEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure); fCtrl.removeEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError); } } private function onFeliCaAccessFailure(event:FeliCaStatusEvent):void { trace(event.object); isWrite = true; fCtrl.close(); if (!readTime.hasEventListener(TimerEvent.TIMER)) { readTime.addEventListener(TimerEvent.TIMER, onReadTime); readTime.start(); } } private function onFeliCaAccessParameterError(event:FeliCaStatusEvent):void { trace(event.object); isWrite = true; fCtrl.close(); if (!readTime.hasEventListener(TimerEvent.TIMER)) { readTime.addEventListener(TimerEvent.TIMER, onReadTime); readTime.start(); } } private function onFeliCaAccessComplete(event:FeliCaStatusEvent):void { const o:Object = event.object; trace("response"); if (o is FeliCaOpenReaderWriterAutoResponse) { doPolling(); return; } onFeliCaHandler(event); } /** * ポーリング実行 */ private function doPolling():void { var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest(); request.systemCode = "FFFF"; fCtrl.access(request); } private function onFailureHandler(event:OpenStatusEvent):void { trace(event.object); isWrite = true; //removeEvents(); //destory(); fCtrl.close(); if (!readTime.hasEventListener(TimerEvent.TIMER)) { readTime.addEventListener(TimerEvent.TIMER, onReadTime); readTime.start(); } } private const FELICA_R:uint = 0; private const FELICA_W:uint = 1; private var accessFeliCa:int = -1; private function readFeliCa():void { accessFeliCa = FELICA_R; if (readTime) { readTime.stop(); readTime.removeEventListener(TimerEvent.TIMER, onReadTime); } mes.text = "FeliCa 読み込み中..."; mes.autoSize = TextFieldAutoSize.LEFT; mes.mouseEnabled = false; addChild(mes); mainFeliCa(); } private function writeFeliCa():void { accessFeliCa = FELICA_W; if (readTime) { readTime.stop(); readTime.removeEventListener(TimerEvent.TIMER, onReadTime); } mainFeliCa(); } private function createByte():String { var data:String = ""; for (var i:uint = 0; i < dm.colorDataArray.length; i++) { data+=dm.colorDataArray[i].join(""); } trace("書き込み対象データ" + data); const b:ByteArray = new ByteArray(); b.writeUTFBytes(data); var result:String = ""; var temp:String; for (i = 0; i < b.length; i++) { temp = b[i].toString(16); if (temp.length != 2) { temp = "0" + temp; } result += temp; } trace("書き込み対象データ" + result); return result; } /** * カード専有開始 * @param event FeliCaHoldEvent */ private function onFeliCaHandler(event:FeliCaStatusEvent):void { const o:Object = event.object; if (o as FeliCaPollingAndGetCardInformationResponse) { var req:FeliCaPollingAndGetCardInformationResponse = o as FeliCaPollingAndGetCardInformationResponse; removeEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaHandler); switch (accessFeliCa) { case FELICA_R : doNfcType3TagRead(); break; case FELICA_W : doNfcType3TagWrite(); break; } } // NFCType3TagResponseによるレスポンス if (o is NFCType3TagResponse) { // NFCType3TagReponseの型キャスト var response:NFCType3TagResponse = o as NFCType3TagResponse; // カード読み込みの場合 if (response.type == NFCType3TagResponse.READ) { mes.text = "FeliCa 読み込み完了しました"; // カードに保存している情報を取得 var readData:String = response.data; // 情報は文字コードを16進数(0xなし)で保持している為、 // 2文字後とに読み込む為のステップ値 var nextData:uint = 2; var dotoStr:String = ""; // 読み込みの文字コードから文字に変換していく。 for (var i:uint=0; i < readData.length; i +=nextData) { var c:uint = uint("0x" + readData.substring(i, (i + nextData))); var charStr:String = String.fromCharCode(c); dotoStr+=charStr; } // ドットマップ作成 dm = addChildDotoMap(dm, dotoStr, 8, 20, 46); // プレイヤー作成 player = addChildDotoMap(player, dotoStr, 4, 46, 76); if (!isPlay) { stage.addEventListener(KeyboardEvent.KEY_DOWN, onPlayerMoveEventHandler); stage.focus = player; // ステージ作成 createStage(); // 画面に表示反映 ball = new Ball(); addChild(ball); mes.text = "クリックでスタート"; stage.addEventListener(MouseEvent.CLICK, onMouseClick); isPlay = true; } stage.focus = null; isWrite = true; fCtrl.close(); if (isPlay && !readTime.hasEventListener(TimerEvent.TIMER)) { readTime.addEventListener(TimerEvent.TIMER, onReadTime); readTime.start(); } // カード書き込みの場合 } else if (response.type == NFCType3TagResponse.WRITE) { isWrite = true; fCtrl.close(); if (!readTime.hasEventListener(TimerEvent.TIMER)) { readTime.addEventListener(TimerEvent.TIMER, onReadTime); readTime.start(); } } } } private function onMouseClick(event:MouseEvent):void { stage.removeEventListener(MouseEvent.CLICK, onMouseClick); addEventListener(Event.ENTER_FRAME, onEnterFrame); readTime.addEventListener(TimerEvent.TIMER, onReadTime); readTime.start(); } private function onReadTime(event:TimerEvent):void { if (isWrite) { readTime.removeEventListener(TimerEvent.TIMER, onReadTime); readFeliCa(); isWrite = false; } } private function doNfcType3TagRead():void { // NFC Type3 Tag のデータを読み込みする為の情報の設定 var request:NFCType3TagRequest = new NFCType3TagRequest(); request.type = NFCType3TagRequest.READ; // NFC Type3 Tag データを読み込み要求 // NFC Type3 Tag データの読み込みを実行 fCtrl.access(request); } private function doNfcType3TagWrite():void { // NFC Type3 Tag のデータを読み込みする為の情報の設定 var request:NFCType3TagRequest = new NFCType3TagRequest(); request.type = NFCType3TagRequest.WRITE; // NFC Type3 Tag データを読み込み要求 request.data = createByte(); trace("書き込み対象データ" + request.data); // NFC Type3 Tag データの読み込みを実行 fCtrl.access(request); } private function removeEvents():void { fCtrl.removeEventListener(OpenStatusEvent.OPEN_COMPLETE, onCompleteHandler); fCtrl.removeEventListener(OpenStatusEvent.OPEN_FAILURE, onFailureHandler); fCtrl.removeEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete); fCtrl.removeEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure); fCtrl.removeEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError); } /** * イベントの削除とインスタンス変数null初期化<br /> * FeliCa Controlerはクローズ処理も行っている */ private function destory():void { isWrite = true; removeEvents(); fCtrl.close(); fCtrl = null; } /** * ドットマップデータを作成、描画、表示まで */ private function addChildDotoMap( instance:DotoMap, value:String, size:uint, addX:uint, addY:uint, life:uint = 0):DotoMap { if (!isPlay) { instance = new DotoMap(size); } instance.data = value; instance.draw(addX, addY, life); if (!isPlay) { addChild(instance); } return instance; } /** * */ private function onPlayerMoveEventHandler(event:KeyboardEvent):void { var keyCd:uint = event.keyCode; var addSpeed:int = (ball.mx <= 0 ? ball.mx : -ball.mx) + (ball.my <= 0 ? ball.my : -ball.my); addSpeed = addSpeed < 0 ? -addSpeed : addSpeed; addSpeed = addSpeed / 2; switch (keyCd) { case Keyboard.LEFT: player.x-=(10 + addSpeed); break; case Keyboard.RIGHT: player.x+=(10 + addSpeed); break; } } private function createStage():void { if (stageMap != null) { removeChild(stageMap); } if (nowStage >= stageStrArray.length) { nowStage = 0; } stageMap = addChildDotoMap(stageMap, stageStrArray[nowStage], 20, 3, 0, nowStage); nowStage++; addChild(stageMap); } private function doExecuteEnd(message:String):void { graphics.beginFill(0xFFCCCC); graphics.drawRect(0, 0, 440, 480); graphics.endFill(); graphics.beginFill(0xFFFFCC); var tf:TextField = new TextField(); tf.x = 440 / 2; tf.y = 480 / 2; tf.text = message; addChild(tf); } } } import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; class DotoMap extends Sprite { public var life:uint = 0; private var _size:uint = 2; public var blockCount:int = 0; public function DotoMap(size:uint = 2) { _size = size; } public function get size():uint { return _size; } /** * ドット絵情報文字列(バイトの16進文字列) */ private var _data:String = ""; public var colorDataArray:Array = [ ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ["!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!", "!"], ]; public var dotoSpriteArray:Array = [ [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], ]; public function get data():String { return _data; } public function set data(value:String):void { _data = value; } /** * 描画 */ public function draw(addX:uint, addY:uint, vLife:uint):void { var len:uint = data.length; blockCount = 0; for (var i:uint = 0; i < len; i++) { var yIdx:uint = uint(i / 16); var xIdx:uint = uint(i % 16); var px:int = xIdx + addX; var py:int = yIdx + addY; var s:String = data.substr(i, 1); colorDataArray[yIdx][xIdx] = "!"; var dd:DotoData = dotoSpriteArray[yIdx][xIdx]; // 0x000000は作成しない if (s != "!") { colorDataArray[yIdx][xIdx] = s; var isChild:Boolean = false; if (dd) { dd = dd.reload(px, py, s, _size, vLife); dd.visible = true; isChild = true; } else { dd = new DotoData(px, py, s, _size, vLife); } if (!isChild) { addChild(dd); } dotoSpriteArray[yIdx][xIdx] = dd; blockCount++; } else { if (dd) { dd.visible = false; dd = null; } } } } } /** * ドットデータ(1個) * */ class DotoData extends Sprite { public var life:int = 0; /** * カラーパレットのObject */ private static const pal:Object = [ {0x000000 : "!"}, {0x0000ff : "#"}, {0x0033ff : "$"}, {0x0066ff : "%"}, {0x0099ff : "&"}, {0x00ccff : "'"}, {0x00ffff : "("}, {0x000099 : ")"}, {0x009999 : ","}, {0x00cc99 : "-"}, {0x00ff99 : "."}, {0x000099 : "/"}, {0x003399 : "0"}, {0x006699 : "1"}, {0x3300ff : "2"}, {0x3333ff : "3"}, {0x3366ff : "4"}, {0x3399ff : "5"}, {0x33ccff : "6"}, {0x33ffff : "7"}, {0x330099 : "8"}, {0x333399 : "9"}, {0x336699 : ":"}, {0x339999 : ";"}, {0x33cc99 : "<"}, {0x33ff99 : "="}, {0x330033 : ">"}, {0x333333 : "?"}, {0x336633 : "@"}, {0x339900 : "A"}, {0x33cc00 : "B"}, {0x33ff00 : "C"}, {0x6600ff : "D"}, {0x6633ff : "E"}, {0x6666ff : "F"}, {0x6699ff : "G"}, {0x66ccff : "H"}, {0x66ffff : "I"}, {0x660066 : "J"}, {0x663366 : "K"}, {0x666666 : "L"}, {0x669966 : "M"}, {0x66cc66 : "N"}, {0x66ff66 : "O"}, {0x990099 : "P"}, {0x993399 : "Q"}, {0x996699 : "R"}, {0x999999 : "S"}, {0x99cc99 : "T"}, {0x99ff99 : "U"}, {0x990000 : "V"}, {0x993300 : "W"}, {0x996600 : "X"}, {0x999900 : "Y"}, {0x99cc00 : "Z"}, {0x99ff00 : "["}, {0xcc00ff : "\\"}, {0xcc33ff : "]"}, {0xcc66ff : "^"}, {0xcc99ff : "_"}, {0xccccff : "`"}, {0xccffff : "a"}, {0xcc0066 : "b"}, {0xcc3366 : "c"}, {0xcc6666 : "d"}, {0xcc9966 : "e"}, {0xcccc66 : "f"}, {0xccff66 : "g"}, {0xff00ff : "h"}, {0xff33ff : "i"}, {0xff66ff : "j"}, {0xff99ff : "k"}, {0xffccff : "l"}, {0xffffff : "m"}, {0xff0000 : "n"}, {0xff3300 : "o"}, {0xff6600 : "p"}, {0xff9900 : "q"}, {0xffcc00 : "r"}, {0xffff00 : "s"}, {0xFFCC66 : "*"}, {0xFFFF99 : "+"}, {0x00FF00 : "t"}, {0x00CC00 : "u"}, {0x009900 : "v"}, {0x006600 : "w"}, {0x003300 : "x"}, {0x00FF33 : "y"}, {0x009933 : "z"}, {0x666666 : "{"}, {0x999999 : "|"}, {0xCCCCCC : "}"}, {0x000001 : "~"}]; /** * サイズ */ public var SIZE:uint = 2; /** * カラー情報 */ private var _color:uint = 0x000000; /** * カラーパレット用文字列 */ private var _colorStr:String = null; /** * カラー文字のバイト(16進数文字列) */ private var _colorByteStr:String = null; /** * コンストラクタ * @param px x位置 * @param py y位置 * @param c カラー情報 */ public function DotoData(px:int, py:int, cd:String, size:uint = 2, life:uint = 0) { _colorByteStr = cd; SIZE = size; x = px * SIZE; y = py * SIZE; draw(toColorData(cd)); } public function reload(px:int, py:int, cd:String, size:uint = 2, life:uint = 0):DotoData { _colorByteStr = cd; SIZE = size; x = px * SIZE; y = py * SIZE; draw(toColorData(cd)); return this; } /** * 1ドット生成(描画) * @param value カラー情報 */ public function draw(value:uint):void { _color = value; graphics.beginFill(_color); graphics.drawRect(0, 0, SIZE, SIZE); graphics.endFill(); } /** * 読み込みバイトコード文字列(16進数)からカラーコードに変換して返却 * */ public function toColorData(cd:String):uint { var color:uint = 0x000000; for each (var p:Object in pal) { for (var c:* in p){ if (p[c] == cd) { return c; } } } return color; } } class Ball extends Shape { public var mx:Number = 2; public var my:Number = 4; public var rad:Number = 4; private var color:uint = 0x000000; private var power:Number = 1.0; public function Ball() { x = 220; y = 280; draw(color); } public function draw(value:uint):void { graphics.lineStyle(0, 0xffffff, .1); graphics.beginFill(value); graphics.drawCircle(0, 0, rad); graphics.endFill(); } public function move():void { x+=mx; y+=my if (x < 0) { x = 0; if (mx < 0) { mx+=-0.05; } else { mx+=0.05; } mx = -mx; } if (y < 0) { y = 0; if (my < 0) { my+=-0.05; } else { my+=0.05; } my = -my; } if (x > 440 - rad) { x = 440 - rad; if (mx < 0) { mx+=-0.05; } else { mx+=0.05; } mx = -mx; } if (y > 480 - rad) { y = 480 - rad; if (my < 0) { my+=-0.05; } else { my+=0.05; } my = -my; } reset(); } public function isHit(value:DotoData):Boolean { const ax:int = int(x - value.x); const ay:int = int(y - value.y); if (!value.visible || ax < 0 || ax > value.SIZE || ay < 0 || ay > value.SIZE) { return false; } var px:int = int(x - value.x) % value.SIZE; var py:int = int(y - value.y) % value.SIZE; var isHit:Boolean = false; const X_MAX:uint = value.SIZE const Y_MAX:uint = value.SIZE if (px < X_MAX || px >= value.SIZE - X_MAX) { if (mx < 0) { mx+=-0.05; } else { mx+=0.05; } mx = -mx; isHit = true; } if (!isHit && py < Y_MAX || py >= value.SIZE - Y_MAX) { if (my < 0) { my+=-0.05; } else { my+=0.05; } my = -my; isHit = true; } if (isHit) { value.life-=power; value.life <= -1 ? -1 : value.life; } reset(); return isHit; } private function reset():void { if (mx >= 14) { mx = 2; rad+=1; color+=0x030000; power+=.5; draw(color); } if (my >= 14) { my = 4; rad+=1; color+=0x030000; power+=.5; draw(color); } if (rad >= 20) { rad = 20; } } } Code Fullscreen Preview Fullscreen FeliCa Sony puyoDoto ドットフ絵リカ hasEventListener trace start Boolean String type stop message addChild Object reset uint removeEventListener TextFieldAutoSize.RIGHT mouseEnabled substring hitTestPoint String.fromCharCode visible join