在pygame中使用鼠标获取世界坐标

时间:2013-07-17 13:23:26

标签: python pygame

由于我的关卡滚动,我无法更新鼠标位置并检查实体碰撞(鼠标和实体之间)。我使用了这个问题的相机功能: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)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

相机按给定的世界坐标计算屏幕坐标。

由于鼠标位置已经是屏幕坐标,如果要在鼠标下方获取图块,则必须减去偏移量,不添加。< / p>

您可以将以下方法添加到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)