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 回答