んで、mx.utils.Base64Decoderを使うときにちょっと躓いたのでメモ。
修正個所は、zlib圧縮をやめたのと、
修正前はライブラリを使ってBase64を扱っていたのですが、どうやらFlex4には最初から
mx.utils.Base64Decoder
なるものがあるらしいので使ってみることにした。
*自分はFlash Builder 4で開発してます。
まず、普通にAS3プロジェクトを作ってもBase64Decoderをインポートできない。
「framework.swc」というswcファイルが必要になります。
Base64Encoder/Base64Decoderを使う
これはSDKがあるディレクトリの、[frameworks/libs]の中にあります。
しかしまだエラーが残るので厄介。
Base64Decoder 使おうとしたら「リソースバンドルutilsを解決できません」とか言い出したのでやっつけた
なぜかダミーのフォルダを作らないといけないようです・・・
あとは問題なく使えます。
設定さえ終われば便利です。
以下ソースコード。
package
{
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.ByteArray;
import mx.utils.Base64Decoder;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.easing.Cubic;
import org.libspark.betweenas3.easing.Quad;
import org.libspark.betweenas3.tweens.ITween;
public class DC extends Sprite
{
private function Base64toByteArray(data:String):ByteArray
{
var byteArray:ByteArray;
var base64Decoder:Base64Decoder = new Base64Decoder();
base64Decoder.decode(data);
try {
byteArray = base64Decoder.toByteArray();
byteArray.position = 0;
} catch (e:Error) {
return null;
}
return byteArray;
}
private const R:uint = 60;
private const W:Number = stage.stageWidth / 2;
private const H:Number = stage.stageHeight / 2;
private var _letter:Array = [];
private var _ball:Ball;
private var _temp:TextField = new TextField();
private var _bounceTiem:Number = 0.36;
public function DC()
{
stage.scaleMode = StageScaleMode.SHOW_ALL;
stage.frameRate = 60;
var param:Object = loaderInfo.parameters;
var word:String = param["w"];
if(word == null)
word = "Dreamcast";
else {
var ba:ByteArray = new ByteArray();
ba = Base64toByteArray(word);
if(!ba) {
navigateToURL(new URLRequest("/dc/"));
} else {
word = ba.readUTFBytes(ba.length);
}
}
_temp.text = word;
var format:TextFormat = new TextFormat(null, R);
_temp.setTextFormat(format);
for(var i:int = 0; i < _temp.text.length; i++)
{
var tf:TextField = new TextField();
tf.text = _temp.text.charAt(i);
tf.selectable = false;
tf.setTextFormat(format);
if(i)
tf.x = _letter[i-1].x + _letter[i-1].textWidth;
else
tf.x = W - _temp.textWidth / 2;
tf.y = H + R/2;
_letter.push(tf);
}
_ball = new Ball();
_ball.filters = [new BlurFilter()];
_ball.x = _letter[0].x - R*2.2;
_ball.y = _letter[0].y - R*4;
addChild(_ball);
var tween:ITween = BetweenAS3.bezierTo(_ball, {x: _letter[0].x + _letter[0].textWidth, y: _letter[0].y + 35}, {x: _letter[0].x + R, y: _letter[0].y - R}, 2, Cubic.easeIn);
tween.onComplete = bounce;
tween.onCompleteParams = [1];
tween.play();
}
private function bounce(n:uint):void
{
character(n-1);
var tween:ITween = BetweenAS3.bezierTo(_ball, {x: _letter[n].x + _letter[n].textWidth, y: _ball.y}, {x: _letter[n].x + _letter[n].textWidth / 4, y: _letter[n].y - 10}, _bounceTiem);
if(_bounceTiem >= 0.22) {
_bounceTiem -= 0.02;
}
if(n < _temp.text.length - 1)
tween.onComplete = function():void
{
bounce(n+1)
};
else
tween.onComplete = ぴょーん;
tween.play();
}
private function character(index:uint):void
{
addChild(_letter[index]);
BetweenAS3.tween(_letter[index], {y: _letter[index].y, alpha: 1}, {y: _letter[index].y + 20, alpha: 0}).play();
}
private function ぴょーん():void
{
character(_temp.text.length - 1);
var tween:ITween = BetweenAS3.bezierTo(_ball, {x: W, y: _letter[0].y - R*0.8}, {x: (W + _ball.x) / 2, y: _letter[0].y - R*5}, 1.2, Quad.easeOut);
tween.play();
tween.onComplete = ぐるぐる;
}
private function ぐるぐる():void
{
var sp:Sprite = new Sprite();
sp.filters = [new BlurFilter()];
addChild(sp);
sp.graphics.lineStyle(6, _ball.color);
sp.graphics.moveTo(_ball.x, _ball.y);
addEventListener(Event.ENTER_FRAME, onEnterFrame(sp));
var tweenArray:Array = [];
for(var i:int = 0; i < 900; i++)
{
var toX:Number = _ball.x - R * i / 720 * Math.cos(i * Math.PI / 180);
var toY:Number = _ball.y - R * i / 720 * Math.sin(i * Math.PI / 180);
tweenArray.push(BetweenAS3.to(_ball, {x: toX, y: toY}, 0.002));
}
var tween:ITween = BetweenAS3.serialTweens(tweenArray);
tween.onComplete = function():void
{
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
sp.graphics.lineTo(_ball.x, _ball.y);
removeChild(_ball);
};
tween.play();
}
private function onEnterFrame(sp:Sprite):Function
{
return function(e:Event):void
{
sp.graphics.lineTo(_ball.x, _ball.y);
};
}
}
}
import flash.display.Sprite;
class Ball extends Sprite
{
private var _color:uint;
public function get color():uint
{
return _color;
}
public function Ball(j:Boolean = true) {
if(j)
{
graphics.beginFill(0xea5504);
_color = 0xea5504;
} else {
graphics.beginFill(0x0000FF);
_color = 0x0000FF;
}
graphics.drawCircle(0, 0, 4);
graphics.endFill();
}
}
0 件のコメント:
コメントを投稿