This Project Has Not Released Any Files
name | 和名 | type | default | null | limit | note |
name | フキダシ管理名 | string | FALSE | 50 | フキダシを区別するための名前 | |
classname | フキダシクラス名 | string | FALSE | 50 | jsのクラス名 | |
caption | 表示名 | string | FALSE | 30 | ||
t | 表示順 | integer | 0 | false | フキダシエクスプローラーなどでのソート | |
settings | テンプレートjson | string | FALSE | 設定データ | ||
created_at | datetime | |||||
updated_at | datetime |
これまでjsonで記述されたテンプレートデータは展開されてdbに保存していた。しかし、今後は展開せず文字列としてsettingsカラムに保存する。
参考speech_balloon_templates.json
クライアントは、エディタでフキダシが貼られたときclassnameのクラスのインスタンスを生成する。たとえばclassnameの値が'Square'のフキダシだったとき、Squareクラス(フキダシを実装したクラス)を生成する。このとき初期化データとしてsettingsを渡す。Squareクラスはsettingsをjson文字列としてパースしてフキダシに必要な情報を取得する。settingsには、default_widthやdefault_heightなどが入っている。これらのプロパティはjsのフキダシクラスとテンプレート間で合意があればどんな形式でもよい。「このクラスにはdefault_widthとdefault_heightが必要です」と決めてあればフキダシの初期サイズが設定できる。
フキダシ枠テンプレートとセリフテンプレートに相当するデータもsettingsから取得する。クライアントは、これらのプロパティからベクターフキダシの編集パネルを稼働させ、投稿ボタンが押された際には、(ベクターがない環境のために)最も相応しい画像フキダシを(これまたsettingsから得たプロパティから)算出してフキダシデータを作成する。
基本形はこんな感じ。
nameをキーに追加更新。クラス名と表示名はdbにも保存したいので必須項目としておく。フキダシテンプレートはたくさんのメーカーが作成するので、nameが被ると管理不能になってしまう。そこで、ドメインを末尾に付ける慣習を。
フキダシ枠に対応するフキダシ画像がどれなのかを記述する方法に難がある。
という流れになったので、さすがに「どんな形式でもよい」とはいかなくなった。フキダシ枠とセリフのセットは、settingsの下に連想配列で突っ込み、フキダシ枠はballoonで、セリフはspeechで定義することになった。
ちなみにサーバは、このテンプレートをインポートするときは、次の処理を行う。
消滅
消滅
HowToMakeSpeechBalloon 通りの考え方だよ。
- speech_balloon_templates : {
- "square": {
- "classname": 'Square'
- "caption": "長方形",
- "default_width": 170,
- "default_height": 100,
- templates: {
- "all": {
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 10,
- "y_rate": 10,
- "width_rate": 10,
- "height_rate": 10
- }
- }
- },
- },
- "square_with_size": {
- "classname": 'SquareWithSize'
- "caption": "長方形改",
- "default_width": 300,
- "default_height": 100,
- "size_count": 3,
- "width_offset": 0,
- "height_offset": 0,
- "width_step": 200,
- "height_step": 100,
- templates: {
- "small": {
- "size": 0,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 10,
- "y_rate": 10,
- "width_rate": 10,
- "height_rate": 10
- }
- },
- "middle": {
- "size": 1,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 10,
- "y_rate": 10,
- "width_rate": 10,
- "height_rate": 10
- }
- },
- "large": {
- "size": 2,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 10,
- "y_rate": 10,
- "width_rate": 10,
- "height_rate": 10
- }
- }
- },
- },
- "circle": {
- "classname": 'Circle'
- "caption": "円",
- "default_width": 300,
- "default_height": 100,
- "r_offset": 45,
- "r_step": 90,
- "tail_count": 4,
- templates: {
- "rightup": {
- "tail": 0,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "rightdown": {
- "tail": 1,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "leftdown": {
- "tail": 2,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "leftup": {
- "tail": 3,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- }
- }
- },
- "circle_with_size": {
- "classname": 'CircleWithSize'
- "caption": "円改",
- "default_width": 300,
- "default_height": 100,
- "r_offset": 45,
- "r_step": 90,
- "tail_count": 4,
- "size_count": 3,
- "width_offset": 0,
- "height_offset": 0,
- "width_step": 200,
- "height_step": 100,
- templates: {
- "rightup_small": {
- "tail": 0,
- "size": 0,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "rightup_middle": {
- "tail": 0,
- "size": 1,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "rightup_large": {
- "tail": 0,
- "size": 2,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "rightdown_small": {
- "tail": 1,
- "size": 0,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "leftdown_small": {
- "tail": 2,
- "size": 0,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- },
- "leftup_small": {
- "tail": 3,
- "size": 0,
- "balloon": {
- system_picture: "BASE64ENCODEDATA"
- },
- "speech": {
- "x_rate": 20,
- "y_rate": 30,
- "width_rate": 50,
- "height_rate": 50
- }
- }
- }
- }
name | 和名 | type | default | null | limit | note |
panel_id | 所属パネルid | integer | FALSE | |||
speech_balloon_template_id | フキダシテンプレートid | integer | FALSE | |||
classname | フキダシクラス名 | string | FALSE | 50 | jsのクラス名(テンプレートからのコピー) | |
z | 表示順位 | integer | FALSE | |||
t | 時間軸 順序 | integer | false | |||
settings | 拡張データ | string | json形式 | |||
created_at | datetime | |||||
updated_at | datetime |
クライアントは、このフキダシを表示するとき、classnameのクラスのインスタンスを生成する。たとえばclassnameの値が'Square'のフキダシだったとき、Squareクラス(フキダシを実装したクラス)を生成する。このとき初期化データとしてsettingsとフキダシ枠とセリフを渡す。Squareクラスはsettingsをjson文字列としてパースしてフキダシに必要な情報を取得する。settingsには、フキダシ全体に影響するプロパティが入っている(今のところ該当するプロパティはない)。これらのプロパティはjsのフキダシクラスとテンプレート間で合意があればどんな形式でもよい。
クライアントのフキダシ編集パネルは、再現性を保てるように(settingsを含めて)データを作成しなければならない。
name | 和名 | type | default | null | limit | note |
speech_balloon_id | フキダシid | integer | FALSE | |||
system_picture_id | フキダシ素材id | integer | FALSE | |||
x | 表示開始位置x | integer | FALSE | |||
y | 表示開始位置y | integer | FALSE | |||
width | 表示幅 | integer | FALSE | |||
height | 表示高さ | integer | FALSE | |||
caption | 説明 | string | フキダシの発言者などの予備情報 | |||
settings | 拡張データ | string | json形式 | |||
created_at | datetime | |||||
updated_at | datetime |
クライアントのフキダシクラスはインスタンスを生成する。たとえばclassnameの値が'Square'のフキダシだったとき、Squareクラス(フキダシを実装したクラス)を生成する。このとき初期化データとしてこのデータ(フキダシ枠)が渡る。Squareクラスはsettingsをjson文字列としてパースしてフキダシ枠に必要な情報を取得する。settingsには、フキダシ画像に関連するプロパティが入っている(今のところ該当するプロパティは円形フキダシのrやサイズのバリエーションsize)。これらのプロパティはjsのフキダシクラスとテンプレート間で合意があればどんな形式でもよい。フキダシ編集パネルでrが60に設定されているなら'{"r":60}'って文字列が入っているから、コマ表示では60度のフキダシを表示し、コマ編集なら60度のフキダシを編集モードにする。
なお、ベクターフキダシが動かない環境では、サーバがsystem_picture_idのフキダシ画像をx・y・width・heightで表示する。このケースに備えて、クライアントのフキダシクラスは、コマ投稿時に表示中のベクターフキダシに最も近いフキダシ画像を選んでおかなければならないし、選べるようなパラメータを用意しておかなければならない。
name | 和名 | type | default | null | limit | note |
speech_balloon_id | フキダシid | integer | FALSE | |||
content | 台詞 | string | ||||
x | 表示開始位置x | integer | FALSE | 単位は% | ||
y | 表示開始位置y | integer | FALSE | 単位は% | ||
width | 幅 | integer | FALSE | 単位は% | ||
height | 高さ | integer | FALSE | 単位は% | ||
settings | 拡張データ | string | json形式 | |||
created_at | datetime | |||||
updated_at | datetime |
フキダシ枠と同様。 settingsに入るデータは今のところ不明(フォントや書式が入るかも)
長方形フキダシのデータ。座標やサイズは適当。
円フキダシのサンプル。尻尾の向きが保存されている。
- speech_balloon : {
- "z": 1,
- "t": 0,
- "classname": "Square",
- "speech_balloon_template_id": 1,
- "balloon_attributes": {
- "new1": {
- "system_picture_id": 1,
- "x": 30,
- "y": 30,
- "width": 50,
- "height": 50
- }
- },
- "speech_attributes": {
- "new1": {
- "content": "hello",
- "x": 30,
- "y": 30,
- "width": 50,
- "height": 50
- }
- }
- }
サーバとしては、フキダシ(SpeechBalloonModel・SpeechModel・SpeechModel)をベターな形で預かれればいいので、テンプレート⇔フキダシ部分のデータ変換はクライアントで好きにやってねってことです。
テンプレート作成の考え方は HowToMakeSpeachBalloon の流れとまったく変わりません。