tamuraです。
pyxelというレトロゲームエンジンがあるので、ベーマガのプログラムを動かしてみたくなりました。 (動かしたいゲームはこのWelComeToGreeNWooD!)
pyxelはドット絵を打つツールが付属している。これはありがたい。
で、BASICのDATA文をもとにドットを打っていった。
これはきつい。
WelCome to GreeNWooDをpyxelで動かすべく、ドットを置いてる。BASICのDATA文をpyxelのasset形式に楽に変換できないもんだろうか・・・。地味にきついw pic.twitter.com/mT3ktYNS4p
— tamura shingo (@tamura_shingo) 2019年1月10日
そしたら作者から回答をいただきました。
解決作になるかはわからないですが、イメージ編集画面にpng画像をドロップするとアセットに取り込むことができますよ
— Takashi Kitao (@kitao) 2019年1月11日
なんと!
ということは、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()
でやってみました。
いい感じです。