無理やりフォントを読み込む
前回の記事でクロスドメインで読み込んだswfの埋め込みフォントをregisterFont出来ないと書いたが、バイナリとしてswfを読み込んでfontを取り出しているDenis Kolyako氏という方がいました。
http://etcs.ru/blog/as3/fontloader/
キリル文字で書かれてるのでサッパリ何が書いてあるのかわかりませんが、Demoページもソースも公開されていますのでなんとかなるでしょう。
No comments yet.
No trackbacks yet.
XML.removeChildは何処?
November 27, 2009 - 3:15 am
Tags: as3, removeChild, xml
Posted in ActionScript | No comments
え、removeChild()ってないの?
XML DOMにはappendChild()、removeChild()というメソッドでノードに子要素を追加・削除を行うことができますが、AS3のXMLにはremoveChild()メソッドがありません。appendChild()メソッドがあるのに、え?なんで?って気持ちにさせられた人もきっと多いでしょう。
livedocでXMLの解説をよんでみると、appendChild()メソッドの説明に「指定された子を XML オブジェクトのプロパティの最後に追加します。」と書いてあります。つまり、子はDOMでいうXMLノードではなく、オブジェクトの”プロパティ”として追加されます。
なので、DOMのremoveChild()のように子要素を削除するには、オブジェクトからプロパティを削除するような処理を行えばいいということになります。オブジェクトからプロパティを削除するには、delete演算子を使用します。(deleteで削除できるのは動的に追加されたプロパティのみ)。delete演算子はXMLListオブジェクトに対して用いると、複数の要素や属性を削除できます。
XML要素・属性の削除サンプル
XMLにはremoveChild()は無いよ。 – wonderfl build flash online
removeChild()メソッドを作るとしたら
private function removeChild(node:XML):XML{
var p:XML;
if(node != null){
if( (p = node.parent()) ){
delete p.children()[node.childIndex()];
}
[...]
ドメイン外から読み込んだ埋め込みフォントはregisterFontできないっぽい
December 29, 2008 - 4:40 pm
Tags: Flash, font, swf
Posted in ActionScript, Flash | No comments
クロスドメインで読み込んだswfから埋め込みフォントはregisterFontできないっぽい。
Fontクラスを参照しようとすると59行目でエラーとなる。
利用可能なフォントをリストアップ
December 28, 2008 - 1:48 am
Tags: as3, device, embed, Flash, font
Posted in ActionScript, Flash | No comments
Wonderflを試すってことで、利用可能なフォントをリストアップするサンプル。
利用可能なフォントはFont.enumerateFonts()によりFontを要素とする配列が得られる。配列には得埋め込みフォントしか含まれていないが、Font.enumerateFonts()の引数にtrueを渡すとDeviceフォントも配列に含まれるようになる。
Embedメタデータタグで埋め込んだSWF内のクラスにアクセス その2
December 24, 2008 - 3:39 pm
Tags: as3, assets, embed
Posted in ActionScript | No comments
前の記事では、LoaderクラスのloadBytesを使ってアセットを読み込んだが、次のような書き方もできるようです。
package
{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.events.Event;
import mx.core.MovieClipAsset;
public class AllowDomainSample extends MovieClip
{
[Embed(source="../assets/preloader.swf")]
private var _embedAssets:Class;
private var _mov:MovieClipAsset;
private var _flag:Boolean = false;
public function AllowDomainSample()
{
trace(’constructor’, _flag);
super();
_mov = new _embedAssets() as MovieClipAsset;
Loader(_mov.getChildAt(0)).contentLoaderInfo.addEventListener(Event.INIT, initHandler);
}
private function initHandler(event:Event):void{
trace(’init’);
var l:LoaderInfo = event.target as LoaderInfo;
var cls:Class = l.content.loaderInfo.applicationDomain.getDefinition("mtok.preloader.MtokPreloader") as Class;
addChild(new cls());
}
}
}
埋め込んだアセットのMovieClipAsset(もしくはStripAsset)に対してgetChildAt(0)して、さらにそれをLoaderにキャストして、contentLoaderInfoにアクセスしているわけですが、なんでこれでOKなのか謎(笑)
埋め込まれたアセットがどう処理されてるのかどっかに解説ないかなぁ。
Embedメタデータタグで埋め込んだswf内のクラスにアクセス
December 19, 2008 - 3:18 pm
Tags: as3, assets, embed, loadbytes
Posted in ActionScript | No comments
Embedメタデータタグをつかってswfをアセットとして埋め込んだ場合、MoviceClipAssetクラスとして扱われる。ここによると
埋め込んだ SWF ファイルのプロパティまたはメソッドに直接アクセスすることはできません。 ただし、 LocalConnection を使用してアクセスすることはできます。
なんてことが書いてあるので、Flashで書きだしたswfのクラスにアクセスするにはembedは使えないなんて思ってました。しかし、skinner氏がUsing Flash Symbols with Actionscript in Flexという記事で”Shake’n'Bake SWFs”と名付けた方法でEmbedメタデータタグで埋め込んだSwfからクラス定義を取り出す方法を紹介している。
なーるほどっ、バイナリとして埋め込んでloadBytesで読み込むわけですね。
アセットの埋め込みについてに記載があるとおり、mimetypeにapplication/octet-streamの指定を行えばバイナリとして埋め込まれるようです。
この方法、結構、定石なんですかね。
備考としては、loadBytesでロードしたswfはセキュリティドメインに読み込まれるので,
AIRの場合にセキュリティ的にアカン(Ted Patrick: Loader.load vs Loader.loadBytew)ってことになったので、実行可能なコードを読み込む場合はloadBytesにallowLoadBytesCodeExecutionをtrueに設定したLoaderContextを渡す必要があります。
サンプル
package
{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.events.Event;
import flash.system.LoaderContext;
import mtok.sample.ProgressBar;
/**
* …
* @author DefaultUser (Tools -> Custom Arguments…)
*/
public class LoadBytesSample extends MovieClip
{
[Embed(source = "my_progressbar.swf", mimeType = "application/octet-stream")]
private var _embAssets:Class;
private var _bar:ProgressBar;
public function LoadBytesSample()
{
super();
addEventListener(Event.ADDED_TO_STAGE, addedToStageHanlder);
}
private function addedToStageHanlder(e:Event):void
{
/*
* loadBytesしてもすぐには使用できない。
* 1フレーム待つか、Event.COMPLETEイベントを利用する。
[...]
sugarcookie メモその2
December 10, 2008 - 4:16 pm
Tags: as2, as3, framework, sugarcookie
Posted in ActionScript, Flash, library | No comments
続いて、ViewStackおよび、Viewについて、この2つのクラスは表示に関する処理をおこなうもので、通常、それぞれのクラスを継承したサブクラスで必要な処理を実装する。
ViewStackクラスのサブクラスでオーバーライドを行うメソッド
init()
コンストラクタ内で呼び出される、ここでViewクラスのインスタンスをregisterViewで追加してやる。
onAdded()
ステージに追加されたときに呼び出される
queueIntro()
config.xmlでhasIntroがtrueの場合、イントロが存在するとみなされて、queueIntro()が呼び出される。queueIntro()ではイントロを開始する処理を行う。イントロ終了後はcontinueAfterIntro()を呼び出してイントロ終了後の処理を開始する。initDisplay()はそのままだと呼び出されないので必要があれば、initDisplay()を呼び出す。
initDisplay()
おまかせ。
preTransitionHandler()
SWFAddressのonChange発生じに呼び出され、トランジションが始まる前
postTransitionHandler
トランジションが終了してViewが表示された後
makeTrackingCall
トラッキングコール
onProgressHandler()
必要に応じて
onProgressComplete
必要に応じて
Viewクラスでオーバーライドするメソッド
onShow()
Viewを表示させるトランジションをスタート。トランジション終了時にonShowComplete()を呼ぶ
onHide()
Viewを非表示にするトランジションをスタート。トランジション終了時にonHideComplete()を呼ぶ
reset()
Viewをリセット。他のViewが表示されるときに呼び出される。
onAdded()
ステージに追加されたときに呼び出される
sugarcookieメモその1
December 10, 2008 - 2:36 pm
Tags: as2, as3, Flex, framework
Posted in ActionScript | No comments
sugarcookieというフレームワークが、映画007の新作Quantum Of Solace(邦題:慰めの報酬)のHPに使用されているみて興味がでたので、ちょっとメモを取りつつコード読み。
SVNからソースを入手する
SVNからソースをダウンロードする。ディレクトリ構造は以下の通り。(Rev.152)
sugarcookie
├─ant_scripts
│ ├─docs
│ │ └─asdoc-output
│ └─sugarcookie
├─as2
│ └─sugarcookie
│ ├─adapters
│ ├─browser
│ ├─collections
│ ├─dataHandlers
│ ├─encryption
│ ├─events
│ ├─file
│ [...]
AS3のYAMLライブラリ
AS3むけのYAMLライブラリがないかなと探してみたら、as3yamlというライブラリがGoogle Codeで公開されていた。
Kirill SimonovのPython向けライブラリPyYAMLをAS3に移植したものらしい。
現在どの程度の完成度なのかちょっと解らないが、yamlドキュメントのデコード・エンコードは十分できるような感じ。
as3yaml – Google Code
デコード
YAMLをデコードしてするには、decode()もしくは、load()メソッドを使用する。
decode()にYAML文字列を渡すと、パースされたオブジェクトが得られる。load()メソッドはdecode()メソッドに加えてより細かい設定が可能。
デコードによって得られるオブジェクトの型はデコードするYAMLによって変わり、DictionaryかArrayのどちらかが生成される。
var obj:Object;
var s:String = new String(
"Profile:\n" +
" Name: Taro\n" +
" Age: 10\n" +
" City: Tokyo\n" +
" Zip: 101-1234\n" +
" Friends:\n" +
" – Jiro\n" +
" – Goro\n"
);
obj = YAML.load(s, new DefaultYAMLFactory(), new DefaultYAMLConfig());
trace(obj.Profile.Name); //Taro
trace(obj.Profile.Friends[0]); //Jiro
エンコード
エンコードはencode()もしくはdump()メソッドにより行う。
Object,Array,HashMapをエンコードしてくれる。
dump()メソッドに渡すYAMLConfigを使用すれば、インデントの幅等を設定できる。
var obj:Object = new Object();
obj.name [...]