2014-09-02 2 views
1

Я пытаюсь создать рабочую систему прыжков в Pygame, но у меня возникают некоторые проблемы с обнаружением конфликтов. У меня есть уровень, сохраненный в списке, как это:Функция Pygame не вернет True на коллайдере

level = [ 
"WWWWWWWWWWWWWWWWWWWW", 
"W     W", 
"W     W", 
"W     W", 
"W     W", 
"W     W", 
"W     W", 
"W     W", 
"W     W", 
"W     W", 
"WWWWWWWWWWWWWWWWWWWW", 
] 
x = y = 0 
for row in level: 
    for col in row: 
     if col == "W": 
      Wall((x, y)) 
     x += 32 
    y += 32 
    x = 0 

Где каждая стена добавляется к списку и учитывая позицию, основанную на его месте в сетке.

Это класс стены:

class Wall (pygame.sprite.Sprite): 
    def __init__(self,pos): 
     pygame.sprite.Sprite.__init__(self) 
     walls.append(self) 
     self.rect = pygame.Rect(pos[0],pos[1],32,32) 

попытки переместить игрок Прямоугольником 30 пикселов, когда клавиша Up нажата и столкновение между игроком и одним из плиток обнаружено:

if event.type == KEYDOWN and event.key == K_UP: 
      if player.hitCheck(): 
       player.move(0,-30) 

hitCheck(), функция класса игрока, выглядит следующим образом:

def hitCheck(self): 
    for wall in walls: 
     if self.rect.colliderect(wall.rect): 
      return True 

Однако, функция никогда не возвращает True, независимо от фактического столкновения. Я могу перемещать плейер игрока без отсечения через стены, устанавливая значение сталкивающейся стороны игрока на значение противоположной стороны стены, но это не дает результата.

Почему функция не возвращает True при столкновении?

стены первоначально объявлены как пустой список. Он используется в функции движения, которая является частью класса игрока, как, например:

def move_single_axis(self, dx, dy): 
    # Move the rect 
    self.rect.x += dx 
    self.rect.y += dy 

    for wall in walls: 
     if self.rect.colliderect(wall.rect): 
      if dx > 0: # Moving right; Hit the left side of the wall 
       self.rect.right = wall.rect.left 
      if dx < 0: # Moving left; Hit the right side of the wall 
       self.rect.left = wall.rect.right 
      if dy > 0: # Moving down; Hit the top side of the wall 
       self.rect.bottom = wall.rect.top 
      if dy < 0: # Moving up; Hit the bottom side of the wall 
       self.rect.top = wall.rect.bottom 

Это работает без проблем, поэтому я возникаю проблемы с пониманием, почему hitCheck() не может обнаружить коллизию.

+0

В hitCheck, откуда нет возврата False как последнее утверждение? –

+0

Я удалил его ради вопроса, так как мне только интересно выяснить, почему hitCheck не вернет True. – Efonias

+0

Для записи вы подтвердили, что ваши стены действительно добавлены в список стен и что в коде инициализации нет какой-либо ошибки? – Dolda2000

ответ

1

Разобрался вопрос. Функция движения автоматически предотвращает столкновение, поэтому она никогда не обнаруживалась. Обнуление этого с помощью var turn True, когда self.rect.bottom был установлен на wall.rect.top.

1

Где вы объявляете стены? Это глобальная переменная? Поскольку стены также часть спрайтов, вы могли бы использовать spritecollide вместо colliderect:

def hitCheck(self): 
    if pygame.sprite.spritecollide(self, self.walls): 
     return True 
+0

Добавил дополнительную дополнительную информацию OP относительно этого. Я не определил группу спрайтов, поэтому spritecollide, похоже, не работает. – Efonias

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