1

パックマンゲームを作っています。基本的に、ブロック/タイルで構成されるこのウィンドウのマップ表現が必要です。次に、パックマンのキャラクター/ゴーストが移動すると、マップ上の位置を変更して画面上の内容を表し、それを衝突検出などに使用します.

特に画面はx、y座標で構成されているため、このマップを作成するにはどうすればよいですか?タイル/このマップでそれらを正しく表現するにはどうすればよいですか?

4

4 に答える 4

3

オブジェクトやインターフェイスについて考え始めたくなる気持ちはわかりますが、各要素が 40 ピクセルか何かを表す 2 次元配列について考えたことはありますか? 衝突に関しては、パックマンがピクセル単位で正確だったことを覚えていません。それよりも、各ピースが移動する方向の問題です。

于 2009-03-07T21:42:21.860 に答える
1

一般に、ピクセル自体を参照しない抽象的な表現があり (たとえば、パックマンの迷路は単純に幅が w 単位である可能性があります)、線形変換 (ご存知のとおり、y = mx + b) があります。抽象的な表現を実際のピクセルに変換します。

具体的にするために、抽象表現を 100 ユニット幅にし、400 ピクセルとしてレンダリングしたいとします。次に、変換は単に scrn_x = 4 * x です。

于 2009-03-07T21:42:46.837 に答える
0

自分で書かないとこれを思いつくのはちょっと難しいですが。

最初に、ICollidable を実装するエンティティ定義を作成する必要があります。エンティティには、ゴースト、パックマン、ドット、パワーアップが含まれます。マップ内の各要素には、他の情報とともに、存在するすべてのエンティティのリストと、精度を高めるための一種の「位置」値が含まれます。ICollidable インターフェイスには、どのエンティティが互いに衝突するかを判断するためのロジック (たとえば、ゴーストはドットと衝突しません) だけでなく、それらが互いに衝突する位置にあるかどうかを判断するロジックも含まれます。つまり、パックマンが右からスペースに入り、ゴーストが左からそのスペースを離れる場合、衝突はありません。また、正確に pacman がいつドットを食べたのかを判断するのにも役立ち、グラフィカルに正しく見えるようになります。IE pacman がスペースに入った直後にドットを破壊すると、

于 2009-03-07T21:32:38.763 に答える
0

パックマンやゴーストなどのスプライトは、位置 (x,y) で表されます。それらが互いに衝突するかどうかを判断するには、次の疑似コードを使用します。

sprites = [ ... list of sprites ... ]
for i1=0 to len(sprites):
    sprite1 = sprites[i1]
    for i2 = i1+1 to len(sprites):
        sprite2 = sprites[i2]
        if (sprite1.x-sprite2.x)^2+(sprite1.y-sprite2.y)^2 < radius_of_sprites^2:
            collide(sprite1, sprite2)

これにはマップがまったく含まれていないことに注意してください。pacman とマップの間の衝突を個別にチェックできます。ここでの重要なトリックは、パックマンの各側面 (上、下、左、右) のピクセル座標を分割し、衝突をチェックすることです。たとえば、pacman が右に移動している場合、右端で衝突をチェックする必要があります。

pacman_tile_x = (pacman.x+tilesize/2)/tilesize    # added tilesize/2 to check the middle of pacman
pacman_tile_y = pacman.y/tilesize + 1   # +1 because right edge is 1 tile to the right of the sprite's coordinate
if tile[pacman_tile_x][pacman_tile_y].is_a_wall:
    ... wall collide code ...

画面上に膨大な数のスプライトがある場合、マップ内の特定のタイルに存在するスプライトを保存することで、スプライト間の衝突検出を最適化できるため、隣接するタイルのスプライトに対してチェックするだけで済みます。 . しかし、最初のパスとこの pacman ゲームでは、おそらく必要な最適化ではありません。

于 2009-03-07T21:52:40.137 に答える