pygame(python) Коллизия
Есть "player"(спрайт) и группа стен(other_group), тоже спрайты. При создании стены с НЕ одинаковыми координатами по x/y, не коректно отрабатывает метод sprite.spritecollide. конкретнее по горизонтали все окей, по вертикали player просто проваливается в стену. пытался переписать с другими методами, результат все тот же.

# class стены
class Tile(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__(other_group)
self.image = wall_images
self.rect = self.image.get_rect().move(x, y)
class Player(pygame.sprite.Sprite):
def __init__(self, speed, x, y):
super().__init__(player_group)
self.speed = speed
self.frames = []
self.cur_frame = 0
self.image = animation_down[0]
self.rect = self.image.get_rect().move(x, y)
def dorabotat_possibility_move(self, directory_of_movement):
if directory_of_movement == 'right':
tester = Player(self.speed, self.rect[0] + self.speed, self.rect[1])
elif directory_of_movement == 'left':
tester = Player(self.speed, self.rect[0] - self.speed, self.rect[1])
elif directory_of_movement == 'up':
tester = Player(self.speed, self.rect[1] - self.speed, self.rect[0])
else:
tester = Player(self.speed, self.rect[1] + self.speed, self.rect[0])
if pygame.sprite.spritecollide(tester, other_group, dokill=False, collided=pygame.sprite.collide_rect_ratio(0.7)):
print('collision')
tester.kill()
return False
else:
return True
#...
player = Player(SPEED, pos_x, pos_y)
tile2 = Tile(264, 264)
tile3 = Tile(264+64, 264)
#...
running = True
while running:
screen.fill('black')
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and pos_x > 5 and player.dorabotat_possibility_move('left'):
pos_x -= player.speed
left = True
right = down = up =Fals
elif keys[pygame.K_RIGHT] and pos_x < WIDHT and player.dorabotat_possibility_move('right'):
pos_x += player.speed
left = down = up = False
right = True
elif keys[pygame.K_UP] and pos_y > 5 and player.dorabotat_possibility_move('up'):
pos_y -= player.speed
up = True
right = left = down = False
elif keys[pygame.K_DOWN] and pos_y < HEIGHT and player.dorabotat_possibility_move('down'):
pos_y += player.speed
left = right = up = False
down = True
else:
left = up = down = right = False
frame = 0
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
clock.tick(FPS)
other_group.draw(screen)
other_group.update()
player.draw_player()
pygame.display.update()
full code - https://github.com/ariewhite/Socoban/blob/master/Socoban.py
Ответы (1 шт):
Автор решения: Arie White
→ Ссылка
не правильно задаются аргументы для tester`a в строке
tester = Player(self.speed, self.rect[1] - self.speed, self.rect[0])
должно быть
tester = Player(self.speed, self.rect[0], self.rect[1] - self.speed)
аналогично для else
ответ взят из stackoverflow