やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

pyxelのAPIでTileMapをつくる

 使いづらい。

成果物

demo

コード

#!/usr/bin/env python3
# coding: utf8
import pyxel
def update(): pass
def draw(): pyxel.bltm(0, 0, 0, 0, 0, 32, 32)
pyxel.init(32, 32, caption='TileMap API Test')
pyxel.image(0).set(0, 0, [
    "3333333333333333",
    "333333333333a333",
    "33333b33333a7a33",
    "33333b333333a333",
    "33333b333333b333",
    "3b333333333bbb33",
    "3b3333333333b333",
    "3333333333333333",
    "4444444400000000",
    "4444444400000000",
    "44444d4400000000",
    "4444444400000000",
    "4444444400000000",
    "4444444400000000",
    "4d44444400000000",
    "4444444400000000",
])
pyxel.tilemap(0).refimg = 0
pyxel.tilemap(0).set(0, 0, [
    '001000000000',
    '000001000000',
    '000000001000',
    '000000000001'
])
pyxel.run(update, draw)

要点

pyxel.tilemap(0).set(0, 0, [
    '001000000000',
    '000001000000',
    '000000001000',
    '000000000001'
])

 これはタイルID01を使っている。タイルIDは03ffまで。タイル1枚あたり3桁必要。なので0番は000, 1番は001と表現している。16進数。英字は小文字。

わかりづらい

  1. 文字列の1次元配列である
    1. IDを文字列で表している
    2. 横(X軸)のタイルIDを文字列で連結している

 なんたるクソ仕様か。

こうして欲しかった

 数値の二次元配列にして欲しい。

  • 文字列ならせめて1つの文字列が良かった
  • 数値の二次元配列にしてくれ

文字列ならせめて1つの文字列が良かった

pyxel.tilemap(0).set(0, 0, """001000000000
000001000000
000000001000
000000000001
""")

 1行ずつの文字列リストにするとか面倒なだけで何のメリットも無いと思うのだが……。

数値の二次元配列にしてくれ

pyxel.tilemap(0).set(0, 0, [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])

 整数値型にしたほうが良い。加算など算術計算できて動的に変更しやすいから。ランダムマップを作るときに好都合。

 文字列の場合、変更するたびに毎回、以下のような面倒な処理が必要になる。

  1. IDを算術計算する
  2. IDを文字列化する
    1. 3桁であること
    2. ゼロ埋めすること
    3. 16進数であること
      1. 英字は小文字であること

騙された

 APIには以下のように書いてある。

data
タイルマップのデータ (256x256の二次元リスト)

 しかし、以下のような問題があった。騙された。

  • 代入できない
  • 二次元リストでない

 以下のようなコードではエラーになる。

pyxel.tilemap(0).data = [[1,0],[0,1]]
pyxel.tilemap(0).data = [['001','000'],['000','001']]
pyxel.tilemap(0).set(0, 0, [[1,0],[0,1]])
pyxel.tilemap(0).set(0, 0, [['001','000'],['000','001']])

 たぶんTileMap.dataは整数値の二次元配列なのだろうが、代入できない。公開されているAPIのうち代入できるset()は文字列配列型で受け付ける仕様なのだろう……。

どうやって作ったか

 タイル画像はイメージエディタで編集し、.pyxresを展開し、vimでコピペした。以下参照。

image_editor vim矩形選択

前回まで

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux