столкновение с пигамным спрайтом с элементами фона - PullRequest
1 голос
/ 10 апреля 2020

Я искал несколько дней, чтобы найти решение, но любой другой поток мог бы помочь мне.

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

Мне нужно определить, когда спрайт сталкивается с другой непрозрачной частью фонового изображения. Я попробовал идеальный метод столкновения, но я не думаю, что это правильное решение для моего случая, потому что background.rect не имеет никакого смысла. Я также попробовал метод перекрытия, но он всегда возвращает true.

Изображения имеют глубину 32 бита, и я звоню convert_alpha()

class sprites(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.x = 200   
        self.y = 300
        self.img= player_sprite
        self.rect = player_sprite.get_rect()
        self.mask = pygame.mask.from_surface(player_sprite)


    def position(self):

        dx = mouse_x-self.x
        dy = self.y-mouse_y
        d = float((dx**2+dy**2)**0.5)

        displ_x = dx/d
        displ_y = dy/d
        self.x += displ_x
        self.y += displ_y

        if  type(self.mask.overlap(object_background.mask,(0,0))):  
            self.x -= displ_x
            self.y -= displ_y


class object_background_class(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.img = object_background_img
        self.rect = object_background_img.get_rect()
        self.mask = pygame.mask.from_surface(object_background_img.convert_alpha())

object_background = object_background_class()
player = sprites()


player.position() changes each time the coordinates of the sprite accordind to the mouse(x,y) and check if with the new x,y of the player make it collides with the background

game_state = False

while not game_state:

    for e in pygame.event.get():
        if e == pygame.QUIT:
            game_state = True
        if e.type == pygame.KEYDOWN and e.type == pygame.K_ESCAPE:
            game_state = True
        if e.type == pygame.KEYDOWN:
            if e.key == 27:
                game_state = True

    mouse_x, mouse_y = pygame.mouse.get_pos()

    player.position()

    DISPLAYSURFACE.blit(color_background, (0, 0))
    DISPLAYSURFACE.blit(player.img, (player.x, player.y))
    DISPLAYSURFACE.blit(object_background.img, (0, 0))


    pygame.display.flip()

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Я также пробовал метод перекрытия, но он всегда возвращает true.

Конечно. pygame.sprite.collide_mask() используйте атрибут .rect и .mask объекта спрайта для обнаружения столкновения.
Вам необходимо обновить self.rect после перемещения игрока и изменения self.x и self.y атрибут игрока:

class sprites(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.x = 200   
        self.y = 300
        self.img= player_sprite
        self.rect = player_sprite.get_rect()
        self.mask = pygame.mask.from_surface(player_sprite)

    def position(self):

        dx = mouse_x-self.x
        dy = self.y-mouse_y
        d = float((dx**2+dy**2)**0.5)

        displ_x = dx/d
        displ_y = dy/d
        self.x += displ_x
        self.y += displ_y

        if  type(self.mask.overlap(object_background.mask,(0,0))):  
            self.x -= displ_x
            self.y -= displ_y

        self.rect.topleft = (round(self.x), round(self.y)) # <--- THIS IS MISSING

Теперь вы можете использовать collide_mask:

if pygame.sprite.collide_mask(player, object_background):
    # [...]
0 голосов
/ 10 апреля 2020

Экран игры - это одна большая координатная плоскость, просто скажите, если x, y координаты игрока go выше или ниже какого-либо x, y координатного порога, чем сделать что-то

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...