次ログ

次ログ

ゆるりと働いているSREの技術ブログのような何か。趣味の話も書く

キャラ設定を考えるためのアプリ作りました

お久しぶりです。次郎です。

現状報告

仕事が忙しくて、ゲーム制作に着手できないので、
ゲーム制作の少しでも楽にするためのモノばかり作っています。

最近はもっぱらPythonBashを勉強していて、
ちょっとした作業の自動化とかしつつ、ゲーム制作を放置しています。

たとえば、キャラの表情の差分を組み合わせて、
一気に差分画像を生成するツールとかもPythonで作成しました。

配布とかはしていませんが、Github上にはすでに存在します。
ただし、ドキュメントとかは一切用意していませんが・・・。

せっかくつくったツールなので、誰かに公開したいと思っているのですが、
いくつか問題がありまして、Pythonは実行環境がないと動かせないのと、
exe化するとファイルサイズが巨大化する点です。

なので、配布するなら自分用の簡単なのを作って、
Javaに移植するといった感じで今まで作っていたのですが、
最近Javaを書くのが結構しんどくて…。

代替案として、Go言語というのが良さそう? と最近知ったので、Pythonと平行しつつ、Go言語も勉強しようかなぁと
思っている次第です。

目次

作成したアプリ

前置きはそこまでに、今回作成したアプリについて、一応紹介します。
下記のリンク先がそれです。

https://jiro4989.github.io/charaseat/

今回の実装ではそれなりにたくさんのデータを扱うということだったので、 Javascriptで動的にデータを追加するには、処理が重いかと考えたので、 アップ前にPythonでHTMLを生成してGithubにアップするようにしています。

htmlのテーブル部分生成スクリプト

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
from datetime import datetime
from os.path import splitext, basename

def main():
    datas = [
              "res/data/一人称.html"
            , "res/data/二人称.html"
            , "res/data/性格.html"
            , "res/data/髪型.html"

            , "res/data/トップス.html"
            , "res/data/ズボン.html"
            , "res/data/スカート.html"
            , "res/data/ドレス.html"
            , "res/data/制服.html"
            , "res/data/アンダーウェア.html"
            , "res/data/履物.html"
            , "res/data/かぶりもの.html"
            , "res/data/寝巻き着.html"
            , "res/data/水着.html"
            , "res/data/装身具.html"

            , "res/data/その他.html"
            ]

    checkboxtext = \
            '<label>' \
                '<input' \
                ' type="checkbox"' \
                ' name="{title}"' \
                ' value="{title}:{text}"' \
                ' onclick="updateRecords();"' \
                ' />' \
                '{fulltext}' \
            '</label>'

    tables = []
    for filepath in datas:
        with open("table.html") as table:
            tabletext = table.read()
            with open(filepath) as datafile:
                caption = splitext(basename(filepath))[0]

                line = datafile.readline()
                trs = []
                while line:
                    line = line.rstrip("\n")
                    if line == "":
                        continue

                    if line.startswith("<"):
                        text = re.sub(r"</?[^>]+>", "", line)
                    else:
                        text = line

                    text = checkboxtext.format(title=caption, text=text, fulltext=line)
                    text = "<tr><td>{}</td></tr>".format(text)
                    trs.append(text)
                    line = datafile.readline()
                tbody = "\n".join(trs)
                newtable = tabletext.format(caption=caption, tbody=tbody)
                tables.append(newtable)

    htmllines = []
    with open("template.html") as template:
        text = "\n".join(tables)
        line = template.readline()
        while line:
            if "{target}" in line:
                htmllines.append(text)
            elif "{time}" in line:
                now = datetime.now().strftime("%Y/%m/%d")
                htmllines.append(now)
            else:
                htmllines.append(line)
            line = template.readline()

    with open("index.html", "w") as indexhtml:
        indexhtml.write("".join(htmllines))

if __name__ == '__main__':
    main()

テーブル埋め込みのテンプレートhtml

<div class="charaTableArea">
  <input type="button" value="ランダム設定" onclick="setRandomContent('{caption}');" />
  <table border="1">
    <caption>{caption}</caption>
    <thead>
      <tr style="background-color: yellow;">
        <td>項目</td>
      </tr>
    </thead>
    <tbody>
      {tbody}
    </tbody>
  </table>
</div>

やりかたは単純。

dataフォルダ配下に、1行に1データを記述しただけのテキストファイルを配置し、 それをPythonで読み込んで、ファイル名をcheckboxのnameに、データをvalueとする 文字列を生成して、それをtable.htmlの{tbody}にformatで埋め込んでいるだけです。

これで、スクリプトを実行すると index.htmlが更新されるという仕組みです。

pushする前にスクリプトを実行するスクリプトを用意しておけば、 データを更新して、pushするだけで完成、というわけです。

お手軽です。

所感

極限までデザインは手抜き、いろいろ手抜きです。   自分用に作ったアプリですが、正直使うか怪しいです。

今回のアプリ制作を通して得た知見としては、
GithubPagesでWebアプリを作る方法がわかった、ということくらいです。

以上です。