2015-05-31 3 views
0

Я делаю платформу 2d с использованием Python с PyGame. Все идет хорошо, но я столкнулся с множеством проблем с обнаружением столкновений. Вот они:Обнаружение столкновений с PyGame

  1. Вы не можете пройти через объекты, которые имеют точное место для вас, чтобы пройти через
  2. Вы можете пройти через потолок (очень странный)

код у меня есть очень большой, и я думаю, что, поскольку он включает несколько классов, я должен опубликовать его на GitHub, так что вот ссылка на мой репозиторий: https://github.com/pta2002/SuperBros.

Но только для справки, вот мой метод обнаружения colliion:

def detectCollisions(self, x1, y1, w1, h1, x2, y2, w2, h2): 

    if x2 + w2 >= x1 >= x2 and y2 + h2 >= y1 >= y2: 
     return 1 

    elif x2 + w2 >= x1 + w1 >= x2 and y2 + h2 >= y1 >= y2: 
     return 2 

    elif x2 + w2 >= x1 >= x2 and y2 + h2 >= y1 + h1 >= y2: 
     return 3 

    elif x2 + w2 >= x1 + w1 >= x2 and y2 + h2 >= y1 + h1 >= y2: 
     return 4 

    else: 
     return 0 

и вот мой метод обновления:

def update(self, gravity, block_list): 
    if self.velocity < 0: 
     self.falling = True 

    collision = 0 
    blockX, blockY = 0, 0 
    self.canMoveRight = True 
    self.canMoveLeft = True 

    for block in block_list: 
     collision = self.detectCollisions(self.x, self.y, self.width, self.height, 
     block.x, block.y, block.width, block.height) 

     if not collision == 0: 
      blockX = block.x 
      blockY = block.y 
      break 

    if not collision == 0: 
     if self.falling: 
      self.falling = False 
      self.onGround = True 
      self.velocity = 0 
      self.y = block.y - self.height 
     else: 
      if collision == 2: 
       self.canMoveRight = False 

      if collision == 1: 
       self.canMoveLeft = False 
    else: 
     self.falling = True 
     self.onGround = False 

    if not self.onGround: 
     self.velocity += gravity 

    self.y -= self.velocity 
    if (self.canMoveRight and self.xvel > 0) or (self.canMoveLeft and self.xvel < 0): 
     self.x += self.xvel 

    if self.jumping: 
     if self.onGround: 
      self.velocity = 8 
      self.onGround = False 

    if self.cur_image >= self.num_images - 1: 
     self.cur_image = 0 
    else: 
     self.cur_image += 1 
+1

Почему вы переходящим в й/г/ш/в 1 и 2? Почему бы не пройти в двух прямых объектах? – DJMcMayhem

+0

Да. Существует метод «Rect», который имеет проверку на столкновение. Проверьте документы pygame – bcdan

ответ

0

ознакомятся с pygame.Rect, это в значительной степени решает все проблемы с обнаружением столкновения, если вы используете спрайты. (https://www.pygame.org/docs/ref/rect.html) Вы сталкиваетесь их, как это (метод возвращает Истину, если они сталкиваясь):

rect.colliderect(otherrect)