pyxen.GridBody

GridBodyGridMapと連携するグリッドベースの衝突コンポーネントです。

衝突のコンセプトについては衝突判定を参照してください。


コンストラクタ

GridBody(
    *,
    pos=None,
    size=None,
    move=None,
    tag=None,
    mask=None
)

すべてのパラメータはキーワード専用です。


パラメータ

パラメータ説明
pos(x, y)ピクセル単位の初期位置
size(w, h)ピクセル単位のボディサイズ
move(x, y)移動ベクトル
tagintボディタグ
mask(int, …)衝突するタイルタグのタプル

e = world.spawn(
    name="hero",
    sprite=sprite,
    layer=LAYER_HERO,
    body=GridBody(
        pos=(64, 64),
        size=(16, 16),
        move=(0, 0),
        tag=TAG_PLAYER,
        mask=(TAG_WALL, TAG_MONSTER)
    )
)

GridBodyのアタッチ

spawn()時:

player = world.spawn(
    body=GridBody(pos=(32, 32), size=(16, 16))
)

または後から:

entity = world.spawn()
entity.body = GridBody(size=(16, 16))

プロパティ

move

タプルまたはVector2iで移動ベクトルを設定:

body.move = (1, 0)

moveを読み取るとVector2iが返されます:

m = body.move
print(m.x, m.y)

予定されているプロパティ

プロパティ説明
posボディの位置
sizeボディのサイズ
tagボディタグ
mask衝突マスク

タグシステム

tag

各ボディは1つのタグを持ちます:

body.tag = TAG_PLAYER

mask

マスクはこのボディがどのタグと衝突するかを定義します:

body.mask = (TAG_WALL, TAG_MONSTER)

GridBody + GridMapの連携

GridBodyはGridMap内のタイルおよび他のGridBodyと、タグフィルタリングに基づいて衝突します。

衝突を解決するには、GridBodyはGridMapエンティティの子でなければなりません。


移動の例

body = player.body

if input.keyboard.left.down:
    body.move = (-1, 0)

if input.keyboard.right.down:
    body.move = (1, 0)

最小セットアップ

level = world.spawn(
    map=GridMap(
        rows=10,
        columns=10,
        size=(16, 16)
    )
)

player = world.spawn(
    parent=level,
    body=GridBody(
        pos=(16, 16),
        size=(16, 16),
        tag=1,
        mask=(2,)
    )
)

一般的なパターン:プレイヤー vs 壁

TAG_PLAYER = 1
TAG_WALL = 2

player = world.spawn(
    body=GridBody(
        pos=(32, 32),
        size=(16, 16),
        tag=TAG_PLAYER,
        mask=(TAG_WALL,)
    )
)

タイルが以下のように設定されている場合:

map.set(row=0, column=5, tag=TAG_WALL)

プレイヤーはそのタイルと衝突します。