Я пытаюсь создать рабочую систему прыжков в 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() не может обнаружить коллизию.
В hitCheck, откуда нет возврата False как последнее утверждение? –
Я удалил его ради вопроса, так как мне только интересно выяснить, почему hitCheck не вернет True. – Efonias
Для записи вы подтвердили, что ваши стены действительно добавлены в список стен и что в коде инициализации нет какой-либо ошибки? – Dolda2000