BASICのDATAを流用してキャラクターを作成する(pyxel)

tamuraです。

pyxelというレトロゲームエンジンがあるので、ベーマガのプログラムを動かしてみたくなりました。 (動かしたいゲームはこのWelComeToGreeNWooD!


pyxelはドット絵を打つツールが付属している。これはありがたい。
で、BASICのDATA文をもとにドットを打っていった。




これはきつい。





そしたら作者から回答をいただきました。






なんと!


ということは、DATA文をREADしてpsetするプログラムを書いて、画像にすれば解決じゃないですか。


で、Pythonでちろっと書いてみた。


from PIL import Image
import sys

PALETTE = [  0,   0,   0, # BLAK
             0,   0, 255, # BLUE
           255,   0,   0, # RED
             0,   0, 128, # PURPLE -> DARK GREEN
             0, 255,   0, # GREEN
             0, 255, 255, # CYAN
           255, 255,   0, # YELLOW
           128, 128, 128] # WHITE -> GRAY

CHARS = 11

if len(sys.argv) < 2:
    print("need data file")
    sys.exit()

file = sys.argv[1]

with open(file) as f:
    l = [s.strip() for s in f.readlines()]

img = Image.new('P', (16, CHARS * 16))
img.putpalette(PALETTE)

for i in range(CHARS):
    for y in range(8):
        for x in range(16):
            col = int(l[y + i * 8][x])
            img.putpixel((x, y * 2     + i * 16), col)
            img.putpixel((x, y * 2 + 1 + i * 16), col)

img.save('data.png')
img.show()

これは

1111111111111111
2222222222222222
1111111111111111
2222222222222222
1111111111111111
2222222222222222

こんな感じのBASICのDATA文を1行にしたものを渡すとPNGにします。

で、いちおう完成したのでPyxelに取り込んでみたところ、





ちょっとパレットがおかしいですね・・・。 (pyxelはカスタムのパレットは定義できるみたいですが、このエディタ上では指定できないみたいで)

これを手で直すのも面倒なので、pyxelのパレットを定義して近い色を割り当てました。

from PIL import Image
import sys

# pyxelのパレット
PALETTE = [   0,   0,   0,
             29,  43,  83,
            126,  37,  83,
              0, 135,  81,
            171,  82,  54,
             95,  87,  79,
            194, 195, 199,
            255, 241, 232,
            255,   0,  77,
            255, 163,   0,
            255, 236,  39,
              0, 228,  54,
             41, 173, 255,
            131, 118, 156,
            255, 119, 168,
            255, 204, 170]

# pyxelのパレットに変換する
CONV = [ 0, # BLACK -> 0
         1, # BLUE -> 1
         8, # RED -> 8
         3, # DARK GREEN -> 3
         11, # GREEN -> 11
         12, # CYAN -> 12
         10, # YELLOW -> 10
         6] # GRAY -> 6

CHARS = 11


if len(sys.argv) < 2:
    print("need data filename")
    sys.exit()

file = sys.argv[1]

with open(file) as f:
    l = [s.strip() for s in f.readlines()]

img = Image.new('P', (16, CHARS * 16))
img.putpalette(PALETTE)

for i in range(CHARS):
    for y in range(8):
        for x in range(16):
            col = CONV[int(l[y + i * 8][x])]
            img.putpixel((x, y * 2     + i * 16), col)
            img.putpixel((x, y * 2 + 1 + i * 16), col)

img.save('data.png')
img.show()

でやってみました。



いい感じです。

comments powered by Disqus