2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

漢字をドット絵で表現したいけどできるだけ楽したかった

Posted at

自分で見返すつもりすらなくコードを書いていたので、命名やコメントなどおかしな点があると思います。
ご使用される場合は適切に修正して下さい。

動機

先日、Python向けレトロゲームエンジンPyxelの開発者の記事に触発され、個人開発の練習もかねてPyxelでミニゲームの開発を行いました。
その中で、漢字をドット絵で表現するためにやったことを記事にしておきます。
(pyxelに関する内容はほとんどありません。開発中参考にさせていただいた記事は最後にまとめてあります。)

最終的に作ったものはこちらです。
image.png

簡単にゲームの概要

ゲームのアイディアは子供の頃にハマっていたパワポケ8のミニゲームを参考にしました。
1から16までの数字を順番に素早く押すだけのゲームです。
ローマ数字と漢数字を1~16まで用意したかったのですが、32×32のドット絵を32枚用意する段階で心が折れ、早々に諦めかけてました。

文字をドット絵として出力する方法を探る旅

どうしようかと悩んでいるふりをしながら数日サボっていたのですが、いい感じのサイトを発見してやる気を取り戻しました。
ので、chatGPTさんに「テキスト文字列をドットマトリクスに変換する方法」と聞きました。
その結果、Pillowというライブラリを使うといい感じだよ!と教えてもらえたので、サンプルコードをベースに32種類の文字を出力しました。
(pyxelのエディタ内でドット絵を修正したかったため、8種類を4回に分けて出力しました)

以下のサンプルコードでは、漢字二文字を1枠に収めるため悪戦苦闘している無様な姿が見られます。

python dot.py
from PIL import Image, ImageDraw, ImageFont

def render_text_to_matrix(text, font_path="YuGothM.ttc", font_size=8):
    font = ImageFont.truetype(font_path, font_size)
    # 文字列を描画
    img = Image.new("1", (len(text) * font_size, font_size), color=0)
    draw = ImageDraw.Draw(img)
    draw.text((0, 0), text, font=font, fill=1)

    # ドットパターン取得
    pixels = img.load()
    matrix = []
    for y in range(img.height):
        row = []
        for x in range(img.width):
            row.append("f" if pixels[x, y] else "0")
            # 行の形式を調整: 先頭に '[', 末尾に ']', 文字の間に ','
        formatted_row = f"[{','.join(row)}],"
        matrix.append(formatted_row)

    return "\n".join(matrix)

def save_to_file(matrix, file_path="output.txt"):
    with open(file_path, "w", encoding="utf-8") as f:
        f.write(matrix)
# サンプル実行
matrix = render_text_to_matrix("九十閂仁仁泗伍鮫", font_size=32)
save_to_file(matrix, "output.txt")
print("結果を 'output.txt' に書き出しました。")

その後

出力した.txtファイルからPyxelエディタで使える.pyxeresファイルに変換する必要があったり、「十一」を合わせて一文字分の幅に直すなどの微調整が必要だったりと大変だったのですが、めんどくさいと思ったらAIに聞いて勉強すればよかったなと思いました。
お見苦しいソースコード(かつ、無駄なコードも置きっぱなし)ですが、全体は以下から見えます。
github

感想コーナー

私の作成したものは開始画面がなかったり、ミスした時、クリアした時の演出がなかったり、ゲームとしては不完全だと思っています。
ただ、今回の開発の目的がPyxelで作成したゲームを公開することだったので、これでヨシとしています。
もう演出にこだわるモチベは無いですが、よく見かける王様が「HELP ME!」と叫んでいるやつとかを参考にすればよかったなぁとか思います。

とてもためになる先人の記事

この記事を読むより数百倍の意義がある、私の開発を助けてくださった記事達です。
ここまで読んでしまったあなたは以下の記事を読んで、無駄にしてしまった時間を取り戻しましょう!

Pyxelの開発者様の記事

Pyxelおもしろそう!となった記事

開発環境を整える際に助けられました

画像関係の処理に苦戦しているときに助けられました

GithubPagesで公開する際に参考した作者様達

.pyxresファイルをエディタ以外から弄りたいときに助けられました
(私が実際に.zipに変えて解凍した際はデータ形式が異なっていたので、バージョン情報などに留意してください。)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?