[Pyxel]camera関数を使ってプレイヤーを常に画面中央に表示する

Pyxel

移動中のプレイヤーを常に画面中央に表示する

多くのRPGでは、プレイヤーが移動してもプレイヤーを画面中央に表示した状態を維持しています。
Pyxelでは、camera関数を使うことでこの表示方法をわかりやすく実現することができます。

Pyxelのcamera関数を使う

Pyxelのcamera関数について、公式ドキュメントでは以下のように書かれています。

  • camera(x, y)
    画面の左上隅の座標を (xy) に変更します。camera()で左上隅の座標を (00) にリセットします。

これをどのように使うかというと、以下のような感じです。

  • フィールドをウインドウサイズよりも広めに描写しておく
  • プレイヤーがウインドウ中央に表示されるように、プレイヤーの座標を使ってカメラの座標をセットする

具体例

以下のようなコードを書いてみました。

import pyxel

class Window:
    WIDTH = 128
    HEIGHT = 128

class CameraTest:
    def __init__(self):
        pyxel.init(Window.WIDTH, Window.HEIGHT,title="test")
        pyxel.load('./my_resource.pyxres')

        # プレイヤーのx,y座標
        self.player_x = 100
        self.player_y = 100

        # プレイヤーの幅と高さ
        self.player_w = 8
        self.player_h = 8

        pyxel.run(self.update, self.draw)

    def update(self):
        # プレイヤーの移動
        dx,dy = 0,0
        if pyxel.btn(pyxel.KEY_RIGHT):
            dx = 1
        elif pyxel.btn(pyxel.KEY_LEFT):
            dx = -1
        if pyxel.btn(pyxel.KEY_DOWN):
            dy = 1
        elif pyxel.btn(pyxel.KEY_UP):
            dy = -1

        self.player_x += dx
        self.player_y += dy

        # カメラの移動
        pyxel.camera(self.player_x - (Window.WIDTH - self.player_w) / 2, self.player_y - (Window.HEIGHT - self.player_h) / 2)

    def draw(self):
        pyxel.cls(0)
        # フィールド(ウインドウサイズよりも広く描写)
        pyxel.bltm(0,0,0,0,0,Window.WIDTH * 4, Window.HEIGHT * 4)

        # プレイヤー
        pyxel.blt(self.player_x,self.player_y,0,0,8,8,8,pyxel.COLOR_BLACK)

CameraTest()

プレイヤーを適当な座標に配置した状態からスタートし、update関数では移動させた後にカメラもプレイヤーの座標に対してウインドウ半分左上にずらした位置にセットしています。
以下のような感じで、プレイヤーはウインドウの中心にいる状態を維持して移動することができます。

注意すべき点として、プレイヤーがフィールドの端まで来てしまうと描画が切れてしまうことが挙げられます。
プレイヤーは一定の場所より先には移動できないようにする等の制御が必要となります。

参考URL

pyxel/docs/README.ja.md at main · kitao/pyxel
A retro game engine for Python. Contribute to kitao/pyxel development by creating an account on GitHub.

タイトルとURLをコピーしました