フキダシ新案

テンプレート

フキダシテンプレート SpeechBalloonTemplateModel

カラム

name和名typedefaultnulllimitnote
nameフキダシ管理名string FALSE50フキダシを区別するための名前
classnameフキダシクラス名string FALSE50jsのクラス名
caption表示名string FALSE30
t表示順integer0false フキダシエクスプローラーなどでのソート
settingsテンプレートjsonstring FALSE設定データ
created_atdatetime
updated_atdatetime

相違点

  • name
  • classname
    • 追加
  • default_width
    • 削除。settings内に移動したため。
  • default_height
    • 削除。settings内に移動したため。
  • settings
    • 追加。

解説

これまで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から得たプロパティから)算出してフキダシデータを作成する。

書式

基本形はこんな感じ。

  1. "name": {
  2. "classname": ''
  3. "caption": "",
  4. "settings": {
  5. "speech_balloon": {
  6. フキダシのプロパティ
  7. },
  8. "name": {
  9. "balloon": {
  10. "system_picture_id":{
  11. "text":"BASE64ENCODEDATA"
  12. }
  13. },
  14. "speech": {
  15. }
  16. }
  17. }
  18. }
nameをキーに追加更新。クラス名と表示名はdbにも保存したいので必須項目としておく。フキダシテンプレートはたくさんのメーカーが作成するので、nameが被ると管理不能になってしまう。そこで、ドメインを末尾に付ける慣習を。

フキダシ枠に対応するフキダシ画像がどれなのかを記述する方法に難がある。

  • フキダシ画像はシステム画像で保存される。
  • よってフキダシ画像はsystem_picture_idで指定しなければならない。
  • しかし、システム画像はサーバによってidがバラバラ。
  • このままだとシステム画像の中からidを拾ってテンプレートを書き換えるハメに。
  • 座長にそんな作業をさせるなんて有り得ない。
  • テンプレートでは、フキダシ画像をBase64でエンコしたテキストで記述しましょう。
  • しかし、ある程度はフォーマットが決まってないと困るね。

という流れになったので、さすがに「どんな形式でもよい」とはいかなくなった。フキダシ枠とセリフのセットは、settingsの下に連想配列で突っ込み、フキダシ枠はballoonで、セリフはspeechで定義することになった。

  • このフォーマットさえ満たしていれば、あとは「どんな形式でもよい」

ちなみにサーバは、このテンプレートをインポートするときは、次の処理を行う。

  • いったんテンプレートをjsonパース
  • 全テンプレートをループ処理
  • nameをキーに既存のフキダシテンプレートを探して、あれば更新、なければ作成
  • system_pictureをエンコ
  • jsonをテキストに戻す
  • dbにフキダシテンプレート作成
    • クラス名とフキダシ名称とsettings(テキストに戻したjson)

フキダシ枠テンプレート BalloonTemplateModel

消滅

セリフテンプレート SpeechTemplateModel

消滅

テンプレートサンプル

HowToMakeSpeechBalloon 通りの考え方だよ。

  • Square
    • 簡単な例の通り。
    • セリフのdiv位置サイズを比率で指定。
    • デフォルトサイズを拡張している。
  • SquareWithSize
    • サイズのバリエーション追加
    • 基本構造はSquareと同じ
    • サイズを三種類用意
      • 便宜的に名前を"small""middle""large"とつけた
      • それぞれにフキダシ画像があって、サイズを0・1・2で管理
      • エディタは、そのsizeをjsonテキストにしてフキダシデータに追加する
    • サイズを切り替える式のため、オフセットとステップを用意
      • 拡張方法を変えれば、MinMax式のフレキシブルな管理もできる
  • Circle
    • 尻尾の向き拡張
    • サイズのバリエーション拡張はなし
    • 尻尾の向きを四種類用意
      • 右上・右下・左下・左上をtail0・1・2・3で管理
      • エディタはrを拡張データとしてjsonテキスト保存
  • 円改
    • 円にサイズを拡張した
    • 全部書くと長いから省略したよ
      • エディタはrとtailを拡張データ保存する
  1. speech_balloon_templates : {
  2. "square": {
  3. "classname": 'Square'
  4. "caption": "長方形",
  5. "default_width": 170,
  6. "default_height": 100,
  7. templates: {
  8. "all": {
  9. "balloon": {
  10. system_picture: "BASE64ENCODEDATA"
  11. },
  12. "speech": {
  13. "x_rate": 10,
  14. "y_rate": 10,
  15. "width_rate": 10,
  16. "height_rate": 10
  17. }
  18. }
  19. },
  20. },
  21. "square_with_size": {
  22. "classname": 'SquareWithSize'
  23. "caption": "長方形改",
  24. "default_width": 300,
  25. "default_height": 100,
  26. "size_count": 3,
  27. "width_offset": 0,
  28. "height_offset": 0,
  29. "width_step": 200,
  30. "height_step": 100,
  31. templates: {
  32. "small": {
  33. "size": 0,
  34. "balloon": {
  35. system_picture: "BASE64ENCODEDATA"
  36. },
  37. "speech": {
  38. "x_rate": 10,
  39. "y_rate": 10,
  40. "width_rate": 10,
  41. "height_rate": 10
  42. }
  43. },
  44. "middle": {
  45. "size": 1,
  46. "balloon": {
  47. system_picture: "BASE64ENCODEDATA"
  48. },
  49. "speech": {
  50. "x_rate": 10,
  51. "y_rate": 10,
  52. "width_rate": 10,
  53. "height_rate": 10
  54. }
  55. },
  56. "large": {
  57. "size": 2,
  58. "balloon": {
  59. system_picture: "BASE64ENCODEDATA"
  60. },
  61. "speech": {
  62. "x_rate": 10,
  63. "y_rate": 10,
  64. "width_rate": 10,
  65. "height_rate": 10
  66. }
  67. }
  68. },
  69. },
  70. "circle": {
  71. "classname": 'Circle'
  72. "caption": "円",
  73. "default_width": 300,
  74. "default_height": 100,
  75. "r_offset": 45,
  76. "r_step": 90,
  77. "tail_count": 4,
  78. templates: {
  79. "rightup": {
  80. "tail": 0,
  81. "balloon": {
  82. system_picture: "BASE64ENCODEDATA"
  83. },
  84. "speech": {
  85. "x_rate": 20,
  86. "y_rate": 30,
  87. "width_rate": 50,
  88. "height_rate": 50
  89. }
  90. },
  91. "rightdown": {
  92. "tail": 1,
  93. "balloon": {
  94. system_picture: "BASE64ENCODEDATA"
  95. },
  96. "speech": {
  97. "x_rate": 20,
  98. "y_rate": 30,
  99. "width_rate": 50,
  100. "height_rate": 50
  101. }
  102. },
  103. "leftdown": {
  104. "tail": 2,
  105. "balloon": {
  106. system_picture: "BASE64ENCODEDATA"
  107. },
  108. "speech": {
  109. "x_rate": 20,
  110. "y_rate": 30,
  111. "width_rate": 50,
  112. "height_rate": 50
  113. }
  114. },
  115. "leftup": {
  116. "tail": 3,
  117. "balloon": {
  118. system_picture: "BASE64ENCODEDATA"
  119. },
  120. "speech": {
  121. "x_rate": 20,
  122. "y_rate": 30,
  123. "width_rate": 50,
  124. "height_rate": 50
  125. }
  126. }
  127. }
  128. },
  129. "circle_with_size": {
  130. "classname": 'CircleWithSize'
  131. "caption": "円改",
  132. "default_width": 300,
  133. "default_height": 100,
  134. "r_offset": 45,
  135. "r_step": 90,
  136. "tail_count": 4,
  137. "size_count": 3,
  138. "width_offset": 0,
  139. "height_offset": 0,
  140. "width_step": 200,
  141. "height_step": 100,
  142. templates: {
  143. "rightup_small": {
  144. "tail": 0,
  145. "size": 0,
  146. "balloon": {
  147. system_picture: "BASE64ENCODEDATA"
  148. },
  149. "speech": {
  150. "x_rate": 20,
  151. "y_rate": 30,
  152. "width_rate": 50,
  153. "height_rate": 50
  154. }
  155. },
  156. "rightup_middle": {
  157. "tail": 0,
  158. "size": 1,
  159. "balloon": {
  160. system_picture: "BASE64ENCODEDATA"
  161. },
  162. "speech": {
  163. "x_rate": 20,
  164. "y_rate": 30,
  165. "width_rate": 50,
  166. "height_rate": 50
  167. }
  168. },
  169. "rightup_large": {
  170. "tail": 0,
  171. "size": 2,
  172. "balloon": {
  173. system_picture: "BASE64ENCODEDATA"
  174. },
  175. "speech": {
  176. "x_rate": 20,
  177. "y_rate": 30,
  178. "width_rate": 50,
  179. "height_rate": 50
  180. }
  181. },
  182. "rightdown_small": {
  183. "tail": 1,
  184. "size": 0,
  185. "balloon": {
  186. system_picture: "BASE64ENCODEDATA"
  187. },
  188. "speech": {
  189. "x_rate": 20,
  190. "y_rate": 30,
  191. "width_rate": 50,
  192. "height_rate": 50
  193. }
  194. },
  195. "leftdown_small": {
  196. "tail": 2,
  197. "size": 0,
  198. "balloon": {
  199. system_picture: "BASE64ENCODEDATA"
  200. },
  201. "speech": {
  202. "x_rate": 20,
  203. "y_rate": 30,
  204. "width_rate": 50,
  205. "height_rate": 50
  206. }
  207. },
  208. "leftup_small": {
  209. "tail": 3,
  210. "size": 0,
  211. "balloon": {
  212. system_picture: "BASE64ENCODEDATA"
  213. },
  214. "speech": {
  215. "x_rate": 20,
  216. "y_rate": 30,
  217. "width_rate": 50,
  218. "height_rate": 50
  219. }
  220. }
  221. }
  222. }

フキダシ

フキダシ SpeechBalloonModel

カラム

name和名typedefaultnulllimitnote
panel_id所属パネルidinteger FALSE
speech_balloon_template_idフキダシテンプレートidinteger FALSE
classnameフキダシクラス名string FALSE50jsのクラス名(テンプレートからのコピー)
z表示順位integer FALSE
t時間軸 順序integerfalse
settings拡張データstring json形式
created_atdatetime
updated_atdatetime

相違点

  • classname
    • 追加
  • settings
    • 追加

解説

クライアントは、このフキダシを表示するとき、classnameのクラスのインスタンスを生成する。たとえばclassnameの値が'Square'のフキダシだったとき、Squareクラス(フキダシを実装したクラス)を生成する。このとき初期化データとしてsettingsとフキダシ枠とセリフを渡す。Squareクラスはsettingsをjson文字列としてパースしてフキダシに必要な情報を取得する。settingsには、フキダシ全体に影響するプロパティが入っている(今のところ該当するプロパティはない)。これらのプロパティはjsのフキダシクラスとテンプレート間で合意があればどんな形式でもよい。

クライアントのフキダシ編集パネルは、再現性を保てるように(settingsを含めて)データを作成しなければならない。

フキダシ枠 BalloonModel

カラム

name和名typedefaultnulllimitnote
speech_balloon_idフキダシidinteger FALSE
system_picture_idフキダシ素材idinteger FALSE
x表示開始位置xinteger FALSE
y表示開始位置yinteger FALSE
width表示幅integer FALSE
height表示高さinteger FALSE
caption説明string フキダシの発言者などの予備情報
settings拡張データstring json形式
created_atdatetime
updated_atdatetime

相違点

  • settings
    • 追加

解説

クライアントのフキダシクラスはインスタンスを生成する。たとえばclassnameの値が'Square'のフキダシだったとき、Squareクラス(フキダシを実装したクラス)を生成する。このとき初期化データとしてこのデータ(フキダシ枠)が渡る。Squareクラスはsettingsをjson文字列としてパースしてフキダシ枠に必要な情報を取得する。settingsには、フキダシ画像に関連するプロパティが入っている(今のところ該当するプロパティは円形フキダシのrやサイズのバリエーションsize)。これらのプロパティはjsのフキダシクラスとテンプレート間で合意があればどんな形式でもよい。フキダシ編集パネルでrが60に設定されているなら'{"r":60}'って文字列が入っているから、コマ表示では60度のフキダシを表示し、コマ編集なら60度のフキダシを編集モードにする。

なお、ベクターフキダシが動かない環境では、サーバがsystem_picture_idのフキダシ画像をx・y・width・heightで表示する。このケースに備えて、クライアントのフキダシクラスは、コマ投稿時に表示中のベクターフキダシに最も近いフキダシ画像を選んでおかなければならないし、選べるようなパラメータを用意しておかなければならない。

セリフ SpeechModel

カラム

name和名typedefaultnulllimitnote
speech_balloon_idフキダシidinteger FALSE
content台詞string
x表示開始位置xinteger FALSE 単位は%
y表示開始位置yinteger FALSE 単位は%
widthinteger FALSE 単位は%
height高さinteger FALSE 単位は%
settings拡張データstring json形式
created_atdatetime
updated_atdatetime

相違点

  • settings
    • 追加

解説

フキダシ枠と同様。 settingsに入るデータは今のところ不明(フォントや書式が入るかも)

フキダシサンプル

長方形フキダシのデータ。座標やサイズは適当。

  1. speech_balloon : {
  2. "z": 1,
  3. "t": 0,
  4. "classname": "Square",
  5. "speech_balloon_template_id": 1,
  6. "balloon_attributes": {
  7. "new1": {
  8. "system_picture_id": 1,
  9. "x": 30,
  10. "y": 30,
  11. "width": 50,
  12. "height": 50
  13. }
  14. },
  15. "speech_attributes": {
  16. "new1": {
  17. "content": "hello",
  18. "x": 30,
  19. "y": 30,
  20. "width": 50,
  21. "height": 50
  22. }
  23. }
  24. }
円フキダシのサンプル。尻尾の向きが保存されている。
  1. speech_balloon : {
  2. "z": 1,
  3. "t": 0,
  4. "classname": "circle",
  5. "speech_balloon_template_id": 2,
  6. "balloon": {
  7. "system_picture_id": 11,
  8. "x": 22,
  9. "y": 30,
  10. "width": 50,
  11. "height": 50,
  12. "settings": "
  13. {"r": 45}
  14. "
  15. },
  16. "speech": {
  17. "content": "hello",
  18. "x": 22,
  19. "y": 30,
  20. "width": 50,
  21. "height": 50
  22. }
  23. }

まとめ

サーバとしては、フキダシ(SpeechBalloonModelSpeechModelSpeechModel)をベターな形で預かれればいいので、テンプレート⇔フキダシ部分のデータ変換はクライアントで好きにやってねってことです。

テンプレート作成の考え方は HowToMakeSpeachBalloon の流れとまったく変わりません。

SbtSpl