Как сделать так, чтобы спрайт, дважды мигающий, имел два отдельных блока столкновений в Pygame?

Я не знаю, был ли мой заголовок очень ясным, поэтому я попытаюсь объяснить это более четко здесь. Итак, у меня есть спрайт в Pygame с именем spikes. Я хочу, чтобы их было больше одного spikes, поэтому я blit создаю второй. Проблема в том, что мой ящик spike_collision работает только с первым, который я скопировал, а не со вторым. Кроме того, что мне нужно создать второй блок столкновений, как я могу сделать так, чтобы второй spikes тоже имел свой собственный блок столкновений?

Вот код blit:

        screen.blit(spikes, (spike_x, 500 - player_y + 476))
        screen.blit(spikes, (spike_x + 200, 500 - player_y + 476))

Вот код коллизии:

spike_collision = spikes.get_rect(topleft=(spike_x, 500 - player_y + 476))

Спасибо.


person Duck Duck    schedule 01.12.2020    source источник
comment
Почему бы просто не сделать два спрайта?   -  person Karl Knechtel    schedule 02.12.2020
comment
да, я могу это сделать, но... я хочу сократить код. У меня уже довольно много кода, но он почти ничего не делает.   -  person Duck Duck    schedule 02.12.2020


Ответы (1)


Я предполагаю, что когда вы пишете спрайт, вы имеете в виду растровый спрайт, а не pygame.sprite.Sprite.

Вероятно, лучше всего поддерживать спрайт в виде растрового изображения и прямоугольника, а затем всегда рисовать спрайт в его прямоугольнике, корректируя прямоугольник для изменения положения спрайта и используя его для любых коллизий.

Это можно легко сделать с помощью пар списков:

spike_image = pygame.image.load('spikes.png').convert_alpha()
spike_rect  = spike_image.get_rect( )
spikes_a = [ spike_image, spike_rect( top_left=( 100, 100 ) )
spikes_b = [ spike_image, spike_rect( top_left=( 200, 200 ) )

# ...

screen.blit( spikes_a[0], spikes_a[1] )
screen.blit( spikes_b[0], spikes_b[1] )
# etc.

if ( spikes_a[1].colliderect( player_rect ) ):
    print( "ouch!" )

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

class Spike( pygame.sprite.Sprite ):
    def __init__( self, position=( 0, 0 ) ):
        self.image = pygame.image.load('spikes.png').convert_alpha()
        self.rect  = self.image.get_rect( top_left = position )

    def moveTo( self, position ):
        self.rect  = self.image.get_rect( top_left = position )

    def moveBy( self, dx, dy ):
        self.rect.move_ip( dx, dy )


spike_a = Spike( ( 100, 100 ) )
spike_b = Spike( ( 200, 200 ) )

spike_a.draw( window )  # get this for free

Существует множество полезных функций групп и столкновений, связанных с использованием объектов Sprite, их стоит прочитать: https://www.pygame.org/docs/ref/sprite.html

person Kingsley    schedule 02.12.2020