はじめに
Pyxelでは、マップ移動を実装するにあたって便利なメソッドが用意されています。しかし、その解説記事があまりなく、あっても古い情報だったりするので、現在使える方法をご紹介いたします。
この記事の情報はversion 2.3.16のものです。
テンプレ
マップ移動をするにあたり、任意のタイルマップの特定の座標が、何のタイルか取得するメソッドを使用します。
tile = pyxel.tilemaps[n].pget(x, y)
print(tile) #(1, 3)など
pyxelのエディタを起動すれば確認できますが、タイルマップは0~7まで登録できます。このタイルマップの任意の番号と座標を指定することで、そのマスがどのタイルかを取得してくれます。
取得したタイルの情報は、イメージバンクの左上を0, 0としたときの座標で返してくれるので、以下のように移動可能なタイルをリストにしておくことで、簡単に移動判定ができます。
dest_x = 10 #移動先のx座標
dest_y = 10 #移動先のy座標
movable_tiles = [(0, 0), (0, 1), (2, 3)] #移動可能なタイルの一覧
if pyxel.tilemaps[0].pget(dest_x, dest_y) in movable_tiles:
#任意の移動処理
else:
#任意の衝突処理
移動不可能なタイルを一覧にしてもいいですが、移動可能なタイルのときのみ移動可にすることで、画面外の判定をする必要がなくなります。
このメソッドを使う場合、タイルには一つの機能しか持たせられません。したがって、違う機能を持たせたい時は、同じ模様のタイルをもう一つ用意する必要があります。
例)エンカウントするマスとエンカウントしないマス
おまけ
もしこのメソッドが使えない場合は、どのように実装する必要があるのか紹介します。pygameで作る場合は、必然的にこの処理をすることになりますね。
tilemap = [
[0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 0],
[0, 2, 2, 2, 1, 1, 0],
[0, 1, 1, 2, 1, 1, 0],
[0, 1, 1, 2, 1, 1, 0],
[0, 1, 1, 2, 2, 2, 0],
[0, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0]
]
dest_x = 2
dest_y = 3
movable_tiles = [1, 2]
if tilemap[dest_y][dest_x] in movable_tiles:
#任意の移動処理
else:
#任意の衝突処理
このくらいの規模なら二次元リストを用意するのも可能ですが、マップのサイズが大きくなればなるほど現実的ではなくなっていきます。また、複数マップを用意することが多いはずなので、やはり強力なメソッドである事がご理解いただけたと思います。
まとめ
マップ移動を実装するなら、pyxel.tilemaps[n].pget(x, y)
は必須級!
最後に
ここまで読んで下さりありがとうございました。今回は移動の判定にフォーカスしてメソッドの紹介をしました。他にも、camera
など便利な機能が用意されているので、一度公式ドキュメントに目を通してみると良いのではないでしょうか。