私はRabbytライブラリを調べ始めましたが、これまでのところ、pygletと組み合わせて使用することを本当に楽しんでいます。
ライブラリに実装されていないように見えることの1つは、スプライト間のピクセル完全衝突検出です。それを実装するには2つの問題があります。
まず、スプライトのテクスチャをロードするためにpygletを使用していますが、テクスチャからビットマスクを取得する方法がわかりません(私の非常に限られたOpenGLの知識が主な問題です)。BufferImageMaskはAbstractImageインスタンスから取得されているようですが、テクスチャ自体からは取得されていないようです。それを行う正しい方法は何ですか?
第二に、実際の衝突検出アルゴリズムを実装するためのさまざまな方法は何ですか?私がこれまで読んだことはすべて次のようになっているので、私は主に方法/バリエーションがあるかどうかに興味があります:
重要な情報を見逃さないようにしています。アルゴリズム自体はしっかりしています。
前もって感謝します!
PS私はPython2.7でコーディングしていますが、実際のピクセル完全衝突検出アルゴリズムをCで実装し、それを拡張機能として使用したいと思います。
アップデート
回転していないスプライトでピクセルパーフェクトな衝突検出を機能させることができました。
r1 = collision[entity1].aabb
r2 = collision[entity2].aabb
sprite1 = renderable[entity1].sprite
sprite2 = renderable[entity2].sprite
ri = r1.intersect(r2)
offx1, offy1 = int(ri.left - r1.left), int(ri.top - r1.top)
offx2, offy2 = int(ri.left - r2.left), int(ri.top - r2.top)
d1 = sprite1.texture.get_image_data().get_data('A', sprite1.texture.width)
d2 = sprite2.texture.get_image_data().get_data('A', sprite2.texture.width)
p1 = cast(d1, POINTER(c_ubyte))
p2 = cast(d2, POINTER(c_ubyte))
for i in range(0, int(ri.width)):
for j in range(0, int(ri.height)):
c1, c2 = 0, 0
x1 = offx1+i
y1 = (j+offy1)*sprite1.texture.width
x2 = offx2+i
y2 = (offy2+j)*sprite2.texture.width
if x1 >= 0 and y1 >= 0:
c1 = p1[x1 + y1]
if x2 >= 0 and y2 >= 0:
c2 = p2[x2 + y2]
if c1>0 and c2 >0:
pairs.add(pair)
break
衝突とレンダリング可能は、特定のエンティティに関連付けられているオブジェクトの単なる辞書です。アルゴリズムはこれの修正バージョンです:Pygletピクセルの完全な衝突
それはかなり良いですが(そして、そのようなコードを一緒にハッキングした場合でも)、回転したスプライトには役に立ちません(異なる角度で同じスプライトの約100の異なるバージョンをキャッシュすることが実行可能なオプションでない限り、これは必要です)、私はまだその問題の解決策を探しています。