1

レベルのスクロールが原因で、マウスの位置を更新したり、(マウスとエンティティ間の) エンティティの衝突をチェックしたりするのに問題があります。この質問のカメラ機能を使用しました: How to add scrolling to platformer in pygame

次のように、マウスでカメラ機能を使用しようとしました。

def update(self, target, target_type, mouse):
        if target_type != "mouse":
            self.state = self.camera_func(self.state, target.rect)
        else:
            new_pos = self.camera_func(mouse.rect, target.rect)
            mouse.update((new_pos[0], new_pos[1]))
            print mouse.rect

しかし、mouse.rect は一貫して に設定されてい608, 0ます。誰かがこれで私を助けることができますか? マウスクラスは次のようになります。

class Mouse(Entity):

    def __init__(self, pos):
        Entity.__init__(self)
        self.x = pos[0]
        self.y = pos[1]
        self.rect = Rect(pos[0], pos[1], 32, 32)

    def update(self, pos, check=False):
        self.x = pos[0]
        self.y = pos[1]
        self.rect.top = pos[1]
        self.rect.left = pos[0]

        if check:
            print "Mouse Pos: %s" %(self.rect)
            print self.x, self.y

画面をクリックして衝突テストを通過するたびに、常に画面上のポイントが使用されますが、マップ上のポイントが必要です (それが理にかなっている場合)。たとえば、画面サイズは640x640. 左上隅をクリックすると、マウスの位置は常になります0,0が、実際のマップ座標は320,180画面の上隅にある場合があります。カメラとマウスですべてを更新しようとしましたが、実際の結果はcamera.updateマウスに関数を適用したときだけですが、これによりプレーヤーがスクロールの原因になるのを止めるので、mouse.rectこの関数で更新しようとしました.

試みたコード:

    mouse_pos = pygame.mouse.get_pos()
    mouse_offset = camera.apply(mouse)
    pos = mouse_pos[0] + mouse_offset.left, mouse_pos[1] + mouse_offset.top
    mouse.update(mouse_pos)
    if hit_block:
        print "Mouse Screen Pos: ", mouse_pos
        print "Mouse Pos With Offset: ", pos
        print "Mouse Offset: ", mouse_offset
        replace_block(pos)
4

2 に答える 2

2

スクリーン座標であるマウスを読み取ると。スクロールしているので、衝突を確認するにはワールド座標が必要です。

レンダリングループは次のように簡素化されます

# draw: x+offset
for e in self.entities:
    screen.draw(e.sprite, e.rect.move(offset))

これはと同じですdraw( world_to_screen( e.rect ))

あなたのクリックはcollidepoint( screen_to_world( pos ))

# mouseclick
pos = event.pos[0] + offset.left, event.pos[1] + offset.top
for e in self.entities:
    if e.collidepoint(pos):
        print("click:", pos)
于 2013-07-17T13:46:46.550 に答える
1

カメラは、指定されたワールド座標によってスクリーン座標を計算します。

マウスの位置は既に画面座標であるため、マウスの下にタイルを取得する場合は、オフセットを追加するのではなく、減算する必要があります。

Camera次のメソッドをクラスに追加できます。

def reverse(self, pos):
    """Gets the world coordinates by screen coordinates"""
    return (pos[0] - self.state.left, pos[1] - self.state.top)

次のように使用します。

    mouse_pos = camera.reverse(pygame.mouse.get_pos())
    if hit_block:
        replace_block(mouse_pos)
于 2013-07-18T11:44:03.197 に答える