カテゴリー別アーカイブ: ActionScript

AS3 ディスプレイの解像度を取得

Capabilitiesクラスにありました。

var w:int = Capabilities.screenResolutionX
var h:int = Capabilities.screenResolutionY

この値を元に破線などの飾られた線をあらかじめ繰り返しておけば、特に面倒なことをせずに常に横幅いっぱいに見える。…と思ったらディスプレイがデュアルの場合、片方だけの値しかとらない。ぬぉぉどうすればいいんだ。

そうか、ウインドウのサイズもあわせてもし上記のwよりも大きい、もしくは大きくなった時はデュアルであろうからその時は倍に増やすことにしよう。とりあえず。

as3 swfobject flashvarsでHTMLから値を渡す

swfobjectのflashvarsは第7引数です。ずーっとならなくって、なんで?と思っていたら第6引数に指定してました。間抜けすぎ…orz
ちなみにas2は _root.hoge みたいな感じでいいですが、as3で受け取る場合は以下のようにLoaderInfoクラスのparametersに値があるのでそこから値を受け取ります。

import flash.display.LoaderInfo;
var params:Object = loaderInfo.parameters;
var hoge:String = params["hoge"];

日本語フォント埋め込みの際の使用する漢字

Flashムービーに日本語を埋め込む場合その文字数の多さから埋め込むことが現実的ではないですが、文字を指定して追加することができるようです。

ちなみに埋め込めるフォントはライセンスの問題もあるので基本的に埋め込むことはできませんが、Adobe製である小塚明朝、小塚ゴシックは埋め込んでも大丈夫なようなので今回これを使用します。そのほかの現在使用できるフォントはAdobeのサイトでフォントの一覧が紹介されています。

数字、英文字、記号、かな含めてJIS第一水準の漢字を埋め込んで、そこからさらにこれは使わないだろうと思われる漢字を(独断と偏見で)削れば1250kbほどあったサイズが750kbにまで減らせました(削った文字は1000文字程度)。よくみればまだあると思うのでさらに減らせそうです。次は正規表現を使ってのカーニングかな。

以下は独断と偏見で削った後の漢字

亜阿哀愛逢葵悪握渥旭芦圧扱宛姐飴絢綾安庵按暗案闇杏以伊位依偉囲委威意易椅為畏異移維緯衣違遺医井亥域育郁一壱逸芋印員因引飲院隠韻右宇烏羽迂雨卯碓臼渦唄浦瓜噂云運雲餌営影映栄永泳洩英衛液益駅悦越閲円園宴延援沿演炎煙猿縁艶苑遠鉛塩於汚央奥往応押横欧王翁黄岡沖荻億屋憶臆桶牡乙俺恩温穏音下化仮何伽価佳加可嘉夏嫁家科暇果架歌河火稼箇花苛茄荷華菓蝦課貨迦過霞蚊我牙画芽賀雅駕介会解回塊壊廻快怪悔恢懐戒改魁械海灰界皆絵開階貝凱外咳概涯街該垣柿各拡格核殻確覚角隔革学岳楽額掛笠潟割喝恰括活渇滑葛且叶株刈瓦乾冠寒刊勧巻完官寛干幹患感慣換柑棺汗漢環甘監看竿管簡缶肝観貫還鑑間関韓館丸含岸玩眼岩頑顔願企危喜器基奇嬉寄希揮机旗既期機帰毅気汽畿祈季紀規記貴起軌輝飢鬼亀儀妓宜技欺疑祇義議吉吃喫詰却客脚虐逆丘久仇休及吸宮弓急救朽求泣灸球究級糾給旧牛去居巨拒拠挙許距漁魚亨享京供競共協叫境強恐恭挟教橋況狭胸興鏡響驚仰業局曲極玉勤均巾錦琴禁筋緊謹近金吟銀九倶句区苦駒具空遇隅串釧屑屈掘靴窪熊隈栗繰桑勲君薫訓群軍郡卦袈係傾兄啓圭型契形径恵慶慧憩掲携敬景桂渓系経継繋罫蛍計詣警軽鶏芸迎劇激隙桁欠決潔穴結血訣月件健兼券剣喧圏堅嫌建憲拳検権犬献研硯絹県肩見謙賢鍵険験元原厳幻弦減源玄現言限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡虎誇跨雇鼓五互伍午呉吾娯後御檎瑚語誤護交佼侯候倖光公功効勾厚口向后喉好孔孝宏工巧巷幸広康弘恒慌抗拘控攻昂晃更杭校構江洪浩港溝甲皇硬稿紅綱耕考肯航荒行講貢購郊鋼降項香高剛劫号合豪克刻告国黒腰惚骨込此頃今困婚昆根梱混紺魂佐左差査沙砂鎖座催再最妻宰彩才採栽歳済砕祭斎細菜裁載際剤在材罪財坂阪堺肴咲崎埼碕作削咋昨柵策索桜笹冊刷察拶撮札雑皿三傘参山撒散産算讃賛酸斬暫残仕仔伺使刺司史四士始姉姿子市師志思指支施旨枝止死氏祉私糸紙紫肢至視詞詩試誌資賜雌飼歯事似侍児字寺持時次滋治示耳自鹿式識軸七叱失室湿質実柴芝縞舎写射捨斜社紗者謝車遮借勺尺杓灼酌釈若寂弱主取守手朱殊狩珠種趣酒首受呪寿授樹収周宗就州修愁拾洲秀秋終習舟衆襲蹴週酬集什住充十従柔汁渋獣縦重銃宿祝縮粛塾熟出術述俊春瞬准循旬淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書諸助女序徐除傷勝匠升召商唱奨将小少尚庄床彰承招掌昇昌昭晶松沼消渉湘焼焦照症省硝祥称章笑粧紹衝裳訟証詔詳象賞鍾障上丈乗冗剰城場嬢常情条浄状畳蒸飾拭職色食尻伸信侵唇寝審心慎振新晋森浸深申疹真神紳芯親診身辛進針震人仁刃尽腎迅陣須酢図逗吹垂推水炊睡粋衰遂随瑞数杉菅澄寸世瀬是凄制勢姓征性成政整星晴正清生盛精聖声製西誠誓請青静斉税隻席惜昔析石積責赤跡碩切拙接折設節説雪絶舌仙先千占専川戦泉浅洗染旋線繊羨船薦詮践選閃鮮前善然全禅措曽楚狙祖租粗素組蘇訴創双倉壮奏爽層想捜掃挿操早巣槽漕争相窓総草荘装走送像増蔵贈造促側即息捉束測足速俗属族続卒袖其揃存孫尊村他多太汰妥打舵陀駄体堆対耐岱帯待怠態替滞胎袋貸退逮隊鯛代台大第題滝卓宅択拓沢琢託諾凧只叩但達辰奪脱棚谷誰丹単嘆坦担探旦淡炭短端胆誕団弾断暖段男談値知地恥智池稚置致遅築竹筑逐秩茶着中仲宙忠抽昼柱注虫酎駐猪著貯丁兆喋帖帳庁張彫徴朝町眺聴蝶調超跳長頂鳥勅直沈珍賃津椎槌追痛通塚佃漬柘辻椿潰坪壷爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟抵提汀程締訂邸釘泥摘敵滴的笛適哲徹撤鉄典填天展店添貼転点伝殿澱田電兎吐塗徒斗杜渡登賭途都砥努度土奴怒倒党冬凍刀唐塔島嶋悼投東桃棟盗淘湯涛灯燈当痘等答筒糖到董藤討豆踏逃透頭闘働動同堂導憧洞瞳童道銅峠得徳特禿独読栃突届寅屯沌豚遁呑鈍奈那内謎鍋縄南楠軟難汝二尼弐匂賑肉虹日乳入如尿任妊忍認祢猫熱年念捻燃乃之埜悩濃納能脳農覗巴把杷波派破馬俳拝排敗杯背輩配倍培梅狽買売陪萩伯博拍柏泊白箔舶薄迫爆麦函箱箸肌畑八発髪伐罰抜鳩隼伴判半反帆斑板汎版犯班畔繁般販範飯挽晩番盤蛮卑否妃彼悲扉比皮秘緋肥被誹費避非飛樋備尾微眉美鼻柊匹髭彦肘必筆桧姫紐百標氷漂票表評豹描病秒苗品浜敏瓶不付埠夫婦富冨布府怖敷斧普浮父符負阜附武舞部封風伏副復幅服福腹複払沸仏物分墳奮粉紛雰文聞併兵塀幣平弊柄並閉米頁壁別偏変片編辺返便勉弁保舗捕歩補穂募戊暮母簿菩包呆報奉宝峰峯崩捧放方朋法芳萌訪豊邦鳳剖坊帽忘忙望某冒謀貿防吠北僕撲牧没堀本凡盆魔麻埋妹枚毎幕枕又抹末沫迄万慢満漫味未魅岬密蜜妙民眠務夢無矛娘名命明盟迷免綿面摸模茂毛猛網木黙目勿戻貰問門也冶夜野矢役約薬訳油癒諭唯佑優勇友悠憂有湧由祐裕誘遊郵雄夕予余与誉預幼妖容揚揺曜様洋溶用羊葉要謡遥陽養欲浴翌翼裸来雷絡落乱卵覧利履李梨理裏里離陸律率立略流留粒隆竜龍侶旅了僚両寮料涼猟良量領力緑倫林臨輪涙類令例冷励怜玲礼鈴暦歴列劣烈裂恋連呂路露労朗楼浪漏狼老郎六麓禄録論倭和話脇惑枠亙湾腕

Papervision3D

本当いまさらですが、以前から一度試してみたかったPV3Dを試してみます。
過去の記事を調べてみると気付いたらもう2年くらい前からあったんでいまさらですが触ったことが無いというのもいけないので試します。ねらいは仕事でも全体的に3Dとまではいかなくてもアクセントとしてでもいいから効果的に3Dを使えればという理由からです。ちなみに使用したバージョンはGoogleCodeで最新版の2.0.869を使用しています。なお、PV3Dはバージョンごとに仕様が結構変わるらしいです。

Papervision3D Official Documentation

3Dは初めてなのでさっぱりなのですが、感覚としてはカメラがあって、それから見た状態をという感じのようです。基本的には以下を使用して設定を行っていくようです。

Viewport3D() コンストラクタ
Viewport3D(viewportWidth:Number = 640, viewportHeight:Number = 480, autoScaleToStage:Boolean = false, interactive:Boolean = false, autoClipping:Boolean = true, autoCulling:Boolean = true)
設定された3D物体の表示エリアを作る。

viewportWidth, viewportHeight
表示エリアの幅と高さを指定。

autoScaleToStage
ステージサイズに自動でリサイズさせるかどうかを指定する。

interactive
マウスイベントを受け取るかどうか?

autoClipping
表示範囲外の矩形の自動削除

autoCulling
範囲外の裏面を描画しない処理、または自動削除?パフォーマンスのための処理と思われる。

Scene3D()

Camera3D()
視点を指定するオブジェクト。指定を変えて固定カメラにしたり

BasicRenderEngine()
表示を行うオブジェクト

MovieAssetMaterial()
MCを貼り付ける基本となるベース。テクスチャってやつか。
それらを MaterialsList() でひとまとめにして、次のマテリアルを貼り付けるベースの形を決定するクラスに貼り付ける。平面から立方体、円錐や円柱などがある。
・Arrow
・Cone
・Cube
・Cylinder
・PaperPlane
・Plane
・Sphere

AS3 Eventオブジェクト

やっとイベントリスナーがくれる event の意味がわかりました。たとえばMouseEvent.CLICK で 関数が event をもらうんだけどそれはオブジェクトで固有のプロパティを持ってるわけね。これは便利だしすごいすっきりしますね。

function init(num:int):void{
    var btn:MovieClip = this[“btn”+num];
    btn.buttonMode = true;
    btn.addEventListener(MouseEvent.CLICK, thumbnailClickHandler, false, 0, true);
    btn.addEventListener(MouseEvent.MOUSE_OVER, thumbnailMouseOverHandler, false, 0, true);
    btn.addEventListener(MouseEvent.MOUSE_OUT, thumbnailMouseOutHandler, false, 0, true);
    btn.myNum = num;
}

function thumbnailClickHandler(event:Event){
    Object(parent).loadImage(imagePath[event.target.myNum]);
    setFrame(event.target.x, event.target.y);
}

event.target はそのイベントを実行したパスってわけね。
event.target.myNum は後でつけた固有の変数って事になるのかな?

addEventListenerのuseWeakReferenceについて

外部ファイルをロードする場合に、きちんとロードしてくれるときもあればロードされない時もあり不安定な挙動になっていた。traceしてみるとProgressEvent.PROGRESSまでは行われていてるけど Event.INIT は通ってない様子。コードも問題ないみたいだし、じゃあ何かの設定かと思い考えてみると

loader.addEventListener(Event.COMPLETE, loadCompleteHandler, false, 0, true);

のように第五引数のウィークリファレンスを弱い参照に設定していたために起こったと思われます。true (強い参照)にすることで不安定さはなくなりきちんと仕事してくれてるようになりました。盲目的にイベントリスナーは弱参照にしてましたが、おまじない感覚でやってたらダメですね。まぁこれで少しは理解できたかな。

AS3はじめました

やろうやろうと思って2年ほどたってしまいましたが、やっと先月終わりごろからAS3をはじめました。いきなりparentとかrootの違いやattachMovieってなくなったの?など一歩進む度にいちいちつまづいてます。でもだんだん理解してきました。ただ表示リストというのがいまいち理解しにくい。やってれば自然と慣れてくるでしょうけど。

AS3でのxml読み込みの際の名前空間

ActionScript3.0でMTのatom.xmlを読み込んで解析しようとしたらどうにも以下のノードを解析ができない。調べると手作りのプレーンなXMLなら読み込めるからコードの問題ではない様子。ノードを消したりあれやこれやしていたらどうやら

これのxmlns属性を消すと解析できた。調べてみるとAS3では名前空間の指定がしてあるxmlは簡単に値を取れないらしい。以下解決方法。

どうやら名前空間を Namespace() なるもので指定する必要があるらしい。と思って今度はこの関数のことを調べていくうちに以下の記述方法を発見。

trace(xml[“entry”][0][“title”]);

これでOKなことが判明。なんだよそれ。でもこれって強引なのかな?と思ったら上の方法はローカルでしかだめだったので結局 Namespace() で対処する。

//名前空間を指定
var ns:Namespace = new Namespace(“http://www.w3.org/2005/Atom”);
trace(xml.ns::entry[i].ns::title); // hoge

ドットシンタックスでOKなのは名前空間が指定されていないときだけ。名前空間を指定されている場合は、名前空間を指定し、ドットの後に 「ns::」 を追加するわけだな。

調べるといろんなブログにこの問題のことが書かれてたけど、これだけに半日もかかってしまった…(´;ω;`)

AS3 addChild

addChild

“sprite”を“A”にaddChildしたとして、
そのまま“sprite”を同じように“B”にaddChild()すると
“A”の“sprite”が無くなり“B”に配置される。
addChild()は移動や移すといった感覚。

var sprite:Sprite = new Sprite();
A.addChild(sprite);
B.addChild(sprite);

定数REMOVED とREMOVED_FROM_STAGE の違い

REMOVED
自身、もしくは内包している子供のDisplayObjectがremoveChild()された時。

REMOVED_FROM_STAGE
自身がremoveChild()された時。タイミングとしてはREMOVED_FROM_STAGEの前に REMOVEDイベントが発生する。