2013-07-17 4 views
1

У меня возникли проблемы с обновлением положения мыши и проверкой сущностей (между мышью и объектом) из-за моей прокрутки уровня. Я использовал функцию камеры от этого вопроса: How to add scrolling to platformer in pygameПолучение мира Координаты с мышью в 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 

Everytime Я нажимаю на экране, и передать его через тест столкновения, он всегда использует точку на экране, однако мне нужна точка на карте (если это имеет смысл). Например, размер экрана равен 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) 

ответ

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) 
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) 
+0

Я добавил код для фактического ответа и там, кажется, вопрос, где смещение начинает уменьшаться по мере того, как оно проходит мимо высоты экрана или ширины – ReallyGoodPie

+1

Если вы вставляете полный код в pastebin (чтобы я мог его запустить), я могу посмотреть. – ninMonkey

+0

http://pastebin.com/Sx1KKBU2 это мой полный код. – ReallyGoodPie

Смежные вопросы