iga-lab.dev
< tech/

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

2025-01-17

#Tech#Pyxel#ゲーム開発#開発

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

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

Pyxelのcamera関数を使う

Pyxelのcamera関数について、Pyxel API リファレンスでは以下のように書かれています。

camera(x, y) 描画オフセットを (x, y) に設定する。以降の描画操作は (-x, -y) だけずれる。

camera() 描画オフセットを (0, 0) にリセットする。

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

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

具体例

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

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 API リファレンス