More Related Content Similar to ActionScriptを使わないFlash勉強会 #1(前日版) Similar to ActionScriptを使わないFlash勉強会 #1(前日版) (20) ActionScriptを使わないFlash勉強会 #1(前日版)1. クライアントサイドにおける
できること やったこと
動的swf生成の可能性と使用例
よろしくー
2011. 4. 23(Sat)
ActionScriptを使わないFlash勉強会 #1
speaker: @niwauu
5. 4
お前、だれよ?
人気順
【462】FLASH-jpトップページ
【53】
☺
【21】
☺ はてブでFLASH-jp内 一番人気のスレッドに!
やっぱり動的SWF生成だよね
7. 6
登場タグ
DefineBitsLossless2 DoAction
DefineBitsJPEG2 FrameLabel
DefineBitsJPEG3 StartSound
DefineShape PlaceObject2
DefineSprite RemoveObject2
DefineSound ShowFrame
End
10. 9
なんで動的にやるの?
▪ FlashLite1.1の制限
1. サイズ(100kB)制限
2. 機能制限
(1) 通信時ボタン押下必須制限
(2) URL値渡し制限
(3) SharedObjectないよ
• 必要なものを必要な分だけ埋め込む
• “swfにアクセスする”通信1回で必要な読込をまとめて
• ローカルでのデータ設定・保持できないなら
ネットワーク側で面倒見る
「FlashLite1.1でやらなきゃいけない」が一番の制限(シェアのせい)
13. 12
SWFバイナリの基本
ShowFrame ShowFrame ShowFrame
Header Tag Tag Tag Tag Tag Tag Tag Tag
1フレーム目 2フレーム目 Nフレーム目 End
SWFファイルはヘッダとそれに続く複数のタグからなる
ヘッダ:バージョン, ファイルサイズ, ステージサイズ,
フレームレート, 総フレーム数,
タグ: Definitionタグ ShapeやMCなどのキャラクタを定義
Controlタグ 定義したキャラクタの取り扱い
SWF全体の流れのコントロール
14. 13
DictionaryとDisplayList
Dictionary DisplayList
定義 IDで管理 配置 Depthで管理
DefineShape PlaceObject2
CharacterID=1 Depth=3
Depth= 3
CharacterID=1
CharacterID=1 PlaceObject2 Depth=2
CharacterID=2
DefineShape
Depth= 2 Depth=1
PlaceObject2
CharacterID=2 CharacterID=1
CharacterID=2 ShowFrame
Depth= 1
管理用番号にはCharacerIDとDepthがある
ステージ上に表示
• 定義したシェイプなどにはIDを振って管理
• ステージに表示するものにはDepthを振って管理
15. 14
開発のための環境とヒント
0. バイナリエディタ
1. swf_file_format_v10.pdf
Adobeによるファイルフォーマット解説。必須
2. Adobe Flash CS*
どんなバイナリが生成されるべきかの確認。お手本
3. $ swfmill swf2xml hoge.swf
SWFバイナリ内のタグ・パラメータの確認
自前のパーサ・バイナリが正しく作れているか
(4. Sothink Flash Decompiler)
3.の確認ができるグラフィカル版。
19. 18
パラメタ埋め込み動的SWFの例(1)
ShowFrame End
Header Tag Tag Tag Tag Tag Tag Tag
0x96 0x06 … タグヘッダ
バイト DoAction
= Tag
name =
0x96 0x08 …
“niwauu”;
0x1d 0x00 コード
スクリプト バイトコード タグ
New
Tag
20. 19
パラメタ埋め込み動的SWFの例(1)
ShowFrame End
Header Tag Tag Tag Tag Tag Tag Tag
1フレーム目
0x96 0x06 … タグヘッダ
バイト DoAction
= Tag
name =
0x96 0x08 …
“niwauu”;
0x1d 0x00 コード
スクリプト バイトコード タグ
New
Header Tag Tag Tag Tag Tag Tag Tag Tag
• 1フレーム目へのDoActionタグの挿入
21. 20
パラメタ埋め込み動的SWFの例(1)
ShowFrame End
Header Tag Tag Tag Tag Tag Tag Tag
1フレーム目
0x96 0x06 … タグヘッダ
バイト DoAction
= Tag
name =
0x96 0x08 …
“niwauu”;
0x1d 0x00 コード
スクリプト バイトコード タグ
Modified New
Header Tag Tag Tag Tag Tag Tag Tag Tag
• 1フレーム目へのDoActionタグの挿入
• 全体のサイズ変更によるSWFヘッダの更新
22. 21
スクリプトのActionシーケンスへの変換
name = “niwauu”;
1.「nameに」
2.「niwauuを」
3.「代入しろ」
ActionPush “name”
ActionPush “niwauu”
ActionSetVariable
23. 22
DoActionタグ (TagType=12)
▋ 実行するActionScriptをバイトコードで表現
Tag • ActionScript 1, 2のみ
Header
• ActionSctipt3はDoABCタグで表現
Actions (DoActionタグは無視される)
ACTION
ACTIONRECORD
RECORD
ACTION ACTION RECORD payload
RECORD HEADER (Stringなど)
ActionCode Length (ない場合も)
Action
EndFlag (ない場合も)
UI8 (0x00)
24. 23
ActionScriptのバイトコードのバイナリ表現(1)
ActionPush “name” 3f 03 16 00 00 00 96
06 00 6e 61 6d 65 00
ActionPush “niwauu” 96 08 00 6e 69 77 61
ActionSetVariable 75 75 00 1d 00
3f 03 = 0011 1111 0000 0011
Tag
0000 0011 0011 1111 Tag Type = 12
Header
16 00 00 00 Tag Length = 22 bytes
ActionCode 96 ActionPush
Length 06 payload長
00 Pushするものは文字列
payload
6e 61 6d 65 00 ‘n’ ‘a’ ‘m’ ‘e’ ‘¥0’
(→つづく)
28. 27
パラメタ埋め込み動的SWFの例(2)
NextTrain時刻表形式:
a:岡山;岡
b:広島;島
c:三島;三
…
$品川: j6 k6 l6
$新横浜: j17 k15 l16
$小田原: j33 l32 k=
$熱海: j42 l36 k=
…
[MON][TUE][WED][THU][FRI]
# 東京 卙多方面(平日のダイヤ)
6: ke00 k05 kb20 jh23 ke26 la36 ke50 k53 j56 Bn=“000100030004000600
7: l06 ke13 jh23 k26 kb33 la36 ke50 j56
Bj=“0240024502600263026
…
22: lh00 jd10 jc47 Bt=“kekkbjhkkelakejlk…
…
34. 33
DefineBitsLossless2(Tag type=36)
▮画像を定義(可逆なもの。PNG, GIF用) Header
• キャラクターIDでSWF内での識別
• 画像データ部は CharacterID
BitmapFormat = 3のとき BitmapFormat = 3
パレット色情報+パレット番号 Width
Height
の羅列をzlib圧縮(□)したもの ColorTableSize
パレット色数
BitmapFormat=3 ⇒ 1pixelあたり1Byte
ColorTableRGB
パレット色情報
Colormap
PixelData
パレット番号の羅列
(8bit)
35. 34
DefineBitsLossless2(Tag type=36)
▮画像を定義(可逆なもの。PNG, GIF用) Header
• キャラクターIDでSWF内での識別
• 画像データ部は CharacterID
BitmapFormat = 3のとき BitmapFormat = 5
パレット色情報+パレット番号 Width
BitmapFormat = 5のとき Height
ARGBデータ
の羅列をzlib圧縮(□)したもの
BitmapFormat=3 ⇒ 1pixelあたり1Byte Bitmap
BitmapFormat=5 ⇒ 1pixelあたり4Byte PixelData
ARGBの羅列
(32bit)
36. 35
DefineBitsLossless2(Tag type=36)
▮画像を定義(可逆なもの。PNG, GIF用) Header
• キャラクターIDでSWF内での識別
• 画像データ部は CharacterID
BitmapFormat = 3のとき BitmapFormat
パレット色情報+パレット番号 Width
BitmapFormat = 5のとき Height
ARGBデータ
の羅列をzlib圧縮(□)したもの
BitmapFormat=3 ⇒ 1pixelあたり1Byte
BitmapFormat=5 ⇒ 1pixelあたり4Byte 画像データ
⇒ 256色以下の場合容量削減のため
BitmapFormat=3(パレット形式)を使う
透過色ない場合はDefineBitsLossless(Tag type=20)
を使って透過情報を含めないことで容量削減
44. 「伺か」ってなに?
43
デスクトップ常駐型マスコットアプリケーション
今でいえばウィジェット(ガジェット)に近い
読み:「うかがか」
デスクトップの隅にキャラクターを立たせて
「なんか言うのを眺める」から
「OSの機能やネットワーク通信と連携させたいろいろ」
(例:メール着信確認、簡単なゲーム、サーバ監視)
好感度システム⇒ラブプラス的な インターフェース層の擬人化
特徴:
• DLLと簡易言語による非常に自由度の高い機能拡張
• ユーザによる盛んな追加キャラクター作成
約10年で1000体以上、現在でも盛ん、14 体/月 @2011
46. 45
まめフラスコでやっていること
• テキスト情報の挿入
• 画像の置換
• 画像の挿入
• ムービークリップの生成・挿入
• サウンドの挿入
• テキストボックスのサイズ変更
• シェイプの色の変更
• SWF背景色の変更
47. 46
基本キャラクターの変更
• キャラクターはMovieClipで表現
• MovieClipの中のダミー画像を置換したい。
• DefineBitsLossless2, DefineShapeを変更する
• PlaceObject2は変更なし
a
置換前
置換後
48. 47
基本キャラクターの変更
• あらかじめ埋め込まれたダミー画像の置換
• サイズが変わるので一致するIDのDefineShapeも要置換
• サイズ削減のためJPEG形式に変換しての置換もする
• (DefineBitsLossless2⇒DefineBitsJPEG2/3)
ARGB JPG
PNG
BitmapID=N BitmapID=N BitmapID=N
DefineBits 入力 DefineBits DefineBits
Lossless2 Lossless2 or JPEG3
DefineShape DefineShape
BitmapID=N BitmapID=N
ShapeID=M ShapeID=M
50. 49
DefineShapeタグ(Tag type=26)
Header
▮シェイプの定義
- 使う塗りのスタイル ShapeID
- 使う線のスタイル ShapeBounds
- シェイプを構成する線や塗りの集合 Shapes
・画像の配置⇒ FillStyles
「画像で塗りつぶした矩形」の配置 LineStyles
・DefineShapeがコンテナ役、 NumFillBits
描画領域を決めている NumLineBits
ShapeRecord
51. 50
DefineShapeタグ(Tag type=26)
• 変更と確認が必要な部分は3つ(▮印) Header
ShapeID
:定義するシェイプの境界
ShapeBoundsフィールドで矩形で定義
ShapeBounds
Shapes
:シェイプで表示させたい画像
「領域を画像で塗りつぶす。 FillStyles
その画像は(BitmapID)」 LineStyles
FillStylesの中のBitmapIDで指定 NumFillBits
NumLineBits
:矩形を構成する直線 × 4
ShapeRecordsの中のStraightEdgeReocrdで指定
垂直線:VertLineFlag=0, DeltaX= (移動twips) ShapeRecord
水平線:VertLineFlag=1, DeltaY= (移動twips)
54. 53
PlaceObject2タグ(Tag type=26)
Header ▮ DefineShapeなどで定義した
これらがあるか キャラクターをID指定して配置
PlaceFlagMove
・Depthは表示順を表すとともに
Depth SWF内のオブジェクトを一意に管理
CharacterID
Transform Matrix ・ 表 示 位 置 は TransformMatrix 内 の
translateX, translateYで指定
Color Transform
Ratio
・NameをつけることでMovieClipに
Name tellTargetでアクセス可能
ClipDepth
ClipActions
55. 54
PlaceObject2タグ(Tag type=26)
Header ▮ DefineShapeなどで定義した
これらがあるか キャラクターをID指定して配置
PlaceFlagMove
・Depthは表示順を表すとともに
Depth SWF内のオブジェクトを一意に管理
CharacterID
Transform Matrix ・ 表 示 位 置 は TransformMatrix 内 の
translateX, translateYで指定
Color Transform
Ratio
・NameをつけることでMovieClipに
Name tellTargetでアクセス可能
ClipDepth
ClipActions
56. 55
PlaceObject2タグ(Tag type=26)
Header ▮ DefineShapeなどで定義した
これらがあるか キャラクターをID指定して配置
PlaceFlagMove
・Depthは表示順を表すとともに
Depth SWF内のオブジェクトを一意に管理
CharacterID
Transform Matrix ・ 表 示 位 置 は TransformMatrix 内 の
translateX, translateYで指定
Color Transform
Ratio
・NameをつけることでMovieClipに
Name tellTargetでアクセス可能
ClipDepth
ClipActions
57. 56
PlaceObject2タグ(Tag type=26)
Header ▮ DefineShapeなどで定義した
これらがあるか キャラクターをID指定して配置
PlaceFlagMove
・Depthは表示順を表すとともに
Depth SWF内のオブジェクトを一意に管理
CharacterID
Transform Matrix ・ 表 示 位 置 は TransformMatrix 内 の
translateX, translateYで指定
Color Transform
Ratio
・NameをつけることでMovieClipに
Name tellTargetでアクセス可能
ClipDepth
ClipActions
59. 58
PlaceObject2タグ(Tag type=26)
Header Depthで管理してるので
これらがあるか タグはCharacterIDを知らなくても良い
PlaceFlagMove
Depth CharacterIDない場合このタグは何をするか?
• 指定したDepthにある既にplace済の
CharacterID
Objectの属性変更
Transform Matrix • CharacterIDあると同じDepthに二重place
Color Transform になってしまうので
Ratio
そのためのPlaceFlagMoveフラグ;
Name
placeFlagMove = 1 のときは
ClipDepth そのdepthのObjectを一旦Removeして
ClipActions 同じDepthに二重Placeしない
60. 59
どういうこと?
DisplayList
PlaceObject2
CharacterID=1 Depth=3
Depth= 1
PlaceFlagMove=0 Depth=2
(x,y)=(0,0)
Depth=1
61. 60
どういうこと?
DisplayList
PlaceObject2
CharacterID=1 Depth=3
Depth= 1
PlaceFlagMove=0 Depth=2
(x,y)=(0,0)
PlaceObject2 Depth=1
CharacterID=1
Depth= 1
PlaceFlagMove=0
(x,y)=(50, 50)
Depthで一意にオブジェクトが決まらない
62. 61
どういうこと?
DisplayList
PlaceObject2
CharacterID=1 Depth=3
Depth= 1
PlaceFlagMove=0 Depth=2
(x,y)=(0,0)
Depth=1
63. 62
どういうこと?
DisplayList
PlaceObject2
CharacterID=1 Depth=3
Depth= 1
PlaceFlagMove=0 Depth=2
(x,y)=(0,0)
PlaceObject2 Depth=1
CharacterID=1
Depth= 1
PlaceFlagMove=1
(x,y)=(50, 50)
PlaceFlagMove=1にして設置済みのObjectの修正をする
64. 63
どういうこと?
DisplayList
PlaceObject2
CharacterID=1 Depth=3
Depth= 1
PlaceFlagMove=0 Depth=2
(x,y)=(0,0)
PlaceObject2 Depth=1
CharacterID=3
Depth= 1
PlaceFlagMove=1
(x,y)=(50, 50)
CharacterIDを持たせることで違うObjectへの入れ替えも
RemoveObject2をタグ使わないでもできる
66. 65
エレメントの対応
・画像の挿入(置換でない)
⇒ ▪ DefineBitsLossless2, DefineShape,PlaceObejct2タグを
新規に作ってSWF内にタグ挿入する必要がある
▪ Depthを表示順に合わせて決める
重複しないように注意
Tag Tag Tag Tag Tag Tag
DefintBitsLossless2 DefintBitsLossless2
DefineShape DefineShape
PlaceObject PlaceObject
67. 66
エレメントの対応
Header Tag Tag Tag Tag Tag Tag Tag Tag
Tag Tag
DefineBitsLossless2 Header … Tag Tag Tag Tag
DefineShape
キャラクターMCの
Tag Tag Tag Tag
DefineSpriteタグ RemoveObject2 RemoveObject2
PlaceObject2 PlaceObject2
▮キャラクターMCのDefineSpriteより前に画像定義を挿入
▮表示順に注意してDepthの設定をしたPlaceObject2を
キャラクターMCの適当なフレームに挿入
(必要に応じてRemoveObject2タグも)
68. 67
DefineSpriteタグ(Tag type=39)
▮ムービークリップを定義する
・タグの塊を内部に持つ
Header ⇒置換の際にこのタグ内タグを見る必要もある
・Control系のタグのみ(Definition系は丌可)
SpriteID ⇒配置するキャラクタはこのタグより前で定義
FrameCount 1 2 3 4 5 6 7 8
ControlTags a a
tag
tag 1 2 3 4 5 6 7 8
タグ E
tag N
D
…
: DoAction : PlaceObject2
tag : ShowFrame : RemoveObject2
69. 68
アニメーションの対応
1 5 10
a a
こういうMCをつくって埋め込む
(つくるMCの数は任意個)
・必要な画像のDefineBitsLossless2, DefineShapeタグを登録
・DefineSpriteタグでMC定義、その中に
1. 表示する画像のDefineShapeタグを設置するPlaceObject2タグ
2. 各画像表示時間の調整用にフレーム稼ぎのShowFrameタグ
3. くりかえ(す|さない)などの制御用スクリプトのDoActionタグ
・DefineSpriteで定義したMCを名前付きでPlaceObject2タグで設置
70. 69
アニメーションの対応
Header Tag Tag Tag Tag Tag Tag Tag Tag
Tag Tag Tag
DefineBitsLossless2 Header … Tag Tag Tag Tag
DefineShape
DefineSprite
キャラクターMCの Tag Tag Tag Tag
DefineSpriteタグ
RemoveObject2 RemoveObject2
PlaceObject2 PlaceObject2
▮キャラクターMCのDefineSpriteより前に画像定義を挿入
▮表示順に注意してDepthの設定をしたPlaceObject2を
キャラクターMCの適当なフレームに挿入して
アニメーションをDefineしたSpriteをPlaceする
71. 70
DefineSpriteについて
1. DefinSprite内におけるタグはControlTagだけなので
入れ子になったムービークリップでもDefineSprite
タグは入れ子にはなりません(子は親よりも前に定義する)
MC2 Header Tag Tag Tag Tag Tag
MC1 DefineSprite(MC2) DefineSprite(MC1)
2. それぞれ独立したDepth空間を持っています
Display List Display List
(Main) (Sprite)
Depth: 8 Shape Depth:4 Text
3 Sprite 3 Shape
2 Text 2 Shape
1 Shape 1 Text
74. 73
DefineSoundタグ(Tag type=14)
▋ 音声の定義
• MP3の場合はサンプル数算出などに要MP3バイナリの構造解析
• 携帯用フォーマットは仕様書外?置換には計算いらないので楽
【DefineSound】
タグヘッダ
SoundID SWF内での識別用ID
SoundFormat フォーマット(0~6, 11) MP3: 2, MMF(SMAF): 15
サンプリングレート
SoundRate (0=5.5kHz, 1=11kHz, 2=22kHz, 3=44KHz) MMF(SMAF): 0
SoundSize 8bitか16bitか MMF(SMAF): 0
SoundType ステレオかモノラルか MMF(SMAF): 0
SoundSampleCount サンプル数 MMF(SMAF): 0
1グラニュール=576サンプル
SoundData MMF(SMAF):
バイナリデータ
ファイルバイナリ
81. 80
動的SWF生成のほかのかたの例
▮text to flash(txt2swf)
テキストファイルをFlashに変換
青空文庫を携帯で読む「携帯Flashリーディングス」さんでも
使われています
http://www.kaseijin.biz/pc.htm
▮Fiora
au用ケータイメニュー画面を作成
GUIで楽々作成 携帯電話のユーザによるカスタマイズ
http://auicon.freeownhost.com/pc/tools/fiora/
▮VNC2SWF
画面録画ユーティリティ
VNCの画面を録画、音声や編集も対応、オープンソース(GPL)
http://www.unixuser.org/~euske/vnc2swf/index-j.html
84. 83
参考・引用文献など
• “SWF File Format Specification Version 10”(Adobe Systems Inc.さま)
http://www.adobe.com/devnet/swf.html 『SWF Technology Center』内
• “「.さくら」”(駅長 さま)
http://www.nanican.net/dot-sakura/ 『.さくらステーション』内
• “from ”BaMHA” ”(サトウ M さま)
http://sgmh.sakura.ne.jp/tcg/ 『TCG-檻の少女』内
• “SWFバイナリ編集のススメ(よや さま)
http://labs.gree.jp/blog/2010/08/631/ 他『GREE Engineers’ Blog』内
• “ming/JPEG”(939 さま)
http://auicon.freeownhost.com/pc/index.php 『auicon by 939』内
• “ばぐとら研究所”(Chameleon Ponapalt さま)
http://ssp.shillest.net/