Javaゲームで400x400ウィンドウをマップとして表示するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/622517

  •  05-07-2019
  •  | 
  •  

質問

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

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

役に立ちましたか?

解決

オブジェクトやインターフェイスについて考え始めるのは魅力的ですが、各要素が40ピクセルなどを表す2次元配列について考えましたか? pacmanが衝突に関してピクセル精度であったことは覚えていません。各ピースが移動する方向についての質問です。

他のヒント

一般的に、ピクセルを参照しない抽象表現があり(たとえば、パックマンの迷路は単にwユニット幅です)、線形変換があります(知っている、y = mx + b )実際のピクセルに抽象表現を運びます。

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

自分で作成せずにこれを思い付くのは難しいですが、

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

pacmanやゴーストなどのスプライトは、位置(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が右側に移動する場合、衝突がないか右端を確認する必要があります。

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 ...

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top