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